» »

[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.

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?

darkolord ::

Kaj ti pa vrne?

Cvenemir ::

Recimo da mam polje {51, 51, 23, 56, ....}. Element ki ga iščem naj bo 51. Vrne mi indeks 1, namesto 0.

darkolord ::

Si siguren, da je bisekcija prava metoda za to nalogo?

Cvenemir ::

Jop. Izrecno je bilo naročeno, da morem uporabit bisekcijo.

genesiss ::

Array je neurejen?

Cvenemir ::

Urejen po velikosti. Od najnižjega do najvišjega števila.

genesiss ::

Ok. (za primer si dal neurejenega)

Preberi: http://reprog.wordpress.com/2010/04/25/...

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.

Spura ::

Aja, se odgovor na vprasanje. Ce hoces prvo pojavitev, potem moras na koncu ko imas indeks narest se tole:
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)

joze67 ::

Spura je izjavil:

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 ::

joze67 je izjavil:

Spura je izjavil:

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.
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.

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

Spura ::

V povprecju ta algoritem na realnih podatkih pogleda manj kot 2 dodatna elementa.

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...

Cvenemir ::

Problem je že rešen. Vseeno hvala :)

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...

Zgodovina sprememb…

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.
b4d.sablun.org


Vredno ogleda ...

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

Učinkovito iskanje intervalov [Psevdokoda]

Oddelek: Programiranje
121181 (854) Haniball
»

Za programerske teoretike

Oddelek: Programiranje
478798 (5600) Jerry000
»

Naprednješa knjiga o programiranju (koncepti, ...)

Oddelek: Programiranje
366102 (5273) noraguta
»

Preverjanje števil v tabeli

Oddelek: Programiranje
101687 (1552) Isotropic
»

Python iskanje podvojenih vrednosti

Oddelek: Programiranje
181488 (1201) BlueRunner

Več podobnih tem