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

$ subsets --interactive

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 (−).

GeziliyorYeniÇıkarılıyorBulundu / okunan

#Adım adım

  1. 01İlk elemandan başla, seçilenler listesi boş olsun.
  2. 02Elemanı listeye ekle ve bir sonraki elemana geç.
  3. 03O dal bitince elemanı listeden çıkar ve elemansız devam et.
  4. 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

İşlemSüre
Alt küme sayısı2ⁿ
Hepsini üretmekO(n · 2ⁿ)
Bellek (özyineleme)O(n)
Bit maskesiyle alternatifO(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

1/3

n elemanlı bir kümenin kaç alt kümesi vardır?

  • 12ⁿ
  • 2n!
  • 3n²
  • 42n

Orta

1/1

{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

1/1

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: