大量字符串的比较效率

yangyanli 2009-11-02 05:01:53
string[] s1 长度为 100 000
string[] s2 长度为 10 000

求 s2中有多少个元素在s1中存在 即 重复的数量

用最原始的两两比较 10 000 * 100 000 次,需要很时间

用什么手段可以达到效率最高?
...全文
506 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
卧_槽 2009-11-03
  • 打赏
  • 举报
回复
正则肯定是最快的。
viena 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 zxforben111 的回复:]
个人觉的先排序,然后用二分法可取。
用linq也不错。
[/Quote]
先不说后续工作怎样,排序本身就是个浩大工程了~
zxforben111 2009-11-03
  • 打赏
  • 举报
回复
个人觉的先排序,然后用二分法可取。
用linq也不错。
ViewStates 2009-11-03
  • 打赏
  • 举报
回复
此贴值得关注
viena 2009-11-03
  • 打赏
  • 举报
回复
同意一楼,用正则应该是最简便而同时又高效的方法了
s2用'|'串起来,在s1中遍历
viena 2009-11-03
  • 打赏
  • 举报
回复
测试要贴代码的,不然没有可信度~
yangyanli 2009-11-03
  • 打赏
  • 举报
回复
母串长:子串长 (单位ms)
算法 10000:10000 100000:1000 100000:10000 100000:100
string 2156 7093 68890 656
stringcollection 1687 6484 62656 609
Dictionary 2812 8765 96140 843

测试结果利用stringcollection 查找是最快的
KMP还没有研究透,暂不发测试结果
绿色夹克衫 2009-11-03
  • 打赏
  • 举报
回复
二分不是好办法,如果没有排序,二分是肯定不行的,如果有序的话,归并就可以了,不用二分。

用元素数量较小的集合做Dictionary,用较大的集合到Dictionary中验证ContainKey就可以,
不知道linq针对于这种并查的优化是怎么做的,感觉效率应该不会太高,但也说不准,
以前试过用linq的groupby做统计,效率比自己用Dictionary写的要高很多。

不了解StringCollection的原理,但感觉应该是集合,并且不包括hash,效率不应该比Dictionary高!
yangxxxxxx66 2009-11-03
  • 打赏
  • 举报
回复
用list<>效率最高,所用时间o(100000+10000)
trentliu 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 error_code 的回复:]
.....它自动就排序了
---------
你没有写排序代码不表示他没有进行排序操作
[/Quote]

//sortedList2.Add(Key, Value);
sortedList2.Add(str[i], str[i]);

foreach (object o in sortedList2.Values) Console.WriteLine(o.ToString());


不是不行,默认按键排序,变通一下就行 , 非按照值得重写 IComparable。
yangyanli 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 hdngo 的回复:]
try~

C# codeint[] numbersA= {0,2,4,5,6,8,9 };int[] numbersB= {1,3,5,7,8 };var pairs=from ain numbersAfrom bin numbersBwhere a== bselectnew { a, b };

Console.WriteLine("Pairs where a = b:");foreach (var pairin pairs)
{
Console.WriteLine("{0} = {1}", pair.a, pair.b);
}
[/Quote]

先升到2008 - -! 谢谢
laomeng520 2009-11-02
  • 打赏
  • 举报
回复
关注了
LutzMark 2009-11-02
  • 打赏
  • 举报
回复
我会选择集合类排序+二分法搜索...
HDNGO 2009-11-02
  • 打赏
  • 举报
回复
try~

            int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 };
int[] numbersB = { 1, 3, 5, 7, 8 };

var pairs =
from a in numbersA
from b in numbersB
where a == b
select new { a, b };

Console.WriteLine("Pairs where a = b:");
foreach (var pair in pairs)
{
Console.WriteLine("{0} = {1}", pair.a, pair.b);
}
yangyanli 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 momo400 的回复:]
引用 4 楼 error_code 的回复:
如果不是排好序的  查找结果肯定是错的
如果先排序  那还不如用原始方法
所以  二分法不可取


听你提醒.去查看一下.二分法确实需要排序.

对于字符串查找算法.最好的不过于'快速字符串搜索算法KMP"
算法也不难..

网上有一难C的.可以自己译成C#的
[/Quote]

谢谢指点,我学习下
MOmo400 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 error_code 的回复:]
如果不是排好序的  查找结果肯定是错的
如果先排序  那还不如用原始方法
所以  二分法不可取
[/Quote]

听你提醒.去查看一下.二分法确实需要排序.

对于字符串查找算法.最好的不过于'快速字符串搜索算法KMP"
算法也不难..

网上有一难C的.可以自己译成C#的
zhujinqiang 2009-11-02
  • 打赏
  • 举报
回复
进来关注下。
CqCoder 2009-11-02
  • 打赏
  • 举报
回复
up sortlist
yangyanli 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 vbman2003 的回复:]
用Dictionary
[/Quote]

测试的Dictionary效率不如StringCollection,但后者速度也不理想
Error_Code 2009-11-02
  • 打赏
  • 举报
回复
.....它自动就排序了
---------
你没有写排序代码不表示他没有进行排序操作
加载更多回复(7)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧