cuốn sách gpt4 ai đã làm

Union-Find:Xóa tiếp theo

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 03:27:37 27 4
mua khóa gpt4 Nike

Tôi đang cố gắng giải quyết vấn đề Union-Find này

Kế thừa có xóa. Cho một tập hợp N số nguyên S={0,1,…,N−1} và một chuỗi các yêu cầu có dạng sau:

Loại bỏ x khỏi S Tìm phần tử kế tiếp của x: y nhỏ nhất trong S sao cho y ≥ x thiết kế kiểu dữ liệu sao cho tất cả các thao tác (trừ xây dựng) sẽ mất thời gian logarit hoặc tốt hơn.

Mặc dù tôi tìm thấy một số giải pháp và bài viết giải thích cách sử dụng Liên minh-Tìm Điều này đã được thực hiện, nhưng tôi không thể tưởng tượng nó hoạt động như thế nào.

Ví dụ:Xóa(X) có thể vượt quaLiên minh(X,X+1) để hoàn thành, nhưng tôi không thể tưởng tượng nó hoạt động như thế nào khi xóa. và tìm kiếm Người kế nhiệm(X) tương tự.

Bất kỳ trợ giúp/hướng dẫn hoặc giải thích chi tiết nào sẽ giúp ích rất nhiều.

câu trả lời hay nhất

Chúng ta có thể xây dựng cấu trúc dữ liệu tìm liên kết để thể hiện vấn đề này. Bất biến là gốc(x) Lưu trữ nhỏ nhất trong S y làm y >= x.

Đầu tiên, chúng ta có thể đảm bảo rằng cấu trúc dữ liệu tra cứu kết hợp ban đầu trên các nút 1..N thỏa mãn bất biến: chúng ta chỉ cần đảm bảo rằng mỗi nút ban đầu Tôi kho Tôi .

Để mô phỏng x loại bỏ, chúng tôi thực hiện hợp(x, x+1). Chúng ta phải đảm bảo rằng việc triển khai tìm liên kết sẽ duy trì các bất biến của chúng ta. nếu chúng ta muốn gốc(x) Kết nối với gốc(x+1), điều đó tốt thôi, nhưng nếu chúng ta kết nối gốc(x+1) đến gốc(x), thì chúng ta cần phải gốc(x+1) Giá trị của được lưu trữ trong nút gốc(x).

Chúng ta cần phải cẩn thận để đảm bảo union Chạy trong thời gian O(log n) được đảm bảo. Để làm điều này, chúng ta cần lưu trữ cho mỗi nút kích thước của cây có gốc tại nút đó. Đây là một cách thực hiện và một ví dụ đơn giản.

nút lớp:
def __init__(self, i):
tự.i = tôi
tự.size = 1
self.max = tôi
self.root = tự

gốc def (nút):
r = nút
trong khi r.root != r:
r = r.root
# thực hiện nén đường dẫn
trong khi node.root != nút:
nút, node.root = node.root, r
trả lại r

hợp def (n1, n2):
n1 = gốc(n1)
n2 = căn (n2)
nếu n1.size < n2.size:
n1, n2 = n2, n1
n2.root = n1
n1.size += n2.size
n1.max = max(n1.max, n2.max)

def Sfind(uf, i):
trả về root(uf[i]).max

def Sdelete(uf, i):
công đoàn(uf[i], uf[i+1])

N = 100
S = dict((i, Node(i)) cho i trong xrange(1, N))
Xóa(S, 10)
Xóa(S, 12)
Xóa(S, 11)

cho tôi trong [10, 12, 13, 20]:
in i, Sfind(S, i)

Đây là một ví dụ. Chúng ta bắt đầu với 5 nút và bước qua hợp (2, 3), hợp (4, 5) và hợp (3, 4) - tương ứng với việc xóa 2, rồi 4, rồi 3. Hãy lưu ý rằng mũi tên trong hình từ a đến b tương ứng với a.root = b. Khi tôi nói về "cây có gốc nút" ở trên, sẽ tự nhiên hơn khi nghĩ đến các mũi tên chỉ theo hướng ngược nhau.

Không có nút nào bị xóa.

không có nút nào bị xóa

2 đã bị xóa -- hợp(2, 3)

2 đã xóa

Xóa 2 và 4 -- hợp(2, 3), hợp(4, 5)

2 và 4 đã xóa

Xóa 2, 3, 4 -- hợp(2, 3), hợp(4, 5), hợp(3, 4)

2, 3, 4 đã xóa

Về thuật toán - Union-Find: Successor Deletion, chúng tôi tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/42860950/

27 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress