Eas*_*der 5 .net c# linq algorithm
我正在寻找从一组字符开始查找集合中所有字符串的最快方法.我可以使用排序集合,但是我找不到在.net中执行此操作的便捷方法.基本上我需要在符合条件的集合中找到低和高索引.
列表<T>上的二进制搜索不保证返回的索引是第一个元素的索引,因此需要上下迭代以查找所有匹配的字符串,如果有一个大的列表则不会很快.
还有Linq方法(并行),但我不确定哪种数据结构会提供最好的结果.
列表示例,~10M记录:
aaaaaaaaaaaaaaabb
aaaaaaaaaaaaaaba
aaaaaaaaaaaaabc
...
zzzzzzzzzzzzzxx
zzzzzzzzzzzzzyzzz
zzzzzzzzzzzzzzzzzza
Run Code Online (Sandbox Code Playgroud)
从以下字符开始搜索字符串:skk ...
结果:记录从x到y的索引.
更新:字符串可以具有不同的长度并且是唯一的.
就时间复杂度而言 - 你应该使用trie,而不是排序集或二分搜索。
Trie 会给你一个O(|S|)时间复杂度[而排序集和二分搜索会让你O(|S|logn)]找到节点[让它成为v]。
trie 中符合前缀的所有字符串 [paths] 将通过v. 通过增加numberOfLeaves字段,您可以准确地查出该节点有多少个叶子[=strings]。
在一次传递中 - 您还可以找到此v[对于u从根到的路径中的每个节点v-numberOfLeaves剩余的每个同级的总和u]。
与使用现有结构相比,这需要做更多的工作,但如果数据很大 - 它可以使您的算法更快,因此如果性能是一个问题并且您期望有大量字符串,您应该考虑它。