Ini bukan jawaban. Ini pengamatan sederhana namun panjang. Semoga bermanfaat.
Versi keputusan masalah Anda adalah: Apakah berisi subset dari ?AXA
Masalah ini terkait dengan masalah mengevaluasi fungsi monoton boolean dari variabel. Subset dari setara dengan bitstring, sehingga keluarga setara dengan fungsi boolean dari variabel. Diberikan fungsi f , kita dapat mendefinisikan fungsi monoton paling kecil yang tidak lebih besar dari f , yaitu g ( y ) = ( ∃ x ⊆ y ,{ 1 , ... , n } n X f nn{1,…,n}nXfnff . Masalah aslinya kemudian dikurangi menjadi evaluasi g ( A ) . Sebaliknya, masalah mengevaluasi fungsi monoton boolean dapat dikurangi menjadi masalah asli, baik secara naif dengan mengambil f = g atau dengan memilih f yang membuat X lebih kecil.g(y)=(∃x⊆y,f(x))g(A)f=gfX
Dalam praktiknya, BDD cenderung bekerja dengan baik. Jadi salah satu pendekatan yang mungkin adalah membangun BDD untuk , berasal dari itu BDD untuk g , dan kemudian mengevaluasi g . Ukuran rata-rata BDD untuk g harus , karena ada banyak fungsi boolean monoton . Oleh karena itu, secara teori ini adalah solusi buruk.fgggΩ((nn/2))
Tetapi (1) analisis yang lebih baik mungkin dilakukan dan (2) mungkin ada perubahan pada pendekatan ini yang membuatnya lebih baik. Sebagai contoh, saya sama sekali tidak menggunakan korelasi antara ukuran dan ukuran BDD . (Pasti ada korelasi, tetapi saya tidak tahu apakah itu sederhana atau dapat digunakan di sini.)gXg
Untuk kelengkapan, algoritma sederhana untuk menghitung BDD untuk dari BDD untuk adalah sebagai berikut.
Di sini adalah standar atau operasi pada BDD.f m ( x ? f 1 : f 0 ) = x ? ( m ( f 0 ) ∨ m ( f 1 ) ) : m ( f 0 ) ∨gf
m(x?f1:f0)=x?(m(f0)∨m(f1)):m(f0)
∨
Mungkin Anda dapat menggunakan teknik "pencarian informasi": pada fase preprocessing, buat indeks terbalik (dalam kasus Anda, array bidimensional sudah cukup) yang memetakan elemen ke set di yang berisi itu: .n×|X| xi∈{1,...,n} X inv(xi)={Xj∈X|xi∈Xj}
Mendirikan sebuah array integer panjang.occ |X|
Kemudian untuk setiap ambil , dan untuk setiap lakukani n v ( y i ) X j ∈ i n v ( y i ) o c c [ j ] = o c c [ j ] + 1yi∈A inv(yi) Xj∈inv(yi) occ[j]=occ[j]+1
Pada akhirnya set yang Anda butuhkan adalah yang .|Xj|=occ[j]
Anda dapat mempercepat proses secara sewenang-wenang (dengan biaya ruang eksponensial) dengan mengindeks dua elemen atau lebih secara bersamaan.
sumber