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