Forum » Programiranje » [C#] Bisekcija
[C#] Bisekcija
Cvenemir ::
Lp.
Prosim za malo pomoči pri metodi PoisciZBisekcijo. Metoda bi naj vrnila indeks prve pojavitve iskanega elementa, vendar ga ne.
Any tips?
Prosim za malo pomoči pri metodi PoisciZBisekcijo. Metoda bi naj vrnila indeks prve pojavitve iskanega elementa, vendar ga ne.
static int PoisciZBisekcijo(int el, int[] a) { int levaStran = 0; int desnaStran = a.Length - 1; while (levaStran <= desnaStran) { int sredina = (levaStran + desnaStran) / 2;//Računanje sredine if (a[sredina] == el) { return sredina; } else if (el < a[sredina]) { desnaStran = sredina - 1; } else { levaStran = sredina + 1; } } return -1; }
Any tips?
Cvenemir ::
Recimo da mam polje {51, 51, 23, 56, ....}. Element ki ga iščem naj bo 51. Vrne mi indeks 1, namesto 0.
Spura ::
Na papir izvedi svojo kodo za arraye dolzine 0, 1, 2, 3, 4, 5
Ustrezno popravi kodo in po vsakem popravku ponovi teste od 0 naprej.
Ustrezno popravi kodo in po vsakem popravku ponovi teste od 0 naprej.
Spura ::
Aja, se odgovor na vprasanje. Ce hoces prvo pojavitev, potem moras na koncu ko imas indeks narest se tole:
Samo z bisekcijo ne bos nikoli mogel narest da vedno prvega zadane.
while(indeks > 0 && a[indeks - 1] == el) indeks--;
Samo z bisekcijo ne bos nikoli mogel narest da vedno prvega zadane.
joze67 ::
Takole je, tvoja koda ne bo vrnila indeksa prvega elementa. Pač pa (pravilno) indeks iskanega elementa.
Če želiš najti z bisekcijo prvi element, se ne smeš ustaviti, ko najdeš iskani element, ampak ko je iskani interval dolžine 1 (ali 2 z nekaj dodatnega dela). Primer: vsi elementi so 51, iščeš 51. Zakaj bi bisekcija vrnila 0, ko je n/2 čisto dovolj dober?
Na voljo imaš več strategiJ.
(1) ko najdeš iskani element, se linearno zapelješ proti levi do prvega manjšega ali do začetka. Slabost: linerana zahtevnost.
(2) Z bisekcijo greš vedno do konca (do intervala dolžine 1), pri čemer paziš, da kakšnega potencialnega kandidata ne izpustiš. Natančneje, ko imaš na sredini zadetek, greš gledat levi interval skupaj s sredino; medtem ko če je na sredini več, greš lahko gledat levi interval brez sredine (ker element na sredini ni več kandidat). Če boš delal preveč naivno, se bo stvar ustavila na intervalu dolžine 2 (oziroma še bolje, ne bo se ustavila, premaknila pa tudi ne)
Če želiš najti z bisekcijo prvi element, se ne smeš ustaviti, ko najdeš iskani element, ampak ko je iskani interval dolžine 1 (ali 2 z nekaj dodatnega dela). Primer: vsi elementi so 51, iščeš 51. Zakaj bi bisekcija vrnila 0, ko je n/2 čisto dovolj dober?
Na voljo imaš več strategiJ.
(1) ko najdeš iskani element, se linearno zapelješ proti levi do prvega manjšega ali do začetka. Slabost: linerana zahtevnost.
(2) Z bisekcijo greš vedno do konca (do intervala dolžine 1), pri čemer paziš, da kakšnega potencialnega kandidata ne izpustiš. Natančneje, ko imaš na sredini zadetek, greš gledat levi interval skupaj s sredino; medtem ko če je na sredini več, greš lahko gledat levi interval brez sredine (ker element na sredini ni več kandidat). Če boš delal preveč naivno, se bo stvar ustavila na intervalu dolžine 2 (oziroma še bolje, ne bo se ustavila, premaknila pa tudi ne)
joze67 ::
Samo z bisekcijo ne bos nikoli mogel narest da vedno prvega zadane.
Seveda lahko; še več, samo z bisekcijo lahko zagotovi, da bo ta element našel v logaritemskem času. Če se je pripravljen voziti po intervalu (linearen čas), se lahko vozi od začetka in išče iskani element.
Teoretično: med dva zaporedna elementa vstavimo aritmetično sredino sosednjih elementov. Dobimo polje velikosti 2n-1 - natančen premislek pokaže, da je treba nekaj (majhnega) vstaviti še pred prvi element in novo polje je lepo veliko 2n. No, in iščemo ne element x, ampak največji vstavljeni element, ki je manj kot x. Tak je točno eden in bisekcija na novem, večjem polju ga bo našla (s samo enim dodatnim korakom). Iskani element je potem desno od najdenega. QED.
Spura ::
Upam da trollas. A pregledat vse elemente in pregledat ponovljene elemente je isto? Sicer se pa da ampak to zakomplicira algoritem za enga zacetnika ful. V tvojem dokazu ni ocitno, da je nov scenarij enak prejsnjemu.Samo z bisekcijo ne bos nikoli mogel narest da vedno prvega zadane.
Seveda lahko; še več, samo z bisekcijo lahko zagotovi, da bo ta element našel v logaritemskem času. Če se je pripravljen voziti po intervalu (linearen čas), se lahko vozi od začetka in išče iskani element.
Teoretično: med dva zaporedna elementa vstavimo aritmetično sredino sosednjih elementov. Dobimo polje velikosti 2n-1 - natančen premislek pokaže, da je treba nekaj (majhnega) vstaviti še pred prvi element in novo polje je lepo veliko 2n. No, in iščemo ne element x, ampak največji vstavljeni element, ki je manj kot x. Tak je točno eden in bisekcija na novem, večjem polju ga bo našla (s samo enim dodatnim korakom). Iskani element je potem desno od najdenega. QED.
Zgodovina sprememb…
- spremenil: Spura ()
joze67 ::
Marsikateri med nama trolla, a jaz ne.
Če je polje polno enakih elementov, boš pri iskanju najbolj levega po vrsti pač pregledal 1/2 polja (po enem koraku bisekcije). Torej ja, pogledat vse elemente in ponovljene elemente je enako (faktor 2 ni omembe vreden).
Dokaz ... sem preveril in je še vedno očiten.
LP
Če je polje polno enakih elementov, boš pri iskanju najbolj levega po vrsti pač pregledal 1/2 polja (po enem koraku bisekcije). Torej ja, pogledat vse elemente in ponovljene elemente je enako (faktor 2 ni omembe vreden).
Dokaz ... sem preveril in je še vedno očiten.
LP
Adoo ::
Preprosto naj ti bisekcija poišče ta element in potem z še eno zanko zmanjšuj indeks tega poiskanega elementa dokler se ne pojavi kako drugo število ki ni enako najdenemu...
boss-tech ::
Meni ta prvi primer vrne index 3(iščem 3) - za primer: { -3, 1, 3, 3, 3, 8, 15 }
Moralo pa bi 4
Najt pa moram zadnjo pojavitev...
Moralo pa bi 4
Najt pa moram zadnjo pojavitev...
Zgodovina sprememb…
- spremenil: boss-tech ()
b4d ::
A je ucitelj v novem solskem letu samo malo spremenil nalogo?
Sicer pa si poglej odgovore od lani, ce malo pomislis (kar bos tekom solanja moral veckrat), bos ze stuhtal odgovor, glede na to da je problem samo malo zrcaljen.
Ce pa se vedno ne gre pa natancno povej kaj vse si poskusil in kje se zatakne.
Sicer pa si poglej odgovore od lani, ce malo pomislis (kar bos tekom solanja moral veckrat), bos ze stuhtal odgovor, glede na to da je problem samo malo zrcaljen.
Ce pa se vedno ne gre pa natancno povej kaj vse si poskusil in kje se zatakne.
b4d.sablun.org
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Učinkovito iskanje intervalov [Psevdokoda]Oddelek: Programiranje | 1181 (854) | Haniball |
» | Za programerske teoretikeOddelek: Programiranje | 8798 (5600) | Jerry000 |
» | Naprednješa knjiga o programiranju (koncepti, ...)Oddelek: Programiranje | 6102 (5273) | noraguta |
» | Preverjanje števil v tabeliOddelek: Programiranje | 1687 (1552) | Isotropic |
» | Python iskanje podvojenih vrednostiOddelek: Programiranje | 1488 (1201) | BlueRunner |