【问题标题】:Disjoint set using Searching and Sorting使用搜索和排序的不相交集
【发布时间】:2013-10-28 16:50:49
【问题描述】:

我在我的算法课上遇到了一个问题,我无法解决它。问题指出,Theres 是一个带有O(nlogn) 的排序算法,搜索是通过采用O(log n) 的二进制搜索完成的。 两个集合是给P &Q,我必须设计一个算法来确定这两个集合是否不相交。

【问题讨论】:

    标签: algorithm data-structures binary-search disjoint-sets


    【解决方案1】:

    O(N)解决方案(假设两组排序):

    1. 将两个排序后的集合与元素属于哪个集合等信息合并
    2. 遍历合并列表,如果你从两个集合中找到两个相等的元素而不是不相交,否则如果能够到达末尾 不相交

    例如

    a= 1, 4, 6
    b= 2, 4, 7
    

    现在合并集=

    元素: 1 2 4 4 6 7

    设置编号(a/b): 1 2 1 2 1 2

    现在我们可以清楚地看到两个四是连续的,并且都来自两个不同的集合,因此不是不相交的。

    编辑:

    如果您需要查找集合是否不相交,那么简单的合并将为您提供。一旦你发现集合中的两个元素相等,就返回说不不相交,否则如果能够到达两者的末尾而不是不相交。

    关于容器的问题。以下是:

    class Element{
    int i;
    int setInfo
    }
    

    现在将数组声明为:Element[] e=new Element[X];

    希望我清楚。

    【讨论】:

    • 假设两个集合被排序你是对的。为了制定您的解决方案,可以修改合并算法,而不是在合并时,只检查两个元素是否相等。
    • @Trying,你能给出一个实用的方法来存储set number的信息吗,我的意思是提供一个int数组你会使用什么容器?
    【解决方案2】:

    只有当这两个集合之间没有共同元素时,这两个集合才会不相交。我假设这两个集合每个都有 n 个元素。该算法检查公共元素 nlog(n) 时间。如果没有找到共同的元素,则意味着这两个集合是不相交的。

    For each element in set "P" search whether that number exist in set "Q".
    Time complexity - n*log(n) 
    Log(n) to search in set Q and this search will be done "n" times.
    

    【讨论】:

    • 只要确保首先对集合进行排序(另一个 O(n log n) 操作),这样每个搜索都可以在 O(n) 时间内完成。
    • 如果两个列表都在搜索之前排序,时间复杂度将是 O(nlogn)+O(nlogn) + O(nlogn) = O(nlogn) [2 排序和 1 搜索。] 对吗? @TedHopp - 如何在 O(n) 中完成搜索,因为二进制搜索将花费 O(logn),如果我们使用线性搜索而不是 O(n),但由于它在另一个循环中,它将是 O(n^2)。
    • @Ted,你能解释一下如何在两个排序数组中搜索公共元素只需要 n 时间吗?
    • 嗯,应该是 O(log n)。对不起;打字太快了。
    猜你喜欢
    • 2011-10-10
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 2014-11-10
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    相关资源
    最近更新 更多