【问题标题】:Efficient algorithm to determine if two sets of numbers are disjoint确定两组数字是否不相交的有效算法
【发布时间】:2014-07-08 19:41:40
【问题描述】:

练习软件开发人员面试,但被算法问题困住了。

Given two sets of unsorted integers with array of length m and other of 
length n and where m < n find an efficient algorithm to determine if 
the sets are disjoint. I've found solutions in O(nm) time, but haven't 
found any that are more efficient than this, such as in O(n log m) time.

【问题讨论】:

  • O(n log m) 不会比 O(n) 慢吗?
  • McLovin 打败了我。O(n)
  • O(n+m) 是你能做的最好的。此外,O(n) 比 O(n log m) 更有效
  • 我的错,应该是“O(nm) time”!
  • 哈希表有用吗?

标签: algorithm disjoint-sets


【解决方案1】:

使用具有 O(1) 查找/插入的数据结构,您可以轻松插入第一组的所有元素。

然后foreach第二个集合中的元素,如果存在不不相交,否则不相交

伪代码

function isDisjoint(list1, list2)
    HashMap = new HashMap();
    foreach( x in list1)
        HashMap.put(x, true);

    foreach(y in list2)
        if(HashMap.hasKey(y))
             return false;
    return true;

这会给你一个 O(n + m) 的解决方案

【讨论】:

  • Np 这是答案吗?
【解决方案2】:

相当明显的方法 - 对长度为 m - O(m log m) 的数组进行排序。 对于长度为n 的数组中的每个元素,使用二进制搜索检查它是否存在于长度为m - O(log m) 每个元素=O(n log m) 的数组中。由于m&lt;n,这加起来就是O(n log m)

【讨论】:

    【解决方案3】:

    看起来 Cheruvian 击败了我,但您可以使用哈希表在 一般情况下获得O(n+m)
    * 将m 的所有元素插入表中,每个元素(可能)花费恒定的时间,假设没有很多具有相同的哈希值。这一步是O(m)
    *对于n的每个元素,查看是否在表中。如果是,则返回 false。否则,继续下一个。这需要O(n)
    *如果表中没有,则返回true。

    正如我之前所说,这是可行的,因为哈希表在平均情况下会提供恒定的查找时间。在极少数情况下m 中的许多唯一元素具有相同的哈希值,这将花费稍长的时间。但是,大多数人不需要关心假设的最坏情况。例如,快速排序比归并排序更常用,因为尽管有O(n^2) 上限,但它提供了更好的平均性能。

    【讨论】:

      【解决方案4】:

      这是我认为可以回答您的问题的帖子的链接。

      3) 排序更小的 O((m + n)logm)

      1. 说,m
      2. 将B的每个元素二进制搜索到A中

      缺点:修改输入

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-06
        相关资源
        最近更新 更多