Szukanie binarne

0

Nie mogę sobie poradzić z procedurką na wyszukiwanie binarne. Przeszukiwana jest lista dwukierunkowa. Dysponuję metodami First, Next, Prev oraz ilością elementów na liście. Szukam elementu w którym pole Numer : String jest równe danemu Stringowi. Metody Next i Prev jako opcjonalny parametr mogą przyjmować liczbę o ile rekordów przsunąć element bieżący (default = 1). Oczywiście lista jest posortowana po polu Numer ;]. Wskaźnik do elementu bieżącego - Current.

0

Wyszukiwanie binarne na liście? Mało sensowne, ale skoro już tak trzeba.

function Znajdź(ElementPoczątkowy, Szukane)
var
L = LiczbaElementów;
{
Lista := ElementPoczątkowy;
L := L div 2;
Lista := Next(Lista, L);
do
{
L := L div 2;
if Lista.Wartość Szukane then
Lista := Prev(Lista, L);
else
{
Result := Lista;
Exit;
}
} while L>1;
Result := null;
}

0

pogubiłem się ;( w czym to jest ? w Pascalu ?

P.S. dlaczego uważasz że mało sensowne ?

0
  1. Pseudojęzyk. Nie sam napisz kod. Na tacy otrzymywać nie będziesz. Zakodowanie tego w dowolnym języku jest prościutkie.
  2. Bezsensowne, bo nie ma się bezpośredniego dostępu poszczególnych elementów. Dostęp jest zależny od położenia elementu na liście. Żeby przsuńąć odczytać środkowy element trzeba i tak przejść po połowie listy. Nie można bezpośrednio.
0

No <font color="red">przecieŻ</span> ja nie z tych którzy chcą coś na tacy. Kod napisałem sam akurat w formie rekurencji, tylko coś brakuje. A co do pkt 2, to wobec Ciebie jak najlepiej przeszukiwać taką liste ? Moim zdaniem przeszukiwanie binarne i tak będzie szybsze od wyczerpującego (w ogólnym orzypadku.

//Nie cytuj całych postów! - m.M

0

Eh. A chciałem się pobawić :)

function Znajdz(ElementPoczatkowy: PEl; Szukane: string) : PEl;
var
L: Integer;
begin
L := LiczbaElementów;
Lista := ElementPoczatkowy;
L := L div 2;
Lista := Next(Lista, L);
repeat
L := L div 2;
if Lista^.Wartosc Szukane then
Lista := Prev(Lista, L)
else
begin
Result := Lista;
Exit;
end;
until L

0

U mnie to wygląda tak :
[code]
First;
l := Count div 2;
Next(l);
Repeat
l := l div 2;
If Current^.Numer > Numer then
Next(l)
else
Prev(l);
Until (l

0

Dorybates u Ciebie to działało co mi wkleiłeś ? Bo mi to co ja mam (a chyba to to samo) czasem nie znajduje punktów : ( !
First;
l := Count div 2;
Next(l);
Repeat
l := l div 2;
If Current^.Numer > Numer then
Next(l)
else
If Current^.Numer

0

Ano działać nie będzie :)

            First;
            l := Count div 2;
            Next(l);
            Repeat
                    l := l div 2;
                    If Current^.Numer > Numer then
                            Next(l)
                    else
                            If Current^.Numer 
0

to nie o to chodzi, nie działa przez tego div'a, szczególnie gdy ilość elmentów na liście jest nieparzysta : ( Chyba jednak zadowole się przeszukiwaniem wyczerpującym (idea optymalizacji sięgnęła bruku :()

1 użytkowników online, w tym zalogowanych: 0, gości: 1