簡體   English   中英

union如何找到二次算法?

[英]How is union find quadratic algorithm?

在快速查找算法的這個實現中,構造函數采用N步,因此union()

指導者說union太昂貴,因為它需要N^2來處理N對象上的N union命令的序列。 當一次訪問一個數組元素時, union如何是二次的?

public class QuickFind
{
    private int[] id;

    public QuickFind(int N) {
        id = new int[N];
        for (int i=0; i<N; i++) {
            id[i] = i;
        }
    }

    public boolean connected(int p, int q) {
        return id[p] == id[q];
    }

    public void union(int p, int q) {
        int pid = id[p];
        int qid = id[q];

        for (int i=0; i<id.length; i++)
            if (id[i] == pid)
                id[i] = qid;
    }
}

每次調用union方法都需要迭代id數組,這需要花費O(n)時間。 如果你調用union方法n次,那么所需的時間是n*O(n) = O(n^2)

通過使連接方法的時間復雜度更高,可能是O(log n) ,你可以將union方法的時間復雜度提高到O(1) O(log n) ,但這只是一次操作。 我相信你的教科書會詳細解釋這一點。

快速查找的 Union運算對於O(n^2) n運算是二次O(n^2) ,因為每個運算需要O(n)時間,因為很容易注意到for循環內部union(int p, int q)

    for (int i=0; i<id.length; i++)

請注意,該算法稱為“ 快速查找” ,因為每個查找( connected(int p, int q) )操作都需要恆定的時間。 但是對於這個算法,你最終會在union操作中支付,如你的問題所述。

還有另一種算法Quick Union ,它可以縮短union操作的時間。 但是后來find並不是O(1) (但比線性時間更好)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM