C# C语言中快速查找唯一词的有效方法#

C# C语言中快速查找唯一词的有效方法#,c#,algorithm,unique,words,suffix-tree,C#,Algorithm,Unique,Words,Suffix Tree,我有以下问题。我必须在内存中存储多种语言中的唯一单词列表,当然,当我添加新词时,我必须检查新词是否已经存在 当然,这需要非常快,主要是因为单词数量巨大 我正在考虑实施一个,但我想知道是否有一个更简单的方法来处理一些已经实施的内部结构 附:字数≈ 107.首先,请注意后缀树在这里可能有些过分,因为它们允许快速搜索任何单词的任何后缀,这可能比您要查找的有点太多。A是一个非常类似的DS,它也允许快速搜索一个单词,但因为它不支持快速搜索任何后缀-它的创建更简单(无论是编程还是效率) 另一个更简单的选择是

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

当然,这需要非常快,主要是因为单词数量巨大

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


附:字数≈ 107.

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

另一个更简单的选择是使用一个简单的哈希表,该哈希表在C#中作为一个函数实现。从理论上讲,哈希集在最坏的情况下速度较慢——每次查找的平均情况需要恒定的时间,对于您的应用程序来说,这可能就足够了

我的建议是:

  • 首先尝试使用哈希集,它需要更少的努力来实现,对它进行基准测试并检查它是否足够
  • 确保你的DS是可修改的,这样如果你以后决定切换的话,你就可以毫不费力地切换它。这通常是通过引入一个负责添加和查找单词的接口来实现的,如果需要更改,只需在接口中引入一个不同的实现即可
  • 如果您决定添加后缀树或trie-use社区资源,则无需重新发明轮子——有人已经实现了这些数据结构的大部分,并且可以在线获取

  • 如果您不需要查找后缀,trie就足够了,不需要后缀树。此外,HashSet可以以较少的工作量为您提供相当好的性能,在实现更复杂的东西之前,先进行基准测试,看看是否足够。(但请确保这是可修改的,因此如果您在几个月后发现哈希集是不够的-您可以在不重写整个项目的情况下切换它)将事情放到透视图中,在我的i7笔记本上检查包含10^7项的哈希集是否包含某个单词平均需要约250ns(插入约300ns,因此大致相同)。这意味着你可以在一个线程上每秒执行400万次这样的操作。我最终使用了一本字典。它是围绕哈希集实现的,因此性能很好(几乎与哈希集相同)。