» »

Pomoč pri iskanju z bisekcijo

Pomoč pri iskanju z bisekcijo

meh ::

Pozdravljeni

Problem je sledeč:
Za vaje imamo, da s pomočjo bisekcije v urejenem seznamu poiščemo in vrnemo zadnje ponavljanje nekega elementa.
Primer:
imamo tabelo(-5,0,3,3,3,5,6,6,7) in nas zanima na kolikšnem mestu v tabeli se nahaja zadnje ponavljanje števila 3. Rešitev, ki bi jo moral program vrniti je število 4.

Problem, ki pa je nastal pri meni pa je sledeč:
Program deluje vendar pa se zatakne pri izpisu največjega elementa, kjer dobim napako "IndexOutOfRangeException" vem, da je vzrok za to napako, da je index večje vrednosti od velikosti tabele.
Ampak sem že poskušal rešiti napako na več načinov pa se mi zmeraj nekje zatakne.

tukaj je moj program:
static int poisciZBisekcijo(int el, int[] a)
        {
            int min = 0;
            int max = a.Length-1;
            int srednje;
            //v kolikor je še možno pregledovati števila
            while (min <= max)
            {
                srednje = (min + max) / 2; //Izračun srednje vrednsoti tabele

                //Če je iskalni element večji od vrednosti na sredini tabele
                if (a[srednje] < el)
                {
                    min = srednje + 1; //Sredina postane nova spodnja meja  
                }
                else
                    if (a[srednje] > el) //Če je iskalni element manjši
                    {
                        max = srednje - 1; // Sredina postane nova zgornja meja
                    }

                if (a[srednje] == el)
                {
                    if (a[srednje] + 1 < el)
                    {
                        return srednje;
                    }
                    while (a[srednje] == el)
                    {
                        srednje = srednje + 1;
                        if (a[srednje] > el)
                        {
                            return srednje-1;
                        }
                    }
                    
                }
            }

korenje3 ::

jaz sem prav alergičen na while ukaz. če gre kej narobe, ti program zmrzne, računalnik pa pokuri ogromno štroma.

karkoli že, po moje je problem a[srednje] kjer postane index prevelik.
i9-12900k; 32GB DDR5-6000 CL36; Nvidia RTX 3080 ti;
Gigabyte Aorus z690 master; Be Quiet Dark Power 12 1000W

joze-67 ::

Odleti ti zadnji while, ko s srednje lezeš proti desni. Ko si na zadnjem elementu, na desno ne smeš. Torej while (srednje < a.Length && a[srednje]==el) ... pa potem še poskrbi, da če je srednje == a.Length moraš pač en korak nazaj. No, dalo bi se sicer tudi lepše.

Kaj si pa hotel povedati s tistim if(a[srednje]+1>el) ... ? Menda je, saj do tja šrideš le, če je a[srednje]==el.

genesiss ::



Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Java - DN] Naključna števila

Oddelek: Šola
121355 (884) nyler
»

[java] kombinacije

Oddelek: Programiranje
212823 (2298) napsy
»

test sortiranja

Oddelek: Programiranje
91409 (953) Yacked2
»

[C#] Bisekcija

Oddelek: Programiranje
183282 (2654) b4d
»

Za programerske teoretike

Oddelek: Programiranje
478796 (5598) Jerry000

Več podobnih tem