Một cách nhỏ gọn để đại diện cho một phân vùng của một bộ là gì?


11

các cấu trúc dữ liệu hiệu quả để biểu diễn các phân vùng đã đặt. Các cấu trúc dữ liệu này có độ phức tạp thời gian tốt cho các hoạt động như Union và Find, nhưng chúng không đặc biệt hiệu quả về không gian.

Một cách hiệu quả không gian để đại diện cho một phân vùng của một tập hợp là gì?

Đây là một điểm khởi đầu có thể:

Tôi biết rằng số phân vùng của một tập hợp có phần tử là , số -th Bell . Vì vậy, độ phức tạp không gian tối ưu để biểu diễn phân vùng của tập hợp có phần tử là các bit . Để tìm một đại diện như vậy, chúng ta có thể tìm một ánh xạ một-một giữa (bộ phân vùng của một tập hợp các phần tử ) và (bộ số nguyên từ đến ).B N NNBNNlog 2 ( B N ) N 1 B NNlog2(BN)N1BN

Có một bản đồ như vậy là hiệu quả để tính toán? Ý tôi là "hiệu quả" là tôi muốn chuyển đổi biểu diễn nhỏ gọn này thành / từ một biểu diễn dễ thao tác (như danh sách các danh sách) theo đa thức thời gian trong hoặc .log 2 ( B N )Nlog2(BN)


tự hỏi, có thể cách mã hóa ngây thơ / tự nhiên đến mức nào khi chỉ gán các số nguyên duy nhất cho mỗi phần tử của tập hợp trong đó số nguyên biểu thị phân vùng #? có lẽ đó là "sự khác biệt không nhiều" ...log2(BN)
vzn

Câu trả lời:


7

Bạn có thể sử dụng cách xuất phát từ công thức lặp lại dưới đây để tìm mã hóa của mình: Điều này được chứng minh bằng cách xem xét có bao nhiêu phần tử khác trong phần chứa phần tử . Nếu có trong số này, thì chúng ta có cho chúng và các lựa chọn để phân vùng phần còn lại.

Bn+1=k=0n(nk)Bk.
n+1nk(nnk)=(nk)Bk

Sử dụng điều này, chúng tôi có thể đưa ra thuật toán đệ quy để chuyển đổi bất kỳ phân vùng thành một số trong phạm vi . Tôi giả sử bạn đã có cách chuyển đổi một tập hợp con có kích thước là thành một số trong phạm vi (thuật toán như vậy có thể được phát minh theo cùng một cách sử dụng tái phát của Pascal ).n+10,,Bn+11k{1,,n}0,,(nk)1(nk)=(n1k)+(n1k1)

Giả sử rằng phần chứa chứa phần tử khác. Tìm mã của họ . Tính toán phân vùng bằng cách "nén" tất cả các phần tử còn lại vào phạm vi đó. Tính toán đệ quy mã . Mã mới làn+1kC1{1,,nk}C2

C=l=0nk1(nl)Bl+C1Bnk+C2.

Theo hướng khác, được cung cấp mã , tìm duy nhất sao cho và xác định Vì , nên nó có thể được viết là , trong đó . Bây giờ mã hóa các phần tử trong phần chứa và mã hóa phân vùng củaCk

l=0nk1(nl)BlC<l=0nk(nl)Bl,
C=Cl=0nk1(nl)Bl.
0C<(nk)BnkC1Bnk+C20C2<BnkC1n+1C2{1,,nk}n+1, có thể được giải mã đệ quy. Để hoàn thành việc giải mã, bạn phải "giải nén" phân vùng sau để nó chứa tất cả phần tử không xuất hiện trong phần chứa .n+1


Dưới đây là cách sử dụng cùng một kỹ thuật để mã hóa một tập hợp con có có kích thước , đệ quy. Nếu thì mã là , vì vậy giả sử . Nếu thì hãy để là mã của , dưới dạng tập hợp con có kích thước của ; mã của là . Nếu thì hãy để là mã của , dưới dạng tập con có kích thước là ; mã củaS{1,,n}kk=00k>0nSC1S{n}k1{1,,n1}SC1nSC1Sk{1,,n1}SC 1 +là .C1+(n1k1)

Để giải mã một mã , có hai trường hợp. Nếu thì giải mã một tập hợp con của có kích thước có mã là và xuất ra . Mặt khác, giải mã một tập hợp con của có kích thước có mã là và xuất .CC<(n1k1)S{1,,n1}k1CS{n}S{1,,n1}kC(n1k1)S


Câu trả lời tuyệt vời; cảm ơn bạn. Lỗi nhỏ: Trong bản phác thảo bằng chứng cho công thức lặp lại ở đầu, tôi nghĩ bạn có nghĩa là "có trong số đó" thay vì "có trong số đó" - thì các phần tử còn lại có thể được phân vùng theo cách . k k B knkkkBk
cberzan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.