示例#1
0
        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 + "");
        }
示例#2
0
        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 + "");
        }
示例#3
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 + "");
        }
示例#4
0
        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 + "");
        }