首页 新闻 赞助 找找看

求一个高效的数组取交集的算法

-1
悬赏园豆:200 [待解决问题]

List<string[]> str1;

List<string[]> str2;

要求:求str1数组中每个string[0] 与str2中哪个string[0]相当

这两个数组里都是几万条的大量数据。。普通的循环效率太差。。根本就无法接受,请各位高人给个算法啊!!!最好贴上点原码。。谢谢了。。。。期待中

 

补充:楼下的哈希的做法应该是可以。。但要把值存入哈希。。。也是个不小的工啊。。。另外。。比对的是str1[x][0]与str2[x][0]。。。。请高手指教。。。请不要吝啬原码。。谢谢

鬼哭狼嚎的主页 鬼哭狼嚎 | 初学一级 | 园豆:0
提问于:2010-08-24 17:17
< >
分享
所有回答(11)
0

要求:求str1数组中每个string[0] 与str2中哪个string[0]相当?

什么意思呀《没看懂

jowo | 园豆:2834 (老鸟四级) | 2010-08-24 17:26
0

List<>有个方法,List.Contains 方法,仅供参考,

http://msdn.microsoft.com/zh-cn/library/bhkz42b3%28VS.80%29.aspx

邀月 | 园豆:25475 (高人七级) | 2010-08-24 17:27
0

这里主要的性能瓶颈在于 string.CompareOrdinal 的性能。

假设:

List<string[]> str1 = new List<string[]>();
str1.Add(new string[] {"1","2","3" });
str1.Add(new string[] {"1","2" });

List<string[]> str2 = new List<string[]>();
str2.Add(new string[] { "1", "2"});
str2.Add(new string[] { "1", "2","3" });
str2.Add(new string[] { "1", "2" ,"3","4"}); 

 



楼主,你是要找出:

str1[0] == str2[1] 

还是要找出:

str1[0][0] == str2[0][0] ?

Launcher | 园豆:45045 (高人七级) | 2010-08-24 17:29
0

其实我也没看懂啥意思。

Astar | 园豆:40805 (高人七级) | 2010-08-24 17:33
0

List.Contains() 这个方法采用的是 线性搜索,效率低,可以采用二分查找法。

HUHU慈悲 | 园豆:9973 (大侠五级) | 2010-08-24 17:35
0

有个问题,

 

List<string[]> str1;

List<string[]> str2;

你的List中放的是string[]数组还是string字符串

Hawkon | 园豆:225 (菜鸟二级) | 2010-08-24 17:39
0

百万 string 类型 进行比较,估计很难高效。

jeff-zheng | 园豆:480 (菜鸟二级) | 2010-08-24 17:58
0

1. 如果你的list 能排序的话,那就简单了,先对两个list 进行排序,两个list 进行比较。复杂度是:nlogn的复杂度。

2. 如果不能排序,list 能不能换成 dictionary ,这个的内部结构是hash 表。直接循环,然后判断某个key 是否在另外一个哈希表里面就好了,理论上来说,采用哈希表的复杂度是 n。

暮夏 | 园豆:391 (菜鸟二级) | 2010-08-24 18:45
百万级字符串 排序速度肯定快不了。数字到可以。
支持(0) 反对(0) jeff-zheng | 园豆:480 (菜鸟二级) | 2010-08-25 09:01
楼主可以试试我的方法,代码量也不大,具体速度可以测试。
支持(0) 反对(0) 暮夏 | 园豆:391 (菜鸟二级) | 2010-08-25 10:12
0

借用数据库的方法:

0。Nested Loop

就是你说的方法了。

1。Sort Merge Join

和楼上的方法差不多,两个序列都按从小到大排好序,然后按同一个方向扫描。

2。Hash Join

扫描较少的那个序列一次,将值放入Hash表的Key中,扫描一次另个序列,利用 Hash 查找的优势,很容易就能找到相同的值了。

killkill | 园豆:1192 (小虾三级) | 2010-08-24 20:14
0

几十W的数据?看着像是面试题一样。。。

顾晓北 | 园豆:10844 (专家六级) | 2010-12-08 11:45
0

楼上的办法都很棒,楼主完全可以拼接出高效的算法,但是在实际使用中的高效比算法本身更重要,比如楼主在题目中list<string[]>就是个很低效的做法,内存是有限的,不是说你能装的下数据就全放进去,在比较排序中关心的是str的特征不是str本身。如果是几十万数据,很难想象普通pc怎么跑你的运算才能快,但是跑你提取的特征值比如gethashcode()=int,几百万的int数组而已,速度会快n倍。

希望能对你有帮助。

today4king | 园豆:3499 (老鸟四级) | 2012-01-10 10:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册