List<string[]> str1;
List<string[]> str2;
要求:求str1数组中每个string[0] 与str2中哪个string[0]相当
这两个数组里都是几万条的大量数据。。普通的循环效率太差。。根本就无法接受,请各位高人给个算法啊!!!最好贴上点原码。。谢谢了。。。。期待中
补充:楼下的哈希的做法应该是可以。。但要把值存入哈希。。。也是个不小的工啊。。。另外。。比对的是str1[x][0]与str2[x][0]。。。。请高手指教。。。请不要吝啬原码。。谢谢
要求:求str1数组中每个string[0] 与str2中哪个string[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] ?
其实我也没看懂啥意思。
List.Contains() 这个方法采用的是 线性搜索,效率低,可以采用二分查找法。
有个问题,
List<string[]> str1;
List<string[]> str2;
你的List中放的是string[]数组还是string字符串
百万 string 类型 进行比较,估计很难高效。
1. 如果你的list 能排序的话,那就简单了,先对两个list 进行排序,两个list 进行比较。复杂度是:nlogn的复杂度。
2. 如果不能排序,list 能不能换成 dictionary ,这个的内部结构是hash 表。直接循环,然后判断某个key 是否在另外一个哈希表里面就好了,理论上来说,采用哈希表的复杂度是 n。
借用数据库的方法:
0。Nested Loop
就是你说的方法了。
1。Sort Merge Join
和楼上的方法差不多,两个序列都按从小到大排好序,然后按同一个方向扫描。
2。Hash Join
扫描较少的那个序列一次,将值放入Hash表的Key中,扫描一次另个序列,利用 Hash 查找的优势,很容易就能找到相同的值了。
几十W的数据?看着像是面试题一样。。。
楼上的办法都很棒,楼主完全可以拼接出高效的算法,但是在实际使用中的高效比算法本身更重要,比如楼主在题目中list<string[]>就是个很低效的做法,内存是有限的,不是说你能装的下数据就全放进去,在比较排序中关心的是str的特征不是str本身。如果是几十万数据,很难想象普通pc怎么跑你的运算才能快,但是跑你提取的特征值比如gethashcode()=int,几百万的int数组而已,速度会快n倍。
希望能对你有帮助。