Forum » Programiranje » 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:
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.
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
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.
Kaj si pa hotel povedati s tistim if(a[srednje]+1>el) ... ? Menda je, saj do tja šrideš le, če je a[srednje]==el.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [Java - DN] Naključna številaOddelek: Šola | 1355 (884) | nyler |
» | [java] kombinacijeOddelek: Programiranje | 2832 (2307) | napsy |
» | test sortiranjaOddelek: Programiranje | 1413 (957) | Yacked2 |
» | [C#] BisekcijaOddelek: Programiranje | 3285 (2657) | b4d |
» | Za programerske teoretikeOddelek: Programiranje | 8798 (5600) | Jerry000 |