Giả sử tất cả bộ của bạn là tập con hữu hạn của . Đặt biểu thị tập hợp các tập hợp của bạn.NS⊆P(N)
Bạn muốn hai hoạt động:
O1(S,s′) : Với mọi , hãy thêm vàos′⊆Ns′S
Ôi2( S,S') : Với bất kỳ , có một số sao cho ?S'⊆ Ns ∈ Ss ⊆S'
Dưới đây là một vài ý tưởng để tăng tốc mọi thứ:
Bạn sẽ kiểm tra xem một tập hợp nếu một tập hợp con khác rất nhiều vì vậy bạn có thể nên giữ kích thướccủa mỗi bộ có sẵn trong để khi bạn cần kiểm tra xem , bạn bắt đầu bằng cách kiểm tra xemvà nếu không, bạn có thể trả lại sai ngay lập tức. Và bạn thực sự có, sau đó bạn chỉ cần chạy thử nghiệm chậm bình thường.| s |SÔ ( 1 )s ⊆S'| s | ≤ |S'|| s | ≤ |S'|
Lưu ý rằng nếu bạn có vàS1∈ SS2∈ S, vậy nên S1⊆S2, sau đó nếu S2⊆S', bạn cũng có S1⊆S'. Vì vậy, bạn không cần phải giữS2 trong S cho Ôi2. Vì vậy, bạn có thể đại diệnS bởi một bộ các tập hợp sao cho s ∈ S và s ⊊S'ngụ ý . Nói cách khác, bạn chỉ cần theo dõi các tập hợp trong là tối thiểu để đưa vào. Điều này có thể được thực hiện khá hiệu quả: Khi thêm một bộ , cho tất cả các bộ sao cho(được sắp xếp bằng cách tăng hồng y), nếu , thì đừng thêm vì nó sẽ không ở mức tối thiểu (hoặc đã có trong ). Mặt khác, thêm và sau đó trong số các bộ sao cho, xóa những cái đó để (vì chúng không còn tối thiểu nữa).S'∉ SSS's ∈ S| s | ≤ |S'|s ⊆S'S'SS's ∈ S|S'| < | s |S'⊆ s
Giữ một tập rằng nhân bằng để sự kết hợp của tất cả các bộ trong . Sau đó, thay vì chạy , bạn có thể chạy (vì nếu với một số , , thì kể từ , và, nếu , thì ).tSÔi2( S,S')Ôi2( S,S'∩ t )s ∈ Ss ⊆S's ⊆ ts ⊆S'∩ ts ⊆S'∩ ts ⊆S'∩ t ⊆S'
Với những ý tưởng trong tâm trí, tôi muốn đại diện cho bởi một dictionnary (thực hiện như một danh sách gấp đôi liên kết của các cặp với các phím theo thứ tự tăng) sao cho là một danh sách gấp đôi liên kết có chứa chính xác bộ tối thiểu (để bao gồm) trong của hồng y .S( k e y, v a l u e )dd( k )Sk
O1(S,s')
if O2(S,s')
return
if d(k) doesn't exist
d(k) := new_doubly_linked_list()
add(d(k),s')
S.t := union(S.t, s')
for each key k of d so that |s'|+1 <= k
for s in d(k)
if subset(s', s)
remove s
_O2(S,s')
for each key k of d so that k <= |s'|
for s in d(k)
if subset(s,s')
return true
return false
O2(S,s')
return _O2(S,inter(S.t,s'))
(Lưu ý rằng mặc dù tôi đã không làm điều đó một cách rõ ràng trong mã của O1
, bạn có thể thực hiện một giao dịch duy nhất của danh sách liên kết gấp đôi đại diện d
)
Tôi không nghĩ rằng điều này cải thiện quá nhiều trong trường hợp xấu nhất nhưng trung bình thì nên.