VB.NET数组交集

VB.NET数组交集,vb.net,arrays,intersection,Vb.net,Arrays,Intersection,这可能非常琐碎,但我很难找到一个执行时间不到n^2次的答案。假设我有两个字符串数组,我想知道两个数组中都存在哪些字符串。在VB.NET中,我该如何高效地实现这一点,或者除了双循环之外还有其他方法吗?简单的方法(假设没有.NET 3.5)是从哈希表中的一个数组转储字符串,然后通过另一个数组循环检查哈希表。这应该比n^2搜索快得多。对两个列表进行排序。然后,您可以肯定地知道,如果列表A中的下一个条目是“cobble”,而列表B中的下一个条目是“definite”,那么“cobble”不在列表B中。只

这可能非常琐碎,但我很难找到一个执行时间不到n^2次的答案。假设我有两个字符串数组,我想知道两个数组中都存在哪些字符串。在VB.NET中,我该如何高效地实现这一点,或者除了双循环之外还有其他方法吗?

简单的方法(假设没有.NET 3.5)是从哈希表中的一个数组转储字符串,然后通过另一个数组循环检查哈希表。这应该比n^2搜索快得多。

对两个列表进行排序。然后,您可以肯定地知道,如果列表A中的下一个条目是“cobble”,而列表B中的下一个条目是“definite”,那么“cobble”不在列表B中。只需在排名结果较低的列表上前进指针/计数器,并提升排名

例如:

列表1:D、B、M、A、I
清单2:I、A、P、N、D、G

分类:

列表1:A、B、D、I、M
清单2:A、D、G、I、N、P

A vs A-->匹配、存储A、同时前进
B对D-->B D vs D-->匹配、存储D、同时前进
I vs G-->I>G,前进2步
I vs I-->匹配、存储I、同时前进
M对N-->M 列表1没有其他项目,请退出
匹配项列表为A、D、I


2个列表对O(n log(n))进行排序,加上O(n)比较,这就是O(n(log(n)+1))。

如果对其中一个数组进行排序,则可以在内部循环中对其进行二进制搜索,这将减少到
O(n log n)
的时间。如果对两个数组进行排序,则可以逐个遍历一次,以找到所有匹配的字符串

伪代码:

while(index1 < list1.Length && index2 < list2.Length)
{
   if(list1[index1] == list2[index2])
   {
      // You've found a match
      index1++;
      index2++;
   } else if(list1[index1] < list2[index2]) {
      index1++;
   } else {
      index2++;
   }
}
while(index1

然后,您将其减少到进行排序所需的时间。

什么版本的.NET?在3.5中,您可以使用INTERSECTION的linq扩展,我相信我们现在使用的是2.0。不幸的是,企业托管策略。最好是将它们放在哈希集、字典或列表中,而不是放在数组中。