【问题标题】:VB.NET Array IntersectionVB.NET 数组交集
【发布时间】:2009-03-24 00:42:06
【问题描述】:

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

【问题讨论】:

  • 什么版本的 .NET?在 3.5 中,您可以将 linq 扩展用于 Intersect
  • 我相信我们现在使用的是 2.0。不幸的是,公司托管政策。

标签: vb.net arrays intersection


【解决方案1】:

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

【讨论】:

  • 最好将它们放在哈希集、字典或列表中,而不是放在数组中。
【解决方案2】:

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

伪代码:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      对两个列表进行排序。然后您可以确定地知道,如果列表 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 --> 匹配,存储 A,同时推进
      B vs 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))。

      【讨论】:

        猜你喜欢
        • 2015-11-07
        • 1970-01-01
        • 2018-04-13
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 2022-11-22
        • 2017-10-09
        • 1970-01-01
        相关资源
        最近更新 更多