Konkrete eksempler på bruk av binære søketrær?

stemmer
14

Jeg forstår hvordan binære søketrær er implementert, men jeg er ikke sikker på hva er fordelene med å bruke den over hash tabeller som de fleste programmeringsspråk har bygd inn i sine vanlige biblioteker.

Kan noen vennligst gi eksempler på reelle problemer løsbar med binære søketrær?

Publisert på 15/02/2011 klokken 23:44
kilden bruker
På andre språk...                            


5 svar

stemmer
1

Et eksempel på hvor et binært tre er nødvendig er binære plass partisjoner i datagrafikk

http://en.wikipedia.org/wiki/Binary_space_partitioning

En binærtreet er nødvendig fordi algoritmen krever bevaring av relasjonene mellom nodene i det binære treet. Det er mange andre algoritmer hvor strukturen av treet er viktig, og så en nøkkeltabell er ikke en egnet struktur.

En annen god grunn til å bruke et binært tre i stedet for en hash table er når du ikke kan enkelt generere en effektiv hash for dataelementer, men du kan generere en sammenligning funksjon.

Ofte for enkel lagring og gjenfinning av data en nøkkeltabell er mer optimalt, men mer komplisert å gjennomføre.

Svarte 15/02/2011 kl. 23:53
kilden bruker

stemmer
0

En av de mest oversett er at mange filsystemer bruker binære trær for å administrere katalogoppføringer. De bruker sjelden en vanlig binært tre, men noe variasjon som et B-tre. Dette er fordi spørsmålet om på disk lagring av treet er ganske viktig til detaljene i gjennomføringen. Grunnen til at de bruker denne typen struktur er for effektivitet og hurtighet. Dette lar dem gjøre ting som å støtte tusenvis av filer i en katalog. Sammenligninger for opprettelse fil og sletting ganger markere effektivitet for dette aspektet av filsystemet.

Binære trær er også brukt på mange spill som gjengir 3D-objekter. Igjen er årsaken hastighet. Faktisk er hastigheten så viktig at noen spillmotorer, slik som Quake-motoren faktisk har det binære treet forhåndsgenerert og pre-optimalisert som en del av kartet byggeprosessen.

Svarte 15/02/2011 kl. 23:56
kilden bruker

stemmer
0

En ting å merke seg er at binært søketre er plassbesparende. For eksempel, har du 10 heltall til å lagre og du har en hash-funksjon som kart 0-99, deretter u trenger en rekke 100 heltall. Hvis du brukte binært søketre, så ville du tildele bare så mye minne som kreves av 10 elementer

Svarte 15/02/2011 kl. 23:57
kilden bruker

stemmer
29

Det er noen teoretiske fordeler med binære søketrær enn hash tabeller:

  1. De lagrer sine elementer i sortert rekkefølge . Dette betyr at hvis du ønsker å lagre beholderen på en måte hvor du enkelt kan besøke verdiene i sortert rekkefølge, er et BST trolig et bedre valg enn en hash table. For eksempel, hvis du ønsker å lagre en samling av studenter og deretter skrive ut alle elevene i alfabetisk rekkefølge, er et BST et vesentlig bedre valg enn en hash table.

  2. De støtter effektivt range spørringer. Fordi BSTs lagres i sortert rekkefølge, er det lett å svare på spørsmål av typen "hva verdier er i området [x, y]?" i et binært søketre. For å gjøre dette, gjør du et oppslag i treet for det minste elementet større enn x og den største element mindre enn y, deretter iterere over elementene i treet mellom dem. Begge disse søkene kjøres i O (lg n) tid i et balansert tre, slik at den totale driftstid for denne operasjonen er O (lg n + k), der k er antallet elementer som tilsvarer søk.

  3. De støtter effektivt nærmeste-nabo spørringer. Nøkkeltabeller er spesielt utformet slik at til og med litt forskjellig produserer vill forskjellige hash-koder. Dette gir hash verdier den sprednings de trenger for å unngå clustering for mange elementer på ett sted. Men det betyr også at du trenger å gjøre en lineær skanning over hash tabellen for å finne elementer som kan bli "close" til det du leter etter. Med en BST, kan du effektivt finne forgjenger og etterfølger av noen verdi du vil, selv om det ikke er i treet.

  4. De kan ha bedre worst-case garantier. De fleste nummertabellen implementeringer har noen form for degenerert tilfelle hvor en operasjon kan brytes ned til O (n) i det verst tenkelige tilfelle. En lineær probing nøkkeltabell eller en kjedet hash tabell kan, sammen med et dårlig sett av elementer, krever O (n) en gang per oppslag eller krever O (n) tid på et oppkok. Innsetting i noen typer balanserte BSTs, for eksempel rød / svart trær, AVL trær eller AA trær, er alltid verst tenke O (lg n).

Hvis du er villig til å generalisere BSTs til mer forseggjort trestrukturer, så det er mange programmer der et tre kan brukes til å løse problemer mye mer effektivt enn i en hash table. Her er noen eksempler:

  1. kd-trær kan du lagre flerdimensjonale data samtidig som den støtter raske range spørringer i flerdimensjonale plass, samt effektive nærmeste-nabo oppslag. Du kan bruke dem for klassifisering (lat læring algoritmer) eller beregningsorientert geometri.

  2. Link / kuttet trær kan brukes til å løse max-flow problemer mye mer effektivt enn de fleste konvensjonelle algoritmer ville tillate. God push / relabel algoritmer bruke dette til å øke hastigheten på sine implementeringer.

  3. Undergrupper-set skoger kan brukes for å opprettholde skillevegger av elementer som asymptotisk effektivt som mulig (amortisert α (n) pr oppdatering, der α (n) er den inverse funksjonen Ackermann). De brukes i mange raske minimumsspennende tre algoritmer, samt noen maksimal-matching algoritmer.

  4. Binære hauger kan brukes til å implementere prioritetskøer effektivt. Mer komplekse trær kan brukes til å bygge binomiske hauger og Fibonacci hauger , som er av stor betydning i teoretisk informatikk.

  5. Beslutningstrær kan brukes i maskinlæring for klassifisering, og som modell i teoretisk informatikk for å bevise grenser på kjøretider for ulike algoritmer.

  6. Trefoldig søke trær er et alternativ til prøver som er basert på som litt endret BST. De tillater for svært rask oppslag og innsetting av elementer og for spredte datasettene er ganske kortfattet.

  7. B-trær blir brukt av mange databasesystemer for å effektivt slå opp elementer hvor disktilgang er en begrensende faktor.

  8. Binære plass partisjone trær er en generalisering av kd-trær som kan brukes til å raskt gjengi datagrafikk (de ble brukt til å optimalisere gjengi i det opprinnelige spillet Doom) og gjøre kollisjonsdeteksjon.

  9. BK-trær tillate deg å raskt finne alle ord som er innenfor en viss redigeringsavstand fra noen andre ord, og mer generelt for å finne alle punkter i et metrisk rom innenfor en viss avstand fra et annet punkt.

  10. Fusion trær er et alternativ til hasj tabeller for heltall nøkler som ikke har ekstremt rask støtte for oppslag, innsett og slettinger.

  11. van Emde Boas trær en annen alternativ hash tabeller for heltalls nøkler som støtter oppslag, insersjon, delesjon, etterfølger, og forløperen i O (lg lg n) en gang per element. Noen databasesystemer bruker VEB trær for å optimalisere ytelsen.

Jeg er ikke sikker på hvordan on-topic dette svaret er, men det bør gi deg en følelse for hvordan flotte og kraftige BSTs og mer generelle trestrukturer kan være.

Svarte 16/02/2011 kl. 00:05
kilden bruker

stemmer
0

Dette bør nok være en kommentar, men selvbalanserende BST (er) (log (n)) brukes mye i stedet for BSTs. Vanlig BSTs har verste tilfelle O (N) innsetting / fjerning tid.

Svarte 16/02/2011 kl. 02:14
kilden bruker

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