Waarom is std :: kaart geïmplementeerd als een rood-zwarte boom?

stemmen
130

Waarom is std :: kaart geïmplementeerd als een rood-zwarte boom ?

Er zijn verschillende evenwichtige binaire zoekboom (BSTS) die er zijn. Wat waren ontwerp trade-offs in het kiezen van een rood-zwarte boom?

De vraag is gesteld op 13/03/2011 om 09:33
bron van user
In andere talen...                            


6 antwoorden

stemmen
86

Waarschijnlijk is de twee meest voorkomende zelf balancing boom algoritmen zijn rood-zwarte bomen en AVL bomen . Om de boom in evenwicht te brengen na een insertie / bijwerken beide algoritmes gebruiken de notie van rotaties, waar de knooppunten van de boom worden gedraaid om het herstel van het evenwicht uit te voeren.

Terwijl in beide algoritmen de insert / delete operaties O (log n), in het geval van Red-Black tree herstel van het evenwicht rotatie is een O (1) transactie, terwijl met AVL dit is een O (log n) bediening, waardoor de rood-Zwarte boom efficiënter zijn in dit aspect van het herstel van het evenwicht podium en een van de mogelijke redenen dat het vaker wordt gebruikt.

Rood-zwarte bomen worden gebruikt in de meeste collecties van bibliotheken, met inbegrip van het aanbod van Java en Microsoft .NET Framework.

antwoordde op 13/03/2011 om 09:47
bron van user

stemmen
2

Het is gewoon de keuze van uw implementatie - ze als elk evenwichtig boom zou kunnen worden uitgevoerd. De verschillende keuzes zijn allemaal vergelijkbaar met kleine verschillen. Daarom zullen zo goed als ieder ander.

antwoordde op 13/03/2011 om 09:48
bron van user

stemmen
22

AVL bomen hebben een maximale hoogte van 1.44logn, terwijl RB bomen hebben een maximum van 2logn. een element bevestiging in een AVL kan een herschikking op een punt in de structuur ervan. De herschikking eindigt het inbrengen. Na het inbrengen van een nieuw blad, het bijwerken van de voorouders van dit blad moet worden gedaan aan de wortel, of tot een punt waar de twee substructuren een gelijke diepte. De waarschijnlijkheid van naar k knooppunten bij te werken is 03/01 ^ k. Rebalancing is O (1). een element verwijderen kan meer dan één herschikking inhouden (tot de helft van de diepte van de boom).

RB-bomen zijn B-bomen van de orde 4 voorgesteld als binaire zoekboom. Een 4-knooppunt in de B-structuur leidt tot twee niveaus in de equivalente BST. In het ergste geval, alle knooppunten van de boom zijn 2-nodes, met slechts een keten van 3-knooppunten neer op een blad. Dat blad wordt op een afstand van 2logn van de wortel.

Naar beneden van de wortel naar de invoegpositie, moet men 4-nodes te veranderen in 2-knooppunten, om ervoor te zorgen dat elke inbrengen zal een blad niet te verzadigen. Terugkomend van het inbrengen, al deze knooppunten moeten worden geanalyseerd om te controleren of ze correct weer te geven 4-nodes. Dit kan ook gedaan worden naar beneden in de boom. De globale kosten zullen hetzelfde zijn. Er is geen vrije lunch! een element uit de boom verwijderen is van dezelfde orde.

Al deze bomen vereisen dat knooppunten dragen informatie over lengte, gewicht, kleur, etc. Alleen splayboom vrij zijn van dergelijke extra info. Maar de meeste mensen zijn bang voor Splay bomen, als gevolg van de ramdomness van hun structuur!

Ten slotte kunnen de bomen ook gewicht in de schaal informatie in de knooppunten, waardoor het gewicht balancing. Diverse regelingen kunnen worden toegepast. Men moet evenwicht bij een substructuur bevat meer dan 3 maal het aantal elementen van de andere substructuur. Rebalancing gebeurt weer throuh ofwel een enkele of dubbele rotatie. Dit betekent dat een ergste geval van 2.4logn. Men kan wegkomen met 2 keer in plaats van 3, een veel betere verhouding, maar het kan betekenen dat het verlaten van iets minder Thant 1% van de substructuren onevenwichtige hier en daar. Tricky!

Welk type boom is de beste? AVL zeker. Zij zijn de eenvoudigste tot code, en hebben hun slechtste hoogte dichtst bij logn. Voor hout van 1000000 elementen, zal een AVL ten hoogste hoogte 29, een RB 40 en een gewicht evenwicht 36 of 50 afhankelijk van de verhouding.

Er zijn een heleboel andere variabelen: willekeur, verhouding van toevoegt, schrapt, zoekopdrachten, enz.

antwoordde op 16/07/2011 om 02:52
bron van user

stemmen
36

Het hangt af van het gebruik. AVL boom heeft meestal meer omwentelingen van rebalancing. Dus als uw aanvraag te veel plaatsen en verwijderen operaties, maar gewichten niet zwaar heeft over zoeken, dan AVL boom is waarschijnlijk een goede keuze.

std::map maakt gebruik van rood-zwarte boom als het een redelijke trade-off tussen de snelheid van knooppunt invoegen / verwijderen en zoeken krijgt.

antwoordde op 26/05/2012 om 19:32
bron van user

stemmen
2

Werk 2017/06/14: webbertiger haar antwoord te bewerken nadat ik commentaar. Ik wijs erop dat het antwoord is nu een stuk beter in mijn ogen. Maar ik hield mijn antwoord net als aanvullende informatie ...

Vanwege het feit dat ik denk dat eerste antwoord is verkeerd (correctie: niet beide meer) en de derde heeft een verkeerde bevestiging. Ik voel dat ik moest om dingen te verduidelijken ...

De 2 meest populaire boom zijn AVL en Rood Zwart (RB). Het belangrijkste verschil liggen in het gebruik:

  • AVL: Beter als verhouding van overleg (lezen) is groter dan manipulatie (modificatie). Memory foot print is iets minder dan RB (als gevolg van de bit die nodig zijn voor het kleuren).
  • RB: Beter in het algemeen de gevallen waar sprake is van een evenwicht tussen overleg (lezen) en manipulatie (modificatie) of meer wijzigingen in overleg. Een iets groter memory footprint als gevolg van de opslag van rood-zwarte vlag.

Het belangrijkste verschil afkomstig van de kleuren. Je moet wel minder re-balance actie in RB boom dan AVL omdat de kleuring kunt u soms over te slaan of in te korten re-balance acties die een relatieve hi kosten. Als gevolg van de kleuren, RB boom hebben ook een hoger niveau van nodes omdat het zou kunnen accepteren rood knooppunten tussen zwarte degenen (met de mogelijkheden van ~ 2x meer niveaus), waardoor zoeken (lees) een beetje minder efficiënt ... maar omdat het een constante (2x), is het verblijf in O (log n).

Als u de prestaties hit voor een wijziging van een boom (significative) VS de prestatie hit van de raadpleging van een boom (bijna te verwaarlozen) beschouwen, is het er natuurlijk om RB verkiezen boven AVL voor een algemeen geval.

antwoordde op 30/05/2017 om 20:33
bron van user

stemmen
5

De eerdere antwoorden alleen betrekking boom alternatieven en rood zwart waarschijnlijk blijft alleen om historische redenen.

Waarom niet een hash-tabel?

In een boom vraagt ​​om een ​​soort slechts een gedeeltelijke ordening (<vergelijking) te worden gebruikt als een sleutel in de kaart. Echter, hash tables vereisen dat elke toets type heeft een hash-functie gedefinieerd. Houden van deze soort tot een minimum is van groot belang voor generieke programmering.

Het ontwerpen van een goede hash-tabel vereist grondige kennis van de context waarin het zal worden gebruikt. Mocht het gebruik van open adressering, of gekoppeld chaining? Welke niveaus van de belasting mag het accepteren voordat het formaat? Zou het moeten gebruiken een dure hash dat botsingen vermijdt, of een die is ruw en snel?

(C ++ 11 deed toe te voegen hash tables met unordered_map. U kunt zien van de documentatie van het vereist het instellen van beleid om veel van deze opties in te stellen.)

Omdat de STL niet kan anticiperen op wat de beste keuze voor uw toepassing, de standaard moet flexibeler zijn. Bomen "gewoon werken" en schaal mooi.

Hoe zit het met andere bomen?

Rood Zwart boom aanbod snel opzoeken en zelf in evenwicht brengen in tegenstelling tot BSTS. Een andere gebruiker wees erop zijn voordelen ten opzichte van de self-balancing AVL boom.

Alexander Stepanov (De maker van STL) zei dat hij een B * Boom zou in plaats daarvan gebruik van een rood-zwarte boom als hij schreef std::mapweer. Dit komt omdat de knooppunten een willekeurig aantal elementen aansluitend wat vriendelijker voor de moderne geheugen caches kunt opslaan.

Een van de grootste veranderingen sindsdien is de groei van de caches geweest. Cache misses zijn erg duur, dus referentie-ligging is veel belangrijker nu. -Node gebaseerde data structuren, die een lage plaats van de referentie te hebben, maken veel minder zin. Als ik STL vandaag ontwierpen, zou ik een andere set van containers. Bijvoorbeeld, een in-memory B * -tree is een veel betere keuze dan een rood-zwarte boom voor het implementeren van een associatieve container. - Alexander Stepanov

U kunt meer lezen hier

Is rood zwart boom of B * altijd het beste?

Bij andere gelegenheden Alex heeft verklaard dat std::vectoris bijna altijd de beste lijst container om soortgelijke redenen. Het is zelden zinvol te gebruiken std::listof std::dequezelfs voor die situaties die we op school geleerd heeft (zoals het verwijderen van een element uit het midden van de lijst). std::vectoris zo snel dat het klopt deze structuren voor alles, maar grote n.

Het toepassen van dezelfde redenering als je slechts een klein aantal elementen (honderden?) Met een std::vectoren lineaire zoeken kan efficiënter zijn dan de boom uitvoering van zijn std::map. Afhankelijk van de frequentie van insertie, een gesorteerde std::vectorcombinatie met std::binary_searchKan de snelste keuze.

antwoordde op 22/12/2017 om 00:46
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more