对于我的学校,我必须创建一个应该索引字符串的程序。 我编写了基本的天真方法,但我感兴趣的是更有效的方法来解决这个问题。 编辑:我应该索引字符串,类型为T的向量和类型为T的列表。
索引字符串: 我为字符串使用专门的模板。 我开始使用Knuth–Morris–Pratt algorithm,这似乎提供了更好的结果。我看了DAWG。
我的作业中也有一些暗示。
索引后,会多次搜索序列。因此,它 感觉花一些时间预处理序列,搜索可能 要快点每个实例调用大约100次。
我不明白如何使用这个建议。你觉得怎么样?
输入示例:
Indexclass<string> test ( "aaaaaaau aaauaaaau" );
vector<int> result = test . Index ( "aa" );
// 0 1 2 3 4 5 9 10 13 14 15
Indexclass <list<string>> test2 ( list<string>{ "hello", "world", "test", "this", "foo", "test", "this", "done" } );
vector<int> r23 = test2 . Index ( list<string>{"test", "this", "foo"} );
// 2
答案 0 :(得分:1)
提示意味着,你可能想要使用某种排序容器,其中元素的插入比未排序的容器花费更多的时间,但是当搜索时间是恒定的。由于您只插入一次元素,但是大约100次搜索,这笔交易将会得到回报。
但是我需要更多关于你已经拥有的信息,以便对可以加速你的代码的内容做出结论。
答案 1 :(得分:1)
对输入数据进行排序是通过交易预处理时间来加快搜索过程的一种方法。想想你如何在电话簿中搜索一个号码。书中的名字按姓氏排序。当我寻找一个名字时,我从中间开始看一个名字。现在,如果我的名字的第一个字母比中间的名字大,我在右半边的书上做同样的,如果它更小,我继续在左半边。在我继续的书的任何部分,我在中间选择一个名称并继续执行该程序,直到找到名称。通过这样做,您可以在每一步中省略本书当前部分的一半。
答案 2 :(得分:1)
我对C ++不太满意,所以我给你一个算法。
如果您想多次搜索某些内容,那么您正在寻找类似HashMap的结构。 但是,当谈到字符串并且您想要对它们编制索引时,您还可以查看尝试。
http://en.wikipedia.org/wiki/Trie
您可以使用此结构来创建字符串字典,它们支持O(1)查找以及有效的空间使用。它们还支持前缀匹配。例如,您可以输入单词JA并查找以JA
开头的任何名称根据您提问中的提示,您似乎想要搜索子序列。对于前者,您希望找到其中包含“ake”字样的单词。对于杰克,布莱克来说,这可以回归,但不是。如果您想使用它,您可以使用后缀树。 http://en.wikipedia.org/wiki/Suffix_tree
如果你不理解wiki链接中的描述,那么有几个youtube视频可以很好地解释后缀树的使用情况。
因为这是你的功课,我会让你决定如何实现它