簡體   English   中英

使用等級和路徑壓縮試探法合並數據庫表

[英]Merging database tables using rank and path compression heuristics

我在數據結構課程中遇到以下問題。 該課程提供的錯誤相當模糊,我無法辨別錯誤所在。

注意:錯誤消息僅顯示“錯誤答案”。 並且沒有提供測試用例。

輸入格式:輸入的第一行包含兩個整數和——分別是數據庫中表的數量和要執行的合並查詢的數量。 輸入的第二行包含整數 [] — 第 - 個表中的行數。 然后下面幾行描述了合並查詢。 它們每個都包含兩個整數 n[i] 和 [i]——要合並的表的數量。

Output 格式:對於每個查詢,打印一行包含單個 integer — 相應操作后所有表的最大大小(根據行數)。

示例輸入:

5 5
1 1 1 1 1
3 5
2 4
1 4
5 4
5 3

樣本 Output:

2
2
3
5
5

這是我當前的代碼,它適用於大多數情況,但似乎有一些我沒有考慮到的邊緣情況。

class DataBases:
    def __init__(self, row_counts):
        self.max_row_count = max(row_counts)
        self.row_counts = row_counts
        n_tables = len(row_counts)
        self.parent = list(range(n_tables))
        self.rank = [1] * n_tables

    def get_parent(self, table):
        update_root = []
        root = table
        
        while root != self.parent[root]:
            update_root.append(self.parent[root])
            root = self.parent[root]
            
            for i in update_root:
                self.parent[i] = root
                
        return root

    def merge_tables(self, dst, src):
        src_parent = self.get_parent(src)
        dst_parent = self.get_parent(dst)
        if src_parent == dst_parent: return
        
        if self.rank[src_parent] > self.rank[dst_parent]:
            self.parent[dst_parent] = src_parent
            self.update_row_counts(src_parent, dst_parent)
        else:
            self.parent[src_parent] = dst_parent
            self.update_row_counts(dst_parent, src_parent)
            if self.rank[src_parent] == self.rank[dst_parent]:
                self.rank[dst_parent] += 1
    
    def update_row_counts(self, root, child):
        self.row_counts[root] += self.row_counts[child]
        self.row_counts[child] = 0
        self.max_row_count = max(self.max_row_count, self.row_counts[root])

def main():
    n_tables, n_queries = map(int, input().split())
    counts = list(map(int, input().split()))
    assert(n_tables == len(counts))
    db = DataBases(counts)
    for i in range(n_queries):
        dst, src = map(int, input().split())
        db.merge_tables(dst - 1, src - 1)
        print(db.max_row_count)



if __name__ == "__main__":
    main()

問題出在 get_parent(路徑壓縮)實現中。

正確的解決方案:

    def get_parent(self, table):
        
        if table != self.parent[table]:
            self.parent[table] = self.get_parent(self.parent[table])
                
        return self.parent[table]

暫無
暫無

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

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