Bir alt küme arama algoritması


9

Bir listem var X alt kümelerinin {1,...,n}. Gerekirse bu listede önişleme yapabilirim. Bu ön işlemden sonra, başka bir setle karşılaştımA{1,...,n}. Herhangi bir set tanımlamak istiyorumBX ile BA.

Açık algoritma (önişleme olmadan) zaman alır O(n|X|) - basitçe test edersin A her birine karşı BXayrı ayrı. Bundan daha iyi bir şey var mı?

Eğer yardımcı olursa, herhangi biri için A, toplam eşleşme sayısı BX gibi bir şeyle sınırlıdır O(1).

Yanıtlar:


3

Bu bir cevap değil. Basit ama uzun bir gözlemdir. Umarım faydalı olur.

Sorununuzun karar sürümü: X bir altkümesi içermeli A?

Bu sorun, monoton boole fonksiyonlarının değerlendirilmesi sorunuyla ilgilidir. ndeğişkenler. Altkümesi{1,,n} eşittir bir n-bitstring, yani aile X boole işlevine eşdeğerdir f nın-nin ndeğişkenler. Bir işlev verildif, daha büyük olmayan en küçük monoton işlev tanımlanabilir f, yani g(y)=(xy,f(x)). Orijinal problem daha sonra değerlendirmeye indirgenir.g(A). Tersine, monoton bir boolean fonksiyonunun değerlendirilmesi sorunu, orijinal olarak,f=g veya bir f bu yapar X Daha küçük.

Pratikte BDD'ler iyi çalışma eğilimindedir. Bu yüzden olası bir yaklaşım BDD'yif, BDD için türetmek gve ardından değerlendir g. İçin ortalama BDD boyutug olmalıdır Ω((nn/2)), çünkü birçok monoton boolean işlevi vardır . Bu nedenle, teoride bu kötü bir çözümdür.

Ancak (1) daha iyi bir analiz mümkün olabilir ve (2) bu yaklaşımı daha iyi hale getiren ince ayarlar olabilir. Örneğin, boyutu ile BDD'si arasındaki ilişkiyi hiçbir şekilde kullanmadım . (Bir korelasyon olmalı, ama burada basit mi yoksa kullanışlı mı bilmiyorum.)Xg

Tamlık için için BDD'den için BDD'yi hesaplamak için basit bir algoritma şöyledir. Burada standart veya işlemdir.gf

m(x?f1:f0)=x?(m(f0)m(f1)):m(f0)

2
Bu, her bir alt kümesinin cevabını önceden hesaplamaya eşdeğer değil mi? {1,2,...,n}, tüm sonuçları ikili bir ağaçta önbelleğe alma 2nve sonra doğru sonucu (zamanında O(n)) verildiğinde A?
mjqxxxx

Önceden işlenmiş verileri saklamak için üstel alan kullanmak, hile gibi geliyor, ancak soruda yasaklanmamıştır. Ama En Kötü Durum Karmaşıklığı Kilisesi'ne karşı önyargılı olabilirim.
Tsuyoshi Ito

mjqxxxx ve Tsuyoshi: İkinize de katılıyorum. Metni yeniden yazdım ki umarım katılıyorum daha açıktır. :)
Radu GRIG5

3

Belki bir "bilgi alma" tekniği kullanabilirsiniz: önişleme aşamasında, ters bir dizin oluşturun (sizin durumunuzda basit birn×|X| bidimensional dizi yeterlidir) bir öğeyi eşler xi{1,...,n} setlere X içeren: inv(xi)={XjX|xiXj}.

Bir tamsayı dizisi ayarlama occ uzunluk |X|.

Sonra her biri için yiA geri almak inv(yi)ve her biri için Xjinv(yi) yapmak occ[j]=occ[j]+1

Sonunda ihtiyacınız olan setler |Xj|=occ[j].

İki veya daha fazla öğeyi birlikte endeksleyerek işlemi (üstel alan pahasına) keyfi olarak hızlandırabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.