【问题标题】:Effective approach on fast look up of unique words in C#C#中快速查找唯一词的有效方法
【发布时间】:2014-08-31 10:32:48
【问题描述】:

我有以下问题。我必须在内存中存储多种语言的唯一单词列表,当然,当我添加新单词时,我必须检查新单词是否已经存在。

当然,这需要非常快,主要是因为字数庞大。

我正在考虑实现Suffix Tree,但我想知道是否有更简单的方法来处理一些已经实现的内部结构。

附:字数≈107.

【问题讨论】:

  • 如果不需要找suffix,trie就够了,不需要suffix tree。此外,HashSet 可以以更少的工作量为您提供相当好的性能,在实现更复杂的东西之前进行基准测试并查看它是否足以满足您的需求。 (但要确保这是可修改的,所以如果你在几个月后发现哈希集还不够——你可以在不重写整个项目的情况下切换它)
  • 从长远来看,检查具有 10^7 个项目的 HashSet 是否包含某个单词平均需要大约 250ns (插入大约 300ns,所以或多或少相同),在我i7 笔记本电脑。这意味着您可以在单个线程上每秒执行 400 万次此类操作。
  • 我最终使用了字典。它是围绕 HashSet 实现的,所以性能很好(几乎和 HashSet 一样)。

标签: c# algorithm unique words suffix-tree


【解决方案1】:

首先,请注意后缀树在这里可能有点过头了,因为它们允许快速搜索任何单词的任何后缀,这可能比您要查找的内容有点多。 trie 是一个非常相似的 DS,它也允许快速搜索单词,但由于它不支持快速搜索任何后缀 - 它的创建更简单(无论是程序还是效率)。

另一个更简单的替代方法是使用简单的哈希表,它在 C# 中实现为 HashSet。虽然理论上 HashSet 在最坏的情况下会更慢 - 每次查找的平均情况需要恒定的时间,这对于您的应用程序来说可能已经足够了。

我的建议是:

  1. 首先尝试使用 HashSet,它在实现、基准测试和检查它是否足够时所需的工作量要少得多。
  2. 确保您的 DS 是可修改的,因此如果您以后决定更换它,您可以毫不费力地进行切换。这通常通过引入一个负责添加和查找单词的interface 来完成,如果您需要更改它 - 只需为接口引入不同的实现即可。
  3. 如果您决定添加后缀树或 trie - 使用社区资源,无需重新发明轮子 - 已经有人实现了这些数据结构中的大部分,并且可以在线获得。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    相关资源
    最近更新 更多