【问题标题】:C++ Need to compare one string to 200.000 wordsC++ 需要将一个字符串与 200.000 个单词进行比较
【发布时间】:2010-02-28 19:11:39
【问题描述】:

在我的 C++ 程序中 ...

用户键入程序字符串“foo”。

我需要比较这个字符串和我的字符串,在txt文件中写:这个字符串是名词! (或形容词...)

我有几个 TXT 文件 - 一个带有名词的文件,第二个带有形容词的文件……但每个文件中大约有 200.000 个单词。

如何有效地将这个字符串“foo”与我文件中的字符串进行比较?

我需要使用什么?

【问题讨论】:

  • 这是作业吗?如果是,请标记它。
  • 不,这不是家庭作业,它的问题。
  • 真正的数据库怎么样?您提供的“规格”似乎很不完整,充其量是......
  • 请记住,一个词既可以是名词也可以是形容词。您将如何处理这种情况?

标签: c++ compare words


【解决方案1】:

为此使用TRIE 数据结构。您应该需要一些内存来构建数据结构。但你的目标将是最有效的。

【讨论】:

  • 谢谢,我会试试这个 1-st :)
  • OMG TRIE 很棒。可悲的是,如果对它施加足够的压力,我可能会重新发明它。
  • 我在 1996 年用 C 语言重新发明了它。速度差异让我大吃一惊(PC 是 486)。很酷。我相信它最初是在 60 年代后期写的。直到几年前我好奇之前,我才知道这是一个真正的结构。如果这是家庭作业,你会比内置功能给老师留下深刻的印象。如果这是工作,你的同事会取笑你浪费时间重新发明轮子!
【解决方案2】:

将您的话放入std::set<std::string> 容器中并进行查找。这为访问提供了 O(log n) 时间,这对于您正在做的事情可能已经足够了。

您也可以使用std::map<std::string, std::string>,其中键是单词,值是类(例如“名词”)。

【讨论】:

  • 您认为,在容器中阅读大约 200.000 x 2 个单词会很快吗?
  • 当您使用 c.find(key) 时,std::map 和 std::set 针对按键查找进行了高度优化(它们可能在内部使用例如红黑搜索树)。只需进行几次比较即可找到正确的节点。
  • 谢谢,我会试试这个 2-th :)
  • std::unordered_set 或 std::unordered_map 可能是更好的选择。将单词读入容器应该可以,无论您使用哪种标准容器,只要您不为每次搜索重新加载数据。 “完美”的数据结构取决于使用情况 - 特里树(又名数字树)是一种选择,三叉树稍慢但内存效率更高,但收益可能不足以证明开发时间是合理的。
  • 我想赞成这个答案,但因为最后一句话我不能。 map<string, WordCategory> 的内存效率会更高,WordCategory 是一个枚举。
【解决方案3】:

我建议您使用 sqlite 来代替您的文件。

您可以为每个键值创建一个 CRC,并将键和值 (int) 存储到表中。为关键字段创建索引。

当您想要进行查找时,您可以获取单词的 CRC,然后在表中进行查找。

【讨论】:

  • 每个单词的CRC创建是1-1吗?如果没有,键可能会发生冲突,不是吗?
  • @Bragaadees 只需 200,000 把钥匙,您就有更好的机会赢得彩票。如果你愿意,你甚至可以使用 crc-8。如果 2 匹配,您可以选择全部并进行字符串比较,但 2 可能永远不会匹配。
  • 坏主意。使用 CRC-32,生日冲突可能发生在 2^16 = 65536 个键上。使用 200.000 个键,几乎可以保证发生冲突。是的,任何一对发生冲突的几率只有 40 亿分之一,但有 40.000.000.000 个密钥对。
【解决方案4】:

Radix tree 将为字符串提供比“常规”特里更好的内存使用率,如果您有很多具有共同根/前缀的字符串(字典可能就是这种情况,即具有多种形式的单词 - 尽管那可能取决于语言)。

【讨论】:

    【解决方案5】:

    你只需要确认它是否匹配吗?

    如果是这样,请使用 Trie。

    【讨论】:

    • 我必须告诉用户,他的词是名词、形容词......或者程序不知道那个词是什么。
    • 然后使用两个Tries,一个用于名词,一个用于形容词。
    【解决方案6】:

    您可以将索引的外部文件存储为 btree 或链式哈希表,这将提供非常快速的查找时间和最小的查找数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      相关资源
      最近更新 更多