我需要对一组项目进行一些查找操作.
首先,我需要看看是否有直接匹配.这很简单,因为我有一个条目Dictionary<String,MyObjectType>,所以我可以去dictionary["valuetofind"].
但是如果没有直接匹配,那么我需要进行一个start-with匹配,但它必须是返回的最长匹配:
记录示例:
String Record
0 A
01 B
012 D
02 B
03 C
Run Code Online (Sandbox Code Playgroud)
查询示例:
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
Run Code Online (Sandbox Code Playgroud)
框架中是否有类在后台实现中具有哈希或树结构来执行此类操作,或者我是否需要自己编写某些内容?
编辑 到目前为止我所拥有的是按照模式字符串的长度排序的列表,然后我逐个查看条目以查看查询是否以记录开头.这适用于大多数情况,因为我们没有大型列表(但是),但在没有匹配的情况下确实有昂贵的成本.
我缺乏词汇来让google给我一些与哈希集,列表和词典无关的页面.我发现的所有研究都指向基于树的结构,但没有人指出.NET Framework中是否已有实现.
Leppie和Spender是正确的; 如果数据集变大,你想要有效地解决这个问题的数据结构是一个"trie",或者,如果你真的是buff,那就是一个DAWG - 一个有向的非循环字图.如果字符串有许多常见的后缀但是它们更昂贵且难以构建和更新,那么DAWG具有更好的内存性能,所以从trie开始.
你的简单案例会产生一个看起来像这样的特里:
ROOT
|
0|
|
A
/ | \
/ | \
1/ 2| 3\
/ | \
/ | \
B B C
|
2|
|
D
Run Code Online (Sandbox Code Playgroud)
所以要查找023456,你从根开始,按下标记为0的分支找到A,然后沿着分支2找到B,那时没有分支3,所以你已经完成了.
顺便说一句,这也是你用来找到字典和一组字母的最长Scrabble字的数据结构; 这基本上是同样的问题.
.NET框架中没有内置的trie数据结构,但构建起来并不困难.我有一个不可改变的特里在我身边的某个地方,我一直想写博客; 如果我这样做,我会在这里发布一个链接.
| 归档时间: |
|
| 查看次数: |
1588 次 |
| 最近记录: |