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 + ""); }
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 + ""); }
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 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 + ""); }