VB.NET数组交集

时间:2009-03-23 16:25:00

标签: vb.net arrays intersection

这可能非常简单,但我找不到在不到n ^ 2的时间内执行的答案。假设我有两个字符串数组,我想知道两个数组中存在哪些字符串。我怎样才能有效地在VB.NET中实现, 除了双循环之外还有其他方法可以做到这一点吗?

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

如果对两个数组进行排序,则可以每次遍历它们以找到所有匹配的字符串。

的伪代码:

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++;
   }
}

然后你把它减少到进行排序所需的时间。

答案 2 :(得分:2)

对两个列表进行排序。然后你可以肯定地知道,如果列表A中的下一个条目是'cobble'而列表B中的下一个条目是'确定',那么'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 - &gt;匹配,存储A,提前两个 B vs D - &gt;乙 D vs D - &gt;匹配,存储D,推进两个 我vs G - &gt;我&gt; G,提前2
我vs I - &gt;匹配,存储我,推进两个 M vs N - &gt;中号 列表1没有更多项目,退出。
比赛列表是A,D,I

2列表排序O(n log(n)),加上O(n)比较使得这个O(n(log(n)+ 1))。

答案 3 :(得分:2)

如果其中一个数组已排序,您可以在内部循环中对其进行二进制搜索,这会将时间减少到O(n log n)