索引和更复杂的方法

indexing and more complex approach

本文关键字:方法 复杂 索引      更新时间:2023-10-16

对于我的学校,我必须创建一个程序来索引字符串。我编程了一种基本的天真方法,这种方法正在发挥作用,但我对解决这个问题的更有效的方法感兴趣。编辑:我应该索引字符串,类型T的矢量和类型T的列表。

索引字符串:我使用一个专门的字符串模板。我开始使用Knuth–Morris–Pratt算法,它似乎提供了更好的结果。我看着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

提示的意思是,您可能希望使用某种排序的容器,在这种容器中插入元素比在未排序的容器中花费更多的时间,但在搜索时时间是恒定的。由于你只插入每个元素一次,但搜索了大约100次,所以这笔交易会有回报

但我需要更多关于您已经拥有的信息,以得出加快代码速度的结论。

对输入数据进行排序是通过交易预处理时间来加快搜索过程的一种方法。想想你是如何在电话簿中查找号码的。书中的名字按姓氏排列。当我寻找一个名字时,我从中间开始,然后看其中一个名字。现在,如果我名字的第一个字母比中间的名字大,我在右半部分的书上也这样做,如果它小,我在左半部分继续。在这本书的任何部分,我都会在中间选择一个名字,然后继续进行程序,直到找到这个名字。通过这样做,您可以在每一步中省略本书当前部分的一半。

我不太擅长C++,所以我给你一个算法。

如果您想多次搜索某个内容,那么您正在寻找类似HashMap的结构。但是,当涉及到Strings并且您想要对它们进行索引时,您也可以查看trys。

http://en.wikipedia.org/wiki/Trie

您可以使用这种结构来创建字符串字典,它们支持O(1)查找,也支持高效的空间使用。它们还支持前缀匹配。例如,您可以输入单词JA,并查找任何以JA 开头的名称

从你问题中的提示来看,你似乎想搜索子序列。对于前任,你想找到单词中有"ake"的单词。这可以为前杰克、布莱克带来回报,但不能。如果你想使用这个,你可以使用后缀树。http://en.wikipedia.org/wiki/Suffix_tree

如果你不理解维基链接中的描述,有几个youtube视频可以很好地解释后缀树的用法。

既然这是你的家庭作业,我会让你决定如何实现它