Algorytmy i struktury danych/Wyszukiwanie: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Walen (dyskusja | edycje)
Walen (dyskusja | edycje)
Linia 39: Linia 39:
== Drzewa poszukiwań binarnych ==
== Drzewa poszukiwań binarnych ==


Drzewa poszukiwań binarnych, to zwykłe drzewa binarne, których węzły dodatkowo
Drzewa poszukiwań binarnych, to zwykłe drzewa binarne,  
przechowują klucze.
których klucze spełniają następujące własności:
Dodatkowo wymagamy by klucze spełniały następującą własność:


Dla dowolnego węzła ''x'':
Dla dowolnego węzła ''x'':
Linia 55: Linia 54:
         '''return''' BRAK ELEMENTU
         '''return''' BRAK ELEMENTU
     '''if''' (wezel.klucz=klucz) '''then'''
     '''if''' (wezel.klucz=klucz) '''then'''
         '''return''' ELEMENY ISTNIEJE
         '''return''' ELEMENT ISTNIEJE
     ''' else if (klucz < wezel.klucz) '''then'''
     ''' else if (klucz < wezel.klucz) '''then'''
         '''return''' Szukaj(wezel.lewePoddrzewo, klucz)
         '''return''' Szukaj(wezel.lewePoddrzewo, klucz)
     ''' else if (klucz > wezel.klucz) '''then'''
     ''' else if (klucz > wezel.klucz) '''then'''
         '''return''' Szukaj(wezel.prawPoddrzewo, klucz)
         '''return''' Szukaj(wezel.prawPoddrzewo, klucz)
  '''end''';
Wstawianie do drzewa jest bardzo zbliżone do wyszukiwania, musimy przejść po drzewie (rozpoczynająć w korzeniu)
aby odnaleźć wolne miejsce w którym możemy dodać nową wartość.
  '''procedure''' Dodaj(wezel, klucz)
    '''if''' (klucz < wezel.klucz) '''then'''
        '''if''' wezel.lewePoddrzewo=nil '''then'''
            utwórz nowy węzeł z wartością ''klucz''
            wskaźnik do nowego węzła zapisujemy w wezel.lewePoddrzewo
        '''else'''
            Dodaj(wezel.lewePoddrzewo, klucz)
    ''' else if (klucz >= wezel.klucz) '''then'''
        '''if''' wezel.prawePoddrzewo=nil '''then'''
            utwórz nowy węzeł z wartością ''klucz''
            wskaźnik do nowego węzła zapisujemy w wezel.prawePoddrzewo
        '''else'''
            Dodaj(wezel.prawePoddrzewo, klucz)
   '''end''';
   '''end''';


TODO
TODO


* wstawianie
* usuwanie
* usuwanie



Wersja z 09:34, 4 sie 2006

Wyszukiwanie


W niniejszym wykładzie opiszemy podstawowe techniki dotyczące wyszukiwania. Zajmiemy się również prostymi strukturami słownikowymi, które oprócz wyszukiwania, umożliwiają dodawanie i usuwanie elementów.


Wyszukiwanie liniowe

TODO

function Szukaj(x, A[1..n])
begin
  for i:=1 to n do
    if A[i]=x return i;
  return brak poszukiwanego elementu;
end

Wyszukiwanie binarne

TODO

function WyszukiwanieBinarne(x, A[1..n])
{ zakładamy, że tablica A, jest uporządkowana rosnąco }
begin
  l:=1;r:=n;
  while (l<=r) do begin
    m:=(l+r) div 2;
    if (A[m]<x) then l:=m+1
    else if (A[m]>x) then r:=m-1
    else return m; { ponieważ A[m]=x } 
  end;
  return brak poszukiwanego elementu;
end;

Drzewa poszukiwań binarnych

Drzewa poszukiwań binarnych, to zwykłe drzewa binarne, których klucze spełniają następujące własności:

Dla dowolnego węzła x:

  • wszystkie klucze w lewym poddrzewie węzła x, mają wartości mniejsze niż klucz węzła x,
  • wszystkie klucze w lewym poddrzewie węzła x, mają wartości większe lub równe niż klucz węzła x.

TODO -- przykładowe drzewo

Dodatkowe wymaganie dotyczące kluczy, umożliwia nam efektywne wszyskiwanie elementów w drzewie.

 function Szukaj(wezel, klucz)
    if (wezel==nil) 
       return BRAK ELEMENTU
    if (wezel.klucz=klucz) then
       return ELEMENT ISTNIEJE
     else if (klucz < wezel.klucz) then
       return Szukaj(wezel.lewePoddrzewo, klucz)
    else if (klucz > wezel.klucz) then
       return Szukaj(wezel.prawPoddrzewo, klucz)
 end;

Wstawianie do drzewa jest bardzo zbliżone do wyszukiwania, musimy przejść po drzewie (rozpoczynająć w korzeniu) aby odnaleźć wolne miejsce w którym możemy dodać nową wartość.

 procedure Dodaj(wezel, klucz)
    if (klucz < wezel.klucz) then
       if wezel.lewePoddrzewo=nil then
           utwórz nowy węzeł z wartością klucz
           wskaźnik do nowego węzła zapisujemy w wezel.lewePoddrzewo
       else
           Dodaj(wezel.lewePoddrzewo, klucz)
     else if (klucz >= wezel.klucz) then
       if wezel.prawePoddrzewo=nil then
           utwórz nowy węzeł z wartością klucz
           wskaźnik do nowego węzła zapisujemy w wezel.prawePoddrzewo
       else
           Dodaj(wezel.prawePoddrzewo, klucz)
 end;

TODO

  • usuwanie

Haszowanie

TODO