我可能正在考虑这个错误,但这里有。
计算机开始在线性行中吐出 11111111111111111111 和 999999999999999999999 之间的无数随机数:
- 有时计算机会在一行的一端添加一个数字。
- 有时计算机会在线路的另一端添加一个数字。
- 每个数字都有一个之前出现或将要出现的数字。
- 每个数字都有一个后面出现或将要出现的数字。
- 并非所有数字都是唯一的,许多数字(但不是大多数数字)是重复的。
- 计算机永远不会停止吐出数字。
当我记录所有这些数字时,我需要能够在任何给定时间做出有根据的猜测:
如果这是我第二次看到一个数字,我必须知道上次排在它前面的数字是什么。
如果它出现了两次以上,我必须知道它前面的数字的概率/频率。
如果这是我第二次看到一个数字,我一定也知道上次排在它后面的是什么数字。
如果它出现了两次以上,我必须知道它后面出现的数字的概率/频率。
我到底如何在 MySQL 数据库中构建表来存储所有这些数字?我使用哪个引擎,为什么?如何制定我的查询?我需要快速知道,但容量也很重要,因为什么时候才能停止吐出它们?
我的拙劣计划:
2 表:
1. Unique ID/#
2. #/ID/#
我的想法:
唯一 ID 几乎总是比数字短=更快的匹配。数字重复 = 更少的 ID 行 = 最初的匹配速度更快。
Select * in table2 where id=(select id in table1 where #=?)
或者:
3 表:
1. Unique ID/#
2. #/ID
3. ID/#
我的想法:
如果我只需要左/前,或者只需要后/右,我会缩小第二个查询的大小。
SELECT # IN table2(or 3) WHERE id=(SELECT id IN table1 WHERE #=?)
或者
1 表:
1. #/#/#
想法:
更少的查询=更少的时间。
SELECT * IN table WHERE col2=#.
我迷路了.... :(每个数字都有四个属性,一个是前面+频率,一个是后面+频率。
我这样想会更好吗?如果我在表中存储和增加频率,我会消除重复从而加快我的查询速度吗?我最初在想,如果我存储每一个事件,以编程方式计算频率会更快......
如此简单的数据,但我只是不知道数据库如何运行以知道哪个更有效。
根据最近的评论,我想添加一些关于实际问题的信息:我有一个不定长度的字符串。我正在尝试在此字符串中存储各种字符或字符块的马尔可夫链频率表。
给定字符串中的任何点,我需要知道下一个状态的概率和前一个状态的概率。
我正在预测用户输入,基于文本语料库和过去的用户输入。与我见过的其他应用程序相比,一个主要的区别是我在给定的时间走得更远,更多的状态,我需要频率数据来提供多种可能性。
我希望这能更清楚地说明情况。我不想深入了解问题的本质,因为过去我创建的问题不够具体,无法得到具体的答案。
这似乎可能好一点。我对这个解决方案的主要问题是:提供“密钥”(状态的前几个字符)会提高系统的速度吗?即查询state_key,然后只查询该查询的结果以获得完整状态?
Table 1:
name: state
col1:state_id - unique, auto incrementing
col2:state_key - the first X characters of the state
col3:state - fixed length string or state
Table 2:
name: occurence
col1:state_id_left - non unique key from table 1
col2:state_id_right - non unique key from table 1
col3:frequency - int, incremented every time the two states occur next to each other.
QUERY TO FIND PREVIOUS STATES:
SELECT * IN occurence WHERE state_id_right=(SELECT state_id IN state WHERE state_key=? AND state=?)
QUERY TO FIND NEXT STATES:
SELECT * IN occurence WHERE state_id_left=(SELECT state_id IN state WHERE state_key=? AND state=?)