如何使用字符串列表进行查找?

时间:2011-02-28 01:39:54

标签: c# data-structures

我有一个字符串列表(一个List<String>),可以有1到6个条目。我希望能够做的是使用该字符串列表进行查找,但我希望可能的查找能够使用这些字符串中的2个或更多的任意组合来进行查找。我目前正在使用Dictionary<List<String>, String>

离。 假设我的列表中包含以下内容:“fire”,“aero”,“thunder”,“water”,“blizzard”,我的词典中包含以下条目:

List<String>(){"fire", "aero"}, "searing wind"
List<String>(){"fire", "aero", "thunder"} "firestorm"
List<String>(){"aero", "thunder"}, "storm"
List<String>(){"aero", "water", "blizzard"}, "snowstorm"
List<String>(){"aerora", "blizzara"}, "hailstorm"

我希望查找返回前4个条目,因为我的基本列表包含查找它们所需的所有值。我还需要能够知道用于执行查找的值,因为稍后需要从基本列表中清除这些值。字典中的条目数可能是~400

我可以想到一种详尽的方法来进行这种查找,但是因为在执行查找时订单会变得很重要,所以需要花时间来完成所有排列并查找它们。我可以在字典键列表中强制执行字母顺序,如果这样做有帮助的话。有没有人知道更好的方法来做到这一点,或者可能是一种不同的,更有效的方法来做到这一点?我已经在这个程序中使用了sqlite来处理其他一些东西,所以如果这样可以让我更快地查找,我可以使用它。

由于

1 个答案:

答案 0 :(得分:1)

您可能想要探索的一个选项是使用decision tree。这个想法就是这样的。选择一些任意字符串,然后将所有集合拆分为两组 - 包含该字符串的组和不包含该字符串的组。然后,在两个组上递归重复此过程,并根据您做出的所有决策构建树。例如,让我们为您的符号引入一个简写:

A = Aero

R = Aerora

F = Fire

T =迅雷

W =水

B =暴雪

然后你可以像这样构建一棵树:

start -->   A?  -- NO --> R? -- YES --> B? -- YES --> "hailstorm"
             |
             +--- YES --> F? -- YES --> T? -- YES --> "firestorm"
                          |             |
                          |             +----- NO --> "searing wind"
                          |
                          +----- NO --> T? -- YES --> "storm"
                                        |
                                        +----- B? -- YES --> "snowstorm"

一旦有了这样的树,就可以将属性存储为一组字符串,然后按如下方式查找所有匹配项。从树的根开始,查看给定节点指示的字符串。如果该字符串包含在您的字符串集中,则递归地继续沿YES分支查找树的该部分中的所有匹配项。然后,无论你是否向下看那个分支,都要探索NO分支以获得所有其他符合你查询的字符串。

这种方法的优点在于,假设您将少量字符串作为关键字,树的深度可以非常小 - 对于k个关键字最多为O(k) - 因此在最佳情况下,您的搜索将花费O(k)时间。在最坏的情况下,您只需要探索整个树,这需要花费时间O(n)。此外,使用机器学习技术,可以构建一个非常好的树结构,在结构大小和查找速度之间进行可靠的权衡。

希望这有帮助!