Alt Kümeleri Üretmek
Her eleman için al/alma kararıyla bir kümenin tüm 2ⁿ alt kümesini üreten geri izleme kalıbı.
#Nasıl çalışır?
n elemanlı bir kümenin 2ⁿ alt kümesi vardır; çünkü her eleman için iki seçenek bulunur: ya alt kümeye girer ya girmez. Bu kararlar ikili bir karar ağacı oluşturur.
Geri izlemeyle her seviyede bir eleman için karar verilir. Önce eleman alınır ve kalan elemanlar için devam edilir; o dal bitince eleman çıkarılır (geri alınır) ve elemansız dal denenir. Ağacın her yaprağı bir alt kümedir.
Aynı kalıp, kısıt eklenince güçlü bir araca dönüşür: örneğin toplamı belirli bir değere eşit alt kümeleri ararken toplam zaten aşıldıysa o dal hiç açılmaz (budama).
#Kendin dene
Bulunanlar (0)
1 … n sayılarından oluşan kümenin tüm alt kümelerini üretiyoruz. Her eleman için iki dal var: al (+) ya da alma (−).
#Adım adım
- 01İlk elemandan başla, seçilenler listesi boş olsun.
- 02Elemanı listeye ekle ve bir sonraki elemana geç.
- 03O dal bitince elemanı listeden çıkar ve elemansız devam et.
- 04Tüm elemanlar için karar verildiğinde (yaprak) listeyi bir alt küme olarak kaydet.
#Örnek kod
Aynı algoritma 8 dilde. Her program derlenip çalıştırılarak test edildi ve hepsi aynı çıktıyı veriyor.
def subsets(items: list) -> list:
out, chosen = [], []
def visit(i: int) -> None:
if i == len(items):
out.append(list(chosen))
return
chosen.append(items[i]) # take items[i]
visit(i + 1)
chosen.pop() # leave it (backtrack)
visit(i + 1)
visit(0)
return out
for s in subsets([1, 2, 3]):
print("{" + ", ".join(map(str, s)) + "}")#Karmaşıklık
| İşlem | Süre |
|---|---|
| Alt küme sayısı | 2ⁿ |
| Hepsini üretmek | O(n · 2ⁿ) |
| Bellek (özyineleme) | O(n) |
| Bit maskesiyle alternatif | O(n · 2ⁿ) |
Her alt kümeyi yazmak O(n) sürdüğü için toplam O(n · 2ⁿ)'dir; çıktının kendisi bu kadar büyük olduğundan daha hızlısı mümkün değildir. Alternatif olarak 0'dan 2ⁿ − 1'e kadar sayılar bit maskesi olarak kullanılabilir: i. bit 1 ise i. eleman alt kümededir.
#Ne zaman kullanılır?
Tüm kombinasyonların denenmesi gereken küçük problemler: alt küme toplamı, takım seçimi, özellik seçimi, kombinasyonel testler ve bulmacalarda arama. Eleman sayısı büyüdükçe 2ⁿ hızla büyüdüğü için budama ya da DP gerekir.
#Alıştırma
Soruları cevaplamak ve ilerlemeni kaydetmek için giriş yap.
Kolay
n elemanlı bir kümenin kaç alt kümesi vardır?
- 12ⁿ
- 2n!
- 3n²
- 42n
Karar ağacının her yaprağı neyi temsil eder?
- 1Bir alt kümeyi
- 2Bir elemanı
- 3Bir permütasyonu
- 4Bir hatayı
Geri izlemede "eleman alındıktan sonra çıkarılması" neden gerekir?
- 1Aynı listeyle "alma" dalını da denemek için
- 2Belleği temizlemek için
- 3Elemanları sıralamak için
- 4Gerekmez
Orta
{1, 2, 3} için önce alma dalı denenirse üretilen ikinci alt küme hangisidir?
- 1{1, 2}
- 2{1, 3}
- 3{2, 3}
- 4{}
Zor
Alt kümeleri üretmenin özyinelemesiz bir yolu nedir?
- 10'dan 2ⁿ − 1'e kadar sayıları bit maskesi olarak kullanmak
- 2Elemanları sıralamak
- 3Bir yığına tüm elemanları itmek
- 4İkili arama yapmak
#Bundan sonra
Bu dersi bildiğini varsayan dersler: