【问题标题】:indexing and more complex approach索引和更复杂的方法
【发布时间】:2014-04-26 08:23:36
【问题描述】:

对于我的学校,我必须创建一个应该索引字符串的程序。 我编写了基本的简单方法,它正在工作,但我对更有效的方法来解决这个问题感兴趣。 编辑:我应该索引字符串、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

【问题讨论】:

  • 您能否提供更多关于您要解决的问题的详细信息,以及一些输入和输出示例?
  • 当然可以。我更新了我的帖子。
  • 你的Indexclass::Index()是做什么的?
  • 对于字符串,它是 Knuth–Morris–Pratt 算法。否则它使用完全幼稚的方法来索引要索引的序列。它返回一个 int 向量,其中包含序列中相应元素的位置。
  • 所以基本上你正在搜索确切的序列{"test", "this", "foo"}?

标签: c++ string algorithm indexing


【解决方案1】:

提示意味着,您可能想要使用某种排序容器,其中插入元素比在未排序容器中花费更多时间,但在搜索时时间是恒定的.由于您只插入每个元素一次,但搜索它大约 100 次,因此这种交易会得到回报。

但是我需要更多关于你已经拥有的信息,以便得出关于什么可以加速你的代码的结论。

【讨论】:

  • 谢谢。我不明白你关于排序容器的回答。我更新了我的帖子。
【解决方案2】:

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

【讨论】:

  • 如何对输入数据进行排序?它使用二进制搜索吗?但是如果我们想要的序列不止一次出现呢?
  • 您可以使用任何您想要的排序算法对数据进行排序。 C++ 提供了一个高效的实现,如 std::sort。相等元素的顺序将是随机的,但这对于搜索无关紧要。事实上,我会删除重复项。二进制搜索是我在回答中描述的算法,但它不是排序算法。 C++ 提供了一个实现 std::binary_search 来检查一个排序范围是否包含一个元素,并提供一个 std::lower_bound 来实际获取该元素的迭代器(如果它存在)。
【解决方案3】:

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

如果您想多次搜索某个内容,您正在寻找类似 HashMap 的结构。 但是,当涉及到字符串并且您想对其进行索引时,您也可以查看尝试。

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

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

从您问题中的提示来看,您似乎想要搜索子序列。例如,您想找到其中包含“ake”字样的单词。这可以返回前杰克,布莱克但不是。如果您想使用它,您可以使用后缀树。 http://en.wikipedia.org/wiki/Suffix_tree

如果您不理解 wiki 链接中的描述,有几个 youtube 视频可以很好地为初学者解释后缀树的用法。

既然是你的功课,我会让你决定你想如何实现它

【讨论】:

    猜你喜欢
    • 2021-07-09
    • 1970-01-01
    • 2013-12-18
    • 2013-02-14
    • 2020-10-23
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 2019-01-21
    相关资源
    最近更新 更多