c# - 哪些算法用于搜索单词中的子词?

标签 c# algorithm search word

我知道,也许这个问题很愚蠢,但我被困住了,我需要真正的帮助。我需要在我的项目中使用算法来找到所有以另一个开头的单词并返回所有单词的尾部。例如: 查找所有以 dad

开头的单词

在字典中我们有:

dada,dadaism,daddled,daddling

结果:

a, aism, dled, dling

我有包含所有单词的字典,所以我只需要算法。有人建议我使用 patricia 算法,但我找不到任何 C# 示例。我的字典很大,所以我需要找到也非常快的算法。


更多信息:

  • 字典排序。
  • 最佳答案

    如何进行这项工作将取决于您的词典是如何排列的。如果它是一个排序的单词列表,那么您可以使用二进制搜索找到以“dad”开头的第一个单词,然后循环使用 StartsWithSubstring .即:

    List<string> Words = LoadWords(); // however you load them
    Words.Sort();
    
    // Now, search for "dad" (or whatever)
    string prefix = "dad";
    
    int index = Words.BinarySearch(prefix);
    
    // If the returned index is negative, the word wasn't found.
    // The index is the one's compliment of the the place where it would be in the list.
    if (index < 0)
    {
        index = ~index;
    }
    
    for (int i = index; i < Count && Words[i].StartsWith(prefix))
    {
        Console.WriteLine(Words[i].Substring(prefix.Length));
    }
    

    这应该很快。排序是加载后的一次性成本。如果按排序顺序存储字典,则可以完全消除它。二进制搜索是 O(log n),其中 n 是字典中的单词数。

    如果您的字典是无序的,那么您将不得不遍历所有单词,这会花费很多时间。

    您的词典还有其他组织方式,这将大大减少它占用的空间,而且速度可能会更快。与创建排序列表相比,这些更复杂并且需要更多时间来构建。

    关于c# - 哪些算法用于搜索单词中的子词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8456542/

    相关文章:

    Cocoa - 在 TableView 上过滤数组 NSDictionary

    java - 批处理字符串包含操作优化?

    c# - Dynamic LINQ 中的内联列表

    c# - 在没有 QueryString 的情况下将数据传递到不同 Web 服务器上的 URL

    c# - ASP.Net MVC 身份模型中的子类未保存在数据库中

    c++ - 删除字符串算法中的重复项

    c# - 你如何对抗所有这些方式? -Javascript 及其数百万种不同的编写方式

    python - 在 python 中解决这个问题的大多数面向对象的方法?

    c++ - 找到 vector 中所有值之间的相似距离并将它们子集化

    java - 大O 方法的复杂性