private vor BrišiMin(vor vor) { if (vor.levo == null) { return(null); } if ((vor.levo != null && vor.levo.levo != null) && (!vor.levo.crven && !vor.levo.levo.crven)) { vor = SpojiLevo(vor); } vor.levo = BrišiMin(vor.levo); // provera uslova: if ((vor.desno != null && vor.desno.crven) && (vor.levo == null || !vor.levo.crven)) { vor = vor.RotirajLevo(); } if ((vor.levo != null && vor.levo.crven) && (vor.levo.levo != null && vor.levo.levo.crven)) { vor = vor.RotirajDesno(); } if ((vor.levo != null && vor.levo.crven) && (vor.desno != null && vor.desno.crven)) { vor.PromeniBoje(); } return(vor); }
public string Pretraga(int ključ, out int element, out Object obj) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); vor p = koren; int indeks; while (!p.terminal) { bool pom = p.NađiKljuč(ključ, out _, out indeks); if (pom || indeks > 0) { p = pom ? p.ključ[indeks].potomak : p.ključ[indeks - 1].potomak; } else { p = p.levo; } } if (p.NađiKljuč(ključ, out element, out indeks)) { obj = p.ključ[indeks].obj; } else { obj = null; element = -1; } stopwatch.Stop(); return(stopwatch.ElapsedMilliseconds + ""); }
internal vor(int ključ, object obj = null) { crven = false; this.obj = obj; levo = null; desno = null; this.ključ = ključ; }
internal vor() { crven = false; obj = null; levo = null; desno = null; ključ = default; }
internal vor(int n) { leviSused = null; desniSused = null; levo = null; ključ = new Ključ[n]; terminal = true; brojElemenata = 0; }
private vor SpojiDesno(vor vor) { vor.PromeniBoje(); if (vor.desno != null && vor.desno.levo != null && vor.desno.levo.crven) { vor = vor.RotirajDesno(); vor.PromeniBoje(); } return(vor); }
private vor Min(vor vor) { if (vor.levo == null) { return(vor); } else { return(Min(vor.levo)); } }
private vor SpojiLevo(vor vor) { vor.PromeniBoje(); if (vor.desno != null && vor.desno.levo != null && vor.desno.levo.crven) { // Dva crvena čvora za redom vor.desno = vor.desno.RotirajDesno(); vor = vor.RotirajLevo(); vor.PromeniBoje(); } return(vor); }
public string Dodaj(int ključ, object obj) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); koren = DodajČvor(koren, ključ, obj); koren.crven = false; brojElemenata++; stopwatch.Stop(); return(stopwatch.ElapsedMilliseconds + ""); }
internal vor RotirajDesno() { vor pom = this.levo; this.levo = pom.desno; pom.desno = this; pom.crven = this.crven; this.crven = true; return(pom); }
public string PretragaIntervala(int?početak, int?kraj, out List <int> rezultat) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); int d = početak ?? 0, g = kraj ?? 10000; vor p = koren; int indeks; rezultat = new List <int>(); while (!p.terminal) { bool pom = p.NađiKljuč(d, out _, out indeks); if (pom || indeks > 0) { p = pom? p.ključ[indeks].potomak : p.ključ[indeks - 1].potomak; } else { p = p.levo; } } if (p.NađiKljuč(d, out _, out indeks)) { int rez = d; rezultat.Add(rez); } indeks++; do { for (int i = indeks; i < p.ključ.Length; i++) { if (p.ključ[i].vrednost <= g) { int rez = p.ključ[i].vrednost; rezultat.Add(rez); } } p = p.desniSused; indeks = 0; } while (p != null); stopwatch.Stop(); return(stopwatch.ElapsedMilliseconds + ""); }
internal vor(vor vor) { this.terminal = vor.terminal; this.ključ = new Ključ[vor.ključ.Length]; for (int i = 0; i < vor.ključ.Length; i++) { this.ključ[i] = vor.ključ[i]; } leviSused = vor.leviSused; desniSused = vor.desniSused; levo = vor.levo; brojElemenata = vor.brojElemenata; }
private vor DodajČvor(vor vor, int noviKljuč, object noviElement) { if (vor == null) { return(new vor(noviKljuč, noviElement) { crven = true }); } if (vor.ključ == noviKljuč) { vor.obj = noviElement; } else { if (vor.ključ <= noviKljuč) { vor.desno = DodajČvor(vor.desno, noviKljuč, noviElement); } else { vor.levo = DodajČvor(vor.levo, noviKljuč, noviElement); } } // provera uslova: if ((vor.desno != null && vor.desno.crven) && (vor.levo == null || !vor.levo.crven)) { vor = vor.RotirajLevo(); } if ((vor.levo != null && vor.levo.crven) && (vor.levo.levo != null && vor.levo.levo.crven)) { vor = vor.RotirajDesno(); } if ((vor.levo != null && vor.levo.crven) && (vor.desno != null && vor.desno.crven)) { vor.PromeniBoje(); } return(vor); }
public string Brisanje(int ključ, out bool uspešnaOperacija) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); if (koren != null && koren.levo != null && koren.desno != null && !koren.levo.crven && !koren.desno.crven) { koren.crven = true; } koren = BrišiČvor(koren, ključ, out uspešnaOperacija); if (uspešnaOperacija) { brojElemenata--; } if (koren != null) { koren.crven = false; } stopwatch.Stop(); return(stopwatch.ElapsedMilliseconds + ""); }
public string Pretraga(int ključ, out bool izvršenaOperacija, out int element, out object obj) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); izvršenaOperacija = false; vor t = koren; element = -1; obj = null; while (t != null) { if (t.ključ == ključ) { element = t.ključ; obj = t.obj; izvršenaOperacija = true; break; } if (ključ < t.ključ) { t = t.levo; continue; } else { t = t.desno; continue; } } stopwatch.Stop(); return(stopwatch.ElapsedMilliseconds + ""); }
public RBstablo() { koren = null; brojElemenata = 0; }
public string Brisanje(int ključ) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); vor p = koren; int indeks; vor[] nizRoditelja = new vor[1000]; int[] nizIndeksa = new int[1000]; int v = 0; //bool noviKoren = false; while (!p.terminal) { bool pom = p.NađiKljuč(ključ, out _, out indeks); nizRoditelja[v] = p; if (pom || indeks > 0) { p = pom ? p.ključ[indeks].potomak : p.ključ[indeks - 1].potomak; nizIndeksa[v] = pom ? indeks : indeks - 1; } else { p = p.levo; nizIndeksa[v] = -1; } v++; } while (v > 0) { int višak; p.ObrišiKljuč(ključ); if ((p.leviSused != null && p.leviSused.brojElemenata + p.brojElemenata < stepen) || (p.desniSused != null && p.desniSused.brojElemenata + p.brojElemenata < stepen)) { // spajanje: vor sused = p.desniSused; bool desni = true;; if (sused == null || (p.leviSused != null && p.leviSused.brojElemenata < sused.brojElemenata)) { desni = false; sused = p.leviSused; višak = nizIndeksa[v - 1]; sused.desniSused = p.desniSused; if (p.desniSused != null) { p.desniSused.leviSused = sused; } } else { višak = nizIndeksa[v - 1] + 1; p.desniSused = sused.desniSused; if (sused.desniSused != null) { sused.desniSused.leviSused = p; } } int k = p.brojElemenata - 1; for (int i = 0; i < sused.brojElemenata; i++) { if (desni) { p.ključ[k++] = sused.ključ[i]; p.brojElemenata++; } else { sused.ključ[sused.brojElemenata] = p.ključ[i]; sused.brojElemenata++; } } // brisanje iz roditeljskog: vor trenutniRoditelj = nizRoditelja[v - 1]; if (desni) { if (višak >= trenutniRoditelj.brojElemenata) { // ključ se nalazi u susedu roditelja trenutniRoditelj = trenutniRoditelj.desniSused; višak = 0; } trenutniRoditelj.ključ = nizRoditelja[v - 1].ključ; trenutniRoditelj.brojElemenata = nizRoditelja[v - 1].brojElemenata; } p = nizRoditelja[v - 1]; v--; } else { break; } } stopwatch.Stop(); return(stopwatch.ElapsedMilliseconds + ""); }
public BplusStablo(int stepen) { koren = new vor(stepen); this.stepen = stepen; }
public BplusStablo() { koren = new vor(); stepen = 3; }
public string Dodavanje(int ključ, Object obj = null) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); vor p = koren; int indeks; vor[] nizRoditelja = new vor[1000]; int[] nizIndeksa = new int[1000]; int v = 0; bool noviKoren = true; while (!p.terminal) { bool pom = p.NađiKljuč(ključ, out _, out indeks); nizRoditelja[v] = p; if (pom || indeks > 0) { p = pom ? p.ključ[indeks].potomak : p.ključ[indeks - 1].potomak; nizIndeksa[v] = pom ? indeks : indeks - 1; } else { p = p.levo; nizIndeksa[v] = -1; } v++; } p.DodajKljuč(ključ); if (p.brojElemenata == stepen) { // cepanje: vor novi = new vor(stepen); int k = 0; for (int i = stepen >> 1; i < stepen; i++) { novi.ključ[k++] = p.ključ[i]; novi.brojElemenata++; } p.brojElemenata -= novi.brojElemenata; novi.leviSused = p; novi.desniSused = p.desniSused; if (p.desniSused != null) { p.desniSused.leviSused = novi; } p.desniSused = novi; // dodavanje u roditeljski: vor t = novi; while (v > 0) { v--; nizRoditelja[v].DodajKljuč(t.ključ[0].vrednost); if (nizRoditelja[v].ključ[nizIndeksa[v] + 1].potomak == null) { nizRoditelja[v].ključ[nizIndeksa[v] + 1].potomak = t; } else { throw new Exception("Jao ne"); } if (nizRoditelja[v].ključ.Length < stepen) { noviKoren = false; break; } // cepanje roditelja: vor noviRoditelj = new vor(stepen); vor roditelj = nizRoditelja[v]; k = 0; for (int i = stepen >> 1; i < stepen; i++) { noviRoditelj.ključ[k++] = roditelj.ključ[i]; noviRoditelj.brojElemenata++; } roditelj.brojElemenata -= noviRoditelj.brojElemenata; noviRoditelj.leviSused = roditelj; noviRoditelj.desniSused = roditelj.desniSused; if (roditelj.desniSused != null) { roditelj.desniSused.leviSused = noviRoditelj; } roditelj.desniSused = noviRoditelj; t = noviRoditelj; noviKoren = true; } if (noviKoren) { vor noviKorenStabla = new vor(stepen); noviKorenStabla.levo = koren; noviKorenStabla.ključ[0].potomak = t; noviKorenStabla.ključ[0].vrednost = t.ključ[0].vrednost; koren = noviKorenStabla; koren.brojElemenata = 1; } } stopwatch.Stop(); return(stopwatch.ElapsedMilliseconds + ""); }
private vor BrišiČvor(vor vor, int ključ, out bool uspešnaOperacija) { if (vor == null) { uspešnaOperacija = false; return(null); } if (vor.ključ > ključ) { if ((vor.levo != null && vor.levo.levo != null) && (!vor.levo.crven && !vor.levo.levo.crven)) { vor = SpojiLevo(vor); } vor.levo = BrišiČvor(vor.levo, ključ, out uspešnaOperacija); } else { if (vor.levo != null && vor.levo.crven) { vor = vor.RotirajDesno(); } if (ključ == vor.ključ && vor.desno == null) { uspešnaOperacija = true; return(null); } if ((vor.desno != null && vor.desno.levo != null) && !vor.desno.crven && !vor.desno.levo.crven) { vor = SpojiDesno(vor); } if (vor.ključ == ključ) { vor pom = Min(vor.desno); vor.ključ = pom.ključ; vor.obj = pom.obj; vor.desno = BrišiMin(vor.desno); uspešnaOperacija = true; } else { vor.desno = BrišiČvor(vor.desno, ključ, out uspešnaOperacija); } } // provera uslova: if (vor != null) { if ((vor.desno != null && vor.desno.crven) && (vor.levo == null || !vor.levo.crven)) { vor = vor.RotirajLevo(); } if ((vor.levo != null && vor.levo.crven) && (vor.levo.levo != null && vor.levo.levo.crven)) { vor = vor.RotirajDesno(); } if ((vor.levo != null && vor.levo.crven) && (vor.desno != null && vor.desno.crven)) { vor.PromeniBoje(); } } return(vor); }