timshi
2011-07-31 00:56:08 +08:00
不知道是不是我没理解清楚,“菜篮子算法“里开始提的两种算法其实没有区别?要得到第二种算法里得矩阵,是否需要经过和第一种算法一样得过程?还是用了其他得办法?按文章里描述的,这两个算法应该都是 o(m*n)(假设每行的单词数不变,m 为行数, n 为给出的字符串的长度)。 我觉的如果用 hash table 取代你的矩阵可能有更好的结果。
1。 把每行字拆成单词。
2。 用单词作为插入hash table的key, 用行数作为hash table的value,把每行的单词插入hash table,得到类似下面的例子
dell: 1, 3, 4, 5, 7
windows: 2, 4, 7, 10
xp: 4,7,11
在这个例子里,“dell”出现在第1,3,4,5,7行,"windows"在2,4,7,10行。
3。在给出一个字符串的情况下,用字符串里的单词为key,去找hashtable所对应的value。比如找 {dell,xp}, 得出{1,3,4,5,7}和 {4,7,11}两个array。两个数列如果有重叠的部分就说明所要找的字符串存在。
用这个算法,1,2两个步骤是O(m+n), 第3个步骤里,hash table查找数据平均是O(1). 寻找array的重叠部分可以先排序,然后同时step over两个list,应该是O(n*log(n)) + O(n),这里的n指array的长度,n应该相对已经比较小了。另外在查多个单词的时候这里还可以有一些优化。比如从array长度最小的两个array开始比较,如果得出的集合为空,那么就可以停止运算。