Exemple #1
0
        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);
        }
Exemple #2
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 + "");
        }
Exemple #3
0
 internal vor(int ključ, object obj = null)
 {
     crven      = false;
     this.obj   = obj;
     levo       = null;
     desno      = null;
     this.ključ = ključ;
 }
Exemple #4
0
 internal vor()
 {
     crven = false;
     obj   = null;
     levo  = null;
     desno = null;
     ključ = default;
 }
Exemple #5
0
 internal vor(int n)
 {
     leviSused     = null;
     desniSused    = null;
     levo          = null;
     ključ         = new Ključ[n];
     terminal      = true;
     brojElemenata = 0;
 }
Exemple #6
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);
 }
Exemple #7
0
 private vor Min(vor vor)
 {
     if (vor.levo == null)
     {
         return(vor);
     }
     else
     {
         return(Min(vor.levo));
     }
 }
Exemple #8
0
 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);
 }
Exemple #9
0
        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 + "");
        }
Exemple #10
0
            internal vor RotirajDesno()
            {
                vor pom = this.levo;

                this.levo = pom.desno;

                pom.desno = this;

                pom.crven  = this.crven;
                this.crven = true;

                return(pom);
            }
Exemple #11
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 + "");
        }
Exemple #12
0
            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;
            }
Exemple #13
0
        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);
        }
Exemple #14
0
        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 + "");
        }
Exemple #15
0
        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 + "");
        }
Exemple #16
0
 public RBstablo()
 {
     koren         = null;
     brojElemenata = 0;
 }
Exemple #17
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 + "");
        }
Exemple #18
0
 public BplusStablo(int stepen)
 {
     koren       = new  vor(stepen);
     this.stepen = stepen;
 }
Exemple #19
0
 public BplusStablo()
 {
     koren  = new  vor();
     stepen = 3;
 }
Exemple #20
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 + "");
        }
Exemple #21
0
        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);
        }