Position i et set?

Tags:    c++

Et set er, så vidt jeg har forstået, ofte bygget over et red-black tree - og skulle i hvert fald opføre sig nogenlunde sådan.
Hvis jeg selv koder et binært søge træ, kan jeg sagtens få "positionen" af en node i træet: Altså hvor mange noder har en værdi der er mindre og hvor mange noder har en værdi der er højre. Og det altså i tiden O(h), hvor h er højden af træet. Det er self O(log(N)), hvor N er antallet af noder i træet, hvis træet er balanceret. (Det gør jeg ved at jeg til hver node tilføjer et tal, som angiver hvor mange efterkommere noden har, og det kan opdateres så indsættelse og sletning stadig sker i O(h) )

Hvis jeg har et set, og har indsat nogle elementer kan jeg ikke lige gennemskue om der er en smart måde at gøre noget lignende på.
Altså fx:
Fold kodeboks ind/udKode 


I testSet skulle 31 så have position nr. 5 (Eller 4 hvis man 0-indekserer)
Så: Hvordan finder jeg ud af det i logaritmisk tid?

PS: Jeg spørger fordi jeg gerne vli bruge det til konkurrencer, hvor vi ikke får lov til at genbruge tidligere kode, så derfor det lidt mærkelig spørgsmål. :)



Et set er, så vidt jeg har forstået, ofte bygget over et red-black tree - og skulle i hvert fald opføre sig nogenlunde sådan.
Hvis jeg selv koder et binært søge træ, kan jeg sagtens få "positionen" af en node i træet: Altså hvor mange noder har en værdi der er mindre og hvor mange noder har en værdi der er højre. Og det altså i tiden O(h), hvor h er højden af træet. Det er self O(log(N)), hvor N er antallet af noder i træet, hvis træet er balanceret. (Det gør jeg ved at jeg til hver node tilføjer et tal, som angiver hvor mange efterkommere noden har, og det kan opdateres så indsættelse og sletning stadig sker i O(h) )

Hvis jeg har et set, og har indsat nogle elementer kan jeg ikke lige gennemskue om der er en smart måde at gøre noget lignende på.
Altså fx:
Fold kodeboks ind/udKode 


I testSet skulle 31 så have position nr. 5 (Eller 4 hvis man 0-indekserer)
Så: Hvordan finder jeg ud af det i logaritmisk tid?

PS: Jeg spørger fordi jeg gerne vli bruge det til konkurrencer, hvor vi ikke får lov til at genbruge tidligere kode, så derfor det lidt mærkelig spørgsmål. :)


Rod knuden har index 0. Enhver knude har et index. En knudes venstre barn er på index '2 * i + 1' og højre barn på index '2 * (i + 1)'. En knudes parent er på index '(i - 1) / 2'.

Jeg plejer at opbygge binære træer med et array istedet for objekter med to-tre pointere (left child, right child, parent).



Rod knuden har index 0. Enhver knude har et index. En knudes venstre barn er på index '2 * i + 1' og højre barn på index '2 * (i + 1)'. En knudes parent er på index '(i - 1) / 2'.

Jeg plejer at opbygge binære træer med et array istedet for objekter med to-tre pointere (left child, right child, parent).

Jeg kender godt den måde at opbygge binære træer på, men jeg kan ikke lige gennemskue, hvordan det hjælper mig. En rotation vil tage lineær tid (i antallet af noder) i stedet for konstant tid, hvis man opbygger det sådan. Det kan være meget smart, hvis man laver et max heap, men det jeg vil lave er et balanceret binært søgetræ. Jeg kan faktisk ikke engang gennemskue, hvordan man ville lave et normalt binært søgetræ på den måde, uden potentielt at bruge O(2^n) hukommelse.

Hvis jeg tager helt fejl, må du meget gerne forklare nærmere :)



Jeg har kigget lidt nærmere på det, og har fundet ud af at AVL træer, nok er noget af det nemmeste at implementere.

Jeg har øvet mig lidt, og det tager ca. 20 minutter at skrive og teste følgende: (Jeg ved ikke om det er "flot kode" og sådan, for det er første gange jeg bruger pointers, men det skulle i hvert fald virke)
Fold kodeboks ind/udKode 


Så rent tidsmæssigt klarer jeg mig nok - selvom det ville være federe at kunne nogen tricks med set-strukturen :)
Så jeg er stadig meget interesseret i at høre svaret på det oprindelige spørgsmål!



t