[英]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.