Deelverzamelingen enumereren met bitmaskers
Alle deelverzamelingen via gehele getallen doorlopen
Deelverzamelingen enumereren met bitmaskers is een gratis Competitive Programming Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Competitive Programming Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Competitive Programming Academy bevat in totaal 4 lessen.
Deelverzamelingen als getallen
Elke deelverzameling van n items correspondeert met één geheel getal. Tel vanaf 0 omhoog; de bits van elk getal bepalen precies welke items erin zitten. 🙂
Hoeveel deelverzamelingen
Een verzameling van n elementen heeft 2^n deelverzamelingen. Als je dus een geheel getal van 0 tot en met 2^n min 1 doorloopt, bezoek je elke deelverzameling precies één keer.
for mask in range(1 << n):
pass # mask is one subset1 << n is het aantal
De verschuiving 1 << n is gelijk aan 2 tot de macht n. Dit is de duidelijke, snelle manier om de bovengrens van je lus over deelverzamelingen te schrijven.
Bit i lezen
Als je wilt bepalen of element i in de deelverzameling zit, controleer je zijn bit met een masker en 1 die i posities naar links is verschoven. Een resultaat dat niet nul is, betekent dat het element is opgenomen.
if mask & (1 << i):
take(items[i])De gekozen lijst opbouwen
Doorloop elke bitpositie en verzamel de elementen waarvan de bit is ingesteld. Zo zet je één masker om in de concrete deelverzameling die het voorstelt.
chosen = [items[i] for i in range(n) if mask & (1 << i)]Lege en volledige verzamelingen
Masker 0 is de lege deelverzameling en het masker met alleen enen is de volledige verzameling. Beide krijg je vanzelf, omdat je lus elke waarde doorloopt.
Een deelverzameling optellen
Tel binnen de lus de gekozen elementen op om elke deelverzameling een score te geven. Dit vormt de kern van veel kleine bruteforce-oplossingen.
total = sum(v[i] for i in range(n) if mask & (1 << i))De ingestelde bits tellen
Het aantal gekozen elementen is gelijk aan de popcount van het masker. In Python geeft bin(mask).count('1') dit meteen.
size = bin(mask).count("1")Let op de grens
Omdat er 2^n deelverzamelingen zijn, werkt deze techniek alleen voor kleine n. Rond n gelijk aan 20 ligt de praktische grens voor volledige opsomming.
Waarom bitmaskers winnen
Met één lus over gehele getallen vervang je rommelige geneste lussen, en bitbewerkingen zijn snel. De code blijft kort, duidelijk en eenvoudig te controleren.
Een herbruikbaar patroon
Doorloop het masker, decodeer de bits, geef de deelverzameling een score en houd de beste bij. Onthoud dit sjabloon en veel problemen met deelverzamelingen worden routine.
Snelle controle
Je wilt controleren of element i is opgenomen in de deelverzameling die door het masker wordt gecodeerd.
Samenvatting
Doorloop een masker van 0 tot en met 2^n min 1, lees bits met het masker en 1 die naar links is verschoven, en geef elke deelverzameling een score. Dit is duidelijke bruteforce voor kleine n. 🚀
Leer Python met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 30
- Lessen
- 120
Veelgestelde vragen
Is de les “Deelverzamelingen enumereren met bitmaskers” gratis?
Ja — de volledige tekst van “Deelverzamelingen enumereren met bitmaskers” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Competitive Programming Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Competitive Programming Academy bevat in totaal 4 lessen.
Wat leer ik in “Deelverzamelingen enumereren met bitmaskers”?
Alle deelverzamelingen via gehele getallen doorlopen Je oefent met Competitive Programming Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Competitive Programming Academy te beginnen?
Ervaring vooraf is niet nodig. Competitive Programming Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.
Hoe lang duurt de les “Deelverzamelingen enumereren met bitmaskers”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Competitive Programming Academy?
Ja. Elke les over Competitive Programming Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Brute force is een geldige strategie
- Enumereren met itertools
- Deelverzamelingen enumereren met bitmaskers
- De zoekruimte slim verkleinen