【发布时间】:2012-02-18 05:03:01
【问题描述】:
我有一个数据结构,它由成对的值组成,第一个是整数,第二个是字母数字字符串(可能以数字开头):
+--------+-----------------+
| Number | Name |
+--------+-----------------+
| 15 | APPLES |
| 16 | APPLE COMPUTER |
| 17 | ORANGE |
| 21 | TWENTY-1 |
| 291 | 156TH ELEMENT |
+--------+-----------------+
这些表格最多可包含 100,000 行。
我想提供一个查找功能,用户可以在其中查找数字(好像它是一个字符串)或字符串的片段。理想情况下,查找将在用户键入时“实时”进行;在每次击键后(或者可能在短暂的延迟 ~250-500 毫秒后),将进行新的搜索以找到最有可能的候选人。所以,例如搜索
-
1将返回15 APPLES、16 APPLE COMPUTER、17 ORANGE和291 156TH ELEMENT -
15将搜索范围缩小到15 APPLES、291 156TH ELEMENT -
AP将返回15 APPLES和16 APPLE COMPUTER - (理想情况下,但不是必需的)
ELEM将返回291 156TH ELEMENT。
我正在考虑使用两个Dictionary<string, string>s,因为最终将ints 与strings 进行比较——一个将按整数部分索引,另一个按字符串部分索引。
但真正按子字符串搜索不应该使用散列函数,而且使用我认为应该需要的两倍内存似乎很浪费。
最终的问题是,是否有任何性能良好的方法可以同时对两个大列表进行文本搜索以查找子字符串?
如果做不到这一点,SortedDictionary 怎么样?可能会提高性能,但仍然无法解决哈希问题。
考虑过动态创建一个正则表达式,但我认为这会非常糟糕。
我是 C# 新手(来自 Java 世界),所以我还没有研究过 LINQ;这就是答案吗?
编辑 18:21 EST:“名称”字段中的所有字符串都不会超过 12-15 个字符,如果这会影响您的潜在解决方案。
【问题讨论】:
-
我认为稍微修改一下Knuth–Morris–Pratt algorithm 的实现会很有用。
-
当您说“高效”时,您的意思是“快速”还是内存最少?通常在这些情况下,您可以用速度换取内存,或者在两者之间找到一些可接受的平衡点。 100k 字符串也是相当静态的,这意味着营业额很少而且会被反复搜索?
-
@EBarr:内存不是一个大问题,但我不想浪费。速度在这里更重要。
-
那么如果用户输入“comp”,你希望显示“16 APPLE COMPUTER”吗?如果匹配可以在这样的字符串内,则该方法将与您只想匹配表中值的开头的方法完全不同。
-
+1 表示(不常见)正确使用“comprise”
标签: c# .net search dictionary substring