【发布时间】:2011-12-01 01:05:07
【问题描述】:
我需要对一组项目进行一些查找操作。
首先我需要看看是否有直接匹配。这很简单,因为我在 Dictionary<String,MyObjectType> 中有条目,所以我可以转到 dictionary["valuetofind"]。
如果没有直接匹配,那么我需要做一个开始匹配,但它必须是返回的最长匹配:
记录示例:
String Record
0 A
01 B
012 D
02 B
03 C
查询示例:
Query Result
0 A - Because 0 is the longest match
01 B - Because 01 is the longest match
023456 B - Because 02 is the longest match
012 D - Because 012 is the longest match
0123456 D - Because 012 is the longest match
03456 C - Because 03 is the longest match
04 A - Because 0 is the longest match
0456 A - Because 0 is the longest match
1 Null - No Match
框架中是否有在后台实现具有哈希或树结构的类来执行此类操作,还是我需要自己编写一些东西?
编辑 到目前为止,我所拥有的是按模式字符串长度排序的列表,然后我一一检查条目以查看查询是否以记录开头。这适用于大多数情况,因为我们(还)没有大列表,但对于没有匹配的情况确实有昂贵的成本。
我缺乏让谷歌给我与哈希集、列表和字典无关的页面的词汇。我发现的所有研究都指向基于树的结构,但没有人指出 .NET Framework 中是否已经实现。
【问题讨论】:
-
下面的字典方法很可能是
O(n^2 logn)。 trie 可能会起作用,而且只会是O(n logn)。 -
在您有一个非常大的搜索集的情况下,类似 Trie 的结构将是解决此问题的最快方法。 en.wikipedia.org/wiki/Trie
-
@leppie:在您的订单近似值中,对数项来自哪里?一个构建良好的 trie 可以在 O(m) 时间内搜索到长度为 m 的字符串; trie 中的节点数不是一个因素。
-
@EricLippert:你是对的。不知道我在想什么;p 我知道第一个只是一个大拇指的猜测(错误地基于 'contains' 而不是 'startswith')。
标签: c# collections