索引和更复杂的方法
indexing and more complex approach
对于我的学校,我必须创建一个程序来索引字符串。我编程了一种基本的天真方法,这种方法正在发挥作用,但我对解决这个问题的更有效的方法感兴趣。编辑:我应该索引字符串,类型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视频可以很好地解释后缀树的用法。
既然这是你的家庭作业,我会让你决定如何实现它
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- 在给定程序中降低矢量数组实现堆栈的时间复杂度有哪些不同的可能方法?
- C++复杂类型的单一方法的模板专用化
- 有没有一种优雅的方法可以将矢量<复杂<float>>转换为矢量<short>?
- 找到复杂根的最快方法
- 简单的方法将隐式类型促销添加到std ::复杂类操作员
- 简化复杂的方法
- 有没有什么方法可以降低时间复杂度来找到这个矩阵的幂n
- JNI——可以将复杂类型作为本机方法参数传递
- googlemock - 模拟返回复杂数据类型的方法
- 使用 opencv 和 c++ 找到与复杂形状最接近的匹配的最佳方法是什么?
- 有没有一种更简单的方法可以像在java中使用包一样在C++中重用代码?制作头文件比较复杂
- 在一个非常复杂的程序中,替换系统的最佳方法是什么
- 在C++中保存复杂对象的方法
- 计算复杂数组的abs()值的最快方法
- 尝试调用 Dll,但该方法具有复杂的结构类型,我无法在 .Net 中定义它
- 冗长、复杂的模板成员方法会影响性能
- CMakelists.txt要在windows和mac上工作是非常复杂的,有更好的方法吗?
- 索引和更复杂的方法
- 我们是否可以在不同的类中分离主序列化方法,以便使用c++的boost库使其更容易和不那么复杂?