Metoda List łańcuchowych
Zakładanie kartoteki wyszukiwawczej:
Zakładamy iż znany jest system wyszukiwania S, a więc zbiór obiektów X, atrybutów A, wartości tych atrybutów V oraz funkcja informacji
: X A V
. Obiekty opisane są iloczynem odpowiednich niezaprzeczonych deskryptorów. Są one pamiętane w metodzie łańcuchowej w dowolnej kolejności. Obiektom przyporządkowujemy zbiór liczb zwanych adresami obiektów określony za pomocą funkcji:
N X
:
gdzie: N - zbiór liczb naturalnych.
W systemie zachodzi następująca zależność: (x) (y) tx ty
x , y X
,takie same adresy mają obiekty o jednakowym opisie deskryptorowym.
Definicja listy łańcuchowej
Dla każdego deskryptora di =(ai,vi)D (D - zbiór wszystkich deskryptorów systemu) tworzona jest lista Ł(di) o następującej postaci:
} ...
{ )
( d
in
1n
2n
kŁ
gdzie n1 jest adresem pierwszego obiektu zawierającego w swoim opisie deskryptor di, a
pozostałe elementy są odsyłaczami do kolejnych obiektów zawierających w swoim opisie ten deskryptor. Listę Ł(di) nazywamy listą łańcuchową deskryptora di.
Rodzaje odsyłaczy:
1. adresacja bezwzględna (odsyłacz jest rzeczywistym adresem obiektu w kartotece wyszukiwawczej)
2. adresacja względna (względem pierwszego obiektu w łańcuchu, względem pierwszego obiektu w bazie)
3. skok (jest różnicą między sąsiednimi adresami obiektów w liście)
Odsyłacze
Odsyłacze w listach łańcuchowych zawierają informację, gdzie znajduje się kolejny obiekt zawierający w swoim opisie dany deskryptor. Zazwyczaj umieszczane są one bezpośrednio przy każdym deskryptorze każdego obiektu w kartotece wyszukiwawczej. Do ustalenia adresów pozostałych obiektów można użyć następujących typów odsyłaczy:
a) Odsyłacz bezwzględny – zawiera on bezpośredni adres obiektu w kartotece wyszukiwawczej.
b) Odsyłacz względny – jest on tworzony względem pierwszego obiektu zawierającego w swoim opisie dany deskryptor.
c) Odsyłacz jako skok – zawiera różnicę pomiędzy adresami kolejnych obiektów zawierających w swoim opisie dany deskryptor.
Kartoteka Wyszukiwawcza
Kartotekę wyszukiwawczą tworzą opisy deskryptorowe obiektów z umieszczonymi zwykle bezpośrednio pod tym opisem odsyłaczami, tzn. odsyłacz jest umieszczony przy każdym deskryptorze bezpośrednio przy opisie obiektu.
Listy łańcuchowe nie są pamiętane w systemie, są generowane na bieżąco, w miarę
potrzeby. W pamięci oprócz obiektów z odsyłaczami umieszczamy tylko tablicę zakotwiczeń.
Dodatkowo w Kartotece Wyszukiwawczej tworzymy tzw. Tablicę Zakotwiczeń
Tablica ta dla każdego deskryptora di podaje adres pierwszego obiektu w łańcuchu i ilość
obiektów w łańcuchu (długość łańcucha ) :
tab ( d
i) ( n
1i, ( d
i) )
gdzie
n
1i ( x
1i)
jest to adres pierwszego takiego obiektu w Systemie, który w swoim opisie zawiera deskryptor di.
Kartoteka wtórna
Kartoteka wyszukiwawcza – odsyłacz jako adres bezwzględny
X a b c 1 X1 A1 2 B1 2 C1 5 2 X2 A1 5 B1 C2 6 3 X3 A2 4 B2 4 C3 7 4 X4 A2 7 B2 5 C4 8 5 X5 A1 6 B2 6 C1 6 X6 A1 B2 7 C2 7 X7 A2 8 B2 8 C3 8 X8 A2 B2 C4
di N1 Ł(di) (a,a1) 1 4 (a,a2) 3 4 (b,b1) 1 2 (b,b2) 3 6 (c,c1) 1 2 (c,c2) 2 2 (c,c3) 3 2 (c,c4) 4 2 Kartoteka wtórna z odsyłaczami
Tablica zakotwiczeń
Kartoteka wyszukiwawcza – odsyłacz jako adres względny
di N1 Ł(di) (a,a1) 1 4 (a,a2) 3 4 (b,b1) 1 2 (b,b2) 3 6 (c,c1) 1 2 (c,c2) 2 2 (c,c3) 3 2 (c,c4) 4 2
X a b c 1 X1 A1 +1 B1 +1 C1 +4 2 X2 A1 +4 B1 C2 +4 3 X3 A2 +1 B2 +1 C3 +4 4 X4 A2 +4 B2 +2 C4 +4 5 X5 A1 +5 B2 +3 C1 6 X6 A1 B2 +4 C2 7 X7 A2 +5 B2 +5 C3 8 X8 A2 B2 C4
Kartoteka wtórna z odsyłaczami
Tablica zakotwiczeń
Kartoteka wyszukiwawcza – odsyłacz jako skok
di N1 Ł(di) (a,a1) 1 4 (a,a2) 3 4 (b,b1) 1 2 (b,b2) 3 6 (c,c1) 1 2 (c,c2) 2 2 (c,c3) 3 2 (c,c4) 4 2
X a b c 1 X1 A1 +1 B1 +1 C1 +4 2 X2 A1 +3 B1 C2 +4 3 X3 A2 +1 B2 +1 C3 +4 4 X4 A2 +3 B2 +1 C4 +4 5 X5 A1 +1 B2 +1 C1 6 X6 A1 B2 +1 C2 7 X7 A2 +1 B2 +1 C3 8 X8 A2 B2 C4
Kartoteka wtórna z odsyłaczami
Tablica zakotwiczeń
t
mt t
t
1
2 ...
) ) ( , ( )
(di n1i di
tab
) ) ( , ( )
( i 1i i
t d
d n
d tab
i i
Proces wyszukiwania
Do systemu S pytanie zadajemy t:
Jeżeli term składowy jest pojedynczym deskryptorem to:
1.W tablicy zakotwiczeń znajdujemy
2.Generujemy zbiór obiektów ( zbiór adresów obiektów ) zgodnie ze znalezionym adresem.
Jeżeli term składowy jest iloczynem deskryptorów to:
1.Z tablicy zakotwiczeń znajdujemy łańcuchy dla wszystkich deskryptorów pytania 2.Wybieramy łańcuch najkrótszy
min:
} ) ( { )
(
min
min i
d
i d
d
i
3.Generujemy odpowiedz przybliżoną
)}
( {
)
( t
ix
mind
i
=
x
i4a).Metodą przeglądu zupełnego spośród odpowiedzi przybliżonej tworzymy odpowiedz dokładną:
) (
{ )
( t
ix
mind
i
j i i
x j
i t j
d
d d d t
}
lub
4b).Porównujemy elementy wybranego łańcucha min z pozostałymi łańcuchami i wybieramy tylko elementy wspólne, które stanowią odpowiedź na pytanie:
) (
( {
)
( t
ix
mind
i
1(
j),
i j)}
k
j
d d
d
Przykład wyszukiwania
T = (a,a1)(c,c2)
Z tablicy zakotwiczeń dla każdego deskryptora pytania pobieramy dostępne informacje:
Tab(a,a1) = (1,4) Tab(c,c2) = (2,2)
Wybieramy łańcuch minimalny, czyli taki, który ma mniej elementów, mniejszą długość (Ł(di)):
czyli łańcuch dla (c,c2)
Generujemy ten łańcuch dla (c,c2):
} 4
2 { )
,
( c c
2 Ł
} 6 , 2 { ) , (
6 4 2 4 )
(
2 )
(
2
1 )
, ( 2
1 )
, ( 1
2 2
c
Ł c
n x
n x
c c
c c
Jest to tzw. Odpowiedź przybliżona.
By wyszukiwać odpowiedź dokładną należy użyć jednej z dwóch metod:
} 6 , 2 { )
,
( c c
2 Ł
} 6 , 2 { )
( t
przybliżona
} ,
{ x
2x
6X
przybliżone
} )
, ( : {
)
( t x X
przybliżonea a
1 x
6 1
2 1
) , (
) , (
x a
a
x a
a
} ,
{ )
( t x
2x
6
} 5
4 1
1 { )
,
( a a
1 Ł
} 6 , 5 , 2 , 1 { ) , (
6 5 1 5 )
(
5 4 1 4 )
(
2 1 1 1 )
(
1 )
(
1
1 )
, ( 4
1 )
, ( 3
1 )
, ( 2
1 )
, ( 1
1 1 1 1
a Ł a
n x
n x
n x
n x
a a
a a
a a
a a
} ,
{ } 6 , 2 { } 6 , 5 , 2 , 1 { }
6 , 2 { )
( t x
2x
6
Czas wyszukiwania
Pytania ogólne.
i
i
d
t
gCzas wyszukiwania odpowiedz na pytanie ogólne jest równy czasowi generowania łańcucha.
Pytania szczegółowe.
k
i
d d d
t
1
2 ...
'
g
pgdzie
p- czas przeglądu odpowiedzi przybliżonej lub czas porównywania łańcuchów.
Redundancja i zajętość pamięci
Metoda nie wprowadza redundancji obiektowej ( opis każdego obiektu występuje tylko raz w bazie danych). Natomiast zajętość pamięci w stosunku do metody list prostych jest wyraźnie większa, gdyż pamiętać należy odsyłacze i tablicę zakotwiczeń. Łączna zajętość pamięci wynosi:
t o
x
M M
M
M
gdzie:
Mx- zajętość pamięci wynikająca z liczby obiektów w bazie danych,
Mo- zajętość pamięci związana z koniecznością pamiętania odsyłaczy,
Mt Mt- zajętość pamięci związana z pamiętaną tablicą zakotwiczeń.
Struktura kartoteki wyszukiwawczej jest złożona w porównaniu do poprzednich metod. Każdy deskryptor w opisie obiektu zostaje rozszerzony o odsyłacz względny, bezwzględny lub przez skok. Pozwala on ustalić adres kolejnego obiektu który w swoim opisie posiada dany deskryptor. Dodatkowo należy stworzyć tak zwaną tablicę zakotwiczeń z adresem pierwszego obiektu posiadającego w swoim opisie ten deskryptor oraz liczbą adresów obiektów zawierających dany deskryptor.
W przypadku pytań jednodeskryptorowych odpowiedź uzyskiwana jest szybko poprzez wygenerowanie odpowiedniej listy łańcuchowej. Natomiast gdy pytanie występuje w postaci sumy termów składowych, odpowiedź wyznaczana jest w jeden ze znanych sposobów wyszukiwania (jako odpowiedź dokładna wcześniej uzyskanej z łańcucha najkrótszego odpowiedzi przybliżonej) bądź …poprzez sumę logiczną odpowiedzi na termy składowe wyznaczone z przecięcia łańcuchów wygenerowanych dla deskryptorów zawartych w opisie termu składowego. Odpowiedź na term składowy można uzyskać także poprzez przegląd zupełny obiektów którym odpowiadają adresy znajdujące się w najkrótszym łańcuchu spośród łańcuchów dla deskryptorów pytania.
Metoda nie wprowadza redundancji. Ze względu na dość kłopotliwą aktualizację, system wykorzystujący do wyszukiwania informacji metodę list łańcuchowych powinien pracować w trybie wsadowym.. W niniejszym rozdziale pracy został przedstawiony szczegółowy opis metody list inwersyjnych, jej modyfikacji, a także zostały dokładnie omówione wszystkie parametry charakterystyczne dla tej metody.
Sposób wyszukiwania został zilustrowany na praktycznym przykładzie.
Wady i zalety
ZALETY:
- szybki proces wyszukiwania, - brak redundancji,
WADY:
- duża zajętość pamięci,
- skomplikowana i czasochłonna aktualizacja
Modyfikacje
Bezpośrednią przyczyną stworzenia modyfikacji metody list łańcuchowych jest główna wada jej klasycznej wersji, czyli złożony i czasochłonny proces aktualizacji.
Realizowane są następujące modyfikacje metody list łańcuchowych:
1. Łańcuchowanie w tył
2. Podwójne łańcuchowanie
3. Łańcuchowanie grup obiektów
łańcuchowanie w tył
Modyfikacja ta różni się od wersji klasycznej budową list łańcuchowych, przy zastosowaniu łańcuchowania w tył mają one następującą postać:
Ł( )={ - - … - }
gdzie oznacza adres ostatniego obiektu, który zawiera w swoim opisie deskryptor , dla którego tworzona jest lista łańcuchowa. Natomiast kolejne elementy listy to odsyłacze do adresów poprzednich obiektów zawierających w swoim opisie deskryptor . Zmiana kolejności obiektów w listach łańcuchowych pociąga za sobą także zmianę zawartości odsyłaczy przy opisach obiektów.
Wdrożenie modyfikacji wymaga także zmiany pierwszej kolumny w tablicy zakotwiczeń. Będzie ona teraz dla każdego deskryptora zawierała adres nie pierwszego, a ostatniego obiektu zawierającego w swoim opisie dany deskryptor.
Łańcuchowanie w tył nie zmienia redundancji, zajętości pamięci ani algorytmu służącego do wyszukiwania informacji. O wyborze metody z łańcuchowaniem w przód lub w tył decyduje projektant systemu biorąc pod uwagę sposób napływania informacji do systemu lub dodatkowe czynniki decydujące o umieszczeniu obiektów w pamięci maszyny cyfrowej.
Podwójne łańcuchowanie
Przy wprowadzaniu modyfikacji metody list łańcuchowych poprzez łańcuchowanie w obie strony rozszerzeniu ulega także tablica zakotwiczeń. Będzie ona teraz dla każdego deskryptora zawierała adres pierwszego i ostatniego obiektu który zawiera w swoim opisie dany deskryptor, oraz łączną liczbę adresów obiektów w liście łańcuchowej dla tego deskryptora.
Kartoteka wtórna z Tablica zakotwiczeń odsyłaczami wprzód i w tył
X a ↑ b ↑ c ↑ 1 X1 A1 +1 B1 +1 C1 +4 2 X2 A1 +3 -5 B1 -1 C2 +4 3 X3 A2 +1 B2 +1 C3 +4 4 X4 A2 +3 -5 B2 +1 -1 C4 +4 5 X5 A1 +1 -4 B2 +1 -1 C1 -4 6 X6 A1 -1 B2 +1 -1 C2 -4 7 X7 A2 +1 -4 B2 +1 -1 C3 -4 8 X8 A2 -1 B2 -1 C4 -4
di N1 Nk Ł(di) (a,a1) 1 6 4 (a,a2) 3 8 4 (b,b1) 1 2 2 (b,b2) 3 8 6 (c,c1) 1 5 2 (c,c2) 2 6 2 (c,c3) 3 7 2 (c,c4) 4 8 2
Tak samo jak poprzednia modyfikacja, łańcuchowanie w przód oraz w tył nie powoduje zmian w procesie wyszukiwania, jednakże znacznie ułatwia znalezienie wszystkich obiektów w łańcuchu, co przyśpiesza proces aktualizacji kartoteki wyszukiwawczej. Struktura bazy danych jest bardziej złożona niż w wersji klasycznej metody, z powodu rozszerzenia opisów obiektów (o dwa rodzaje odsyłaczy) i tablicy zakotwiczeń. Wprowadzenie tej modyfikacji determinuje także zwiększoną zajętość pamięci, która wynosi:
= + + gdzie:
- Zajętość pamięci wynikająca z liczby obiektów w systemie,
- zajętość pamięci wynikająca z konieczności pamiętania odsyłaczy w opisach obiektów,
- zajętość pamięci potrzebna do pamiętania tablicy zakotwiczeń. Wartość ta jest większa, niż w wersji klasycznej, z powodu powiększenia się tablicy o dodatkową kolumnę.
łańcuchowanie grup obiektów
Ostatnią analizowaną w tej pracy modyfikacją metody list łańcuchowych jest łańcuchowanie grup obiektów. Polega ona na wyznaczeniu ze zbioru D tzn. zbioru wszystkich deskryptorów w systemie pewnego podzbioru D’, takiego że D’ ⊆ D. W zbiorze tym powinny znaleźć się deskryptory najczęściej występujące w pytaniach zadawanych do systemu. Następnie opisy obiektów są rozszerzane o odsyłacze tylko dla deskryptorów należących do zbioru D’.
Kartoteka wtórna z Tablica zakotwiczeń odsyłaczami względnymi
X a b c 1 X1 A1 +1 B1 +1 C1 +4 2 X2 A1 +3 B1 C2 +4 3 X3 A2 +1 B2 +1 C3 +4 4 X4 A2 +3 B2 +1 C4 +4 5 X5 A1 +1 B2 +1 C1 6 X6 A1 B2 +1 C2 7 X7 A2 +1 B2 +1 C3 8 X8 A2 B2 C4
di N1 Ł(di) (a,a1) 1 4 (a,a2) 3 4 (b,b1) 1 2 (b,b2) 3 6 (c,c1) 1 2 (c,c2) 2 2 (c,c3) 3 2 (c,c4) 4 2
Kartoteka wtórna z Tablica zakotwiczeń odsyłaczami względnymi
X a b c 1 X1 A1 +1 B1 C1 +4 2 X2 A1 +3 B1 C2 3 X3 A2 B2 +1 C3 +4 4 X4 A2 B2 +1 C4 5 X5 A1 +1 B2 +1 C1 6 X6 A1 B2 +1 C2 7 X7 A2 B2 +1 C3 8 X8 A2 B2 C4
di N1 Ł(di) (a,a1) 1 4 (b,b2) 3 6 (c,c1) 1 2 (c,c3) 3 2
Przykład wyszukiwania
T = (a,a1)(c,c2)
Z tablicy zakotwiczeń dla każdego deskryptora pytania pobieramy dostępne informacje:
Tab(a,a1) = (1,4)
Tab(c,c2) = brak informacji
Wybieramy łańcuch minimalny, czyli taki, który ma mniej elementów, mniejszą długość (Ł(di)):
czyli łańcuch dla (a,a1)
Generujemy ten łańcuch dla (a,a1):
} 5
4 1
1 { )
,
( a a
1
Ł
} 6 , 5 , 2 , 1 { ) , (
6 5 1 5 )
(
5 4 1 4 )
(
2 1 1 1 )
(
1 )
(
1
1 )
, ( 4
1 )
, ( 3
1 )
, ( 2
1 )
, ( 1
1 1 1 1
a Ł a
n x
n x
n x
n x
a a
a a
a a
a a
Jest to tzw. Odpowiedź przybliżona.
Teraz należy przejrzeć opisy wskazanych tak obiektów i sprawdzić, czy zawierają one w swoim opisie te deskryptory pytania, które nie występują w tablicy zakotwiczeń, bo nie utworzono dla nich łańcuchów.
tak odp
x c
c
NIE odp
x c
c
tak odp
x c
c
NIE odp
x c
c
:
? )
, (
:
? )
, (
:
? )
, (
:
? )
, (
6 2
5 2
2 2
1 2
} ,
{ } 6 , 2 { )
( t x
2x
6
Podsumowanie metody łańcuchowej
Metoda wyszukiwani
a
Struktura Bazy danych Redundancja Zajętość pamięci
Metoda List Łańcuchowyc h
Najbardziej złożona. Wynika to z
konieczności pamiętania odsyłaczy oraz tablicy zakotwiczeń.
Brak.
Informacje o obiektach są pamiętane tylko raz.
Większa niż w MLP, mniejsza niż w MLI, wynosi ona:
= + +
- Zajętość pamięci wynikająca z liczby obiektów w systemie.
- Zajętość pamięci wynikająca z
konieczności pamiętania odsyłaczy w opisach obiektów.
- Zajętość pamięci
potrzebna do pamiętania tablicy zakotwiczeń.
Implementacja
łańcuchowania w dwie strony zwiększa zajętość pamięci.
Podsumowanie wszystkich trzech metod
Metoda Struktura Bazy danych Redundancja Zajętość pamięci Metoda List
Prostych
Najprostsza. Opisy wszystkich obiektów, umieszczonych w
dowolnej kolejności. Nieznacznie zwiększona po wprowadzeniu modyfkacji.
Brak. Informacje o obiektach są pamiętane tylko raz.
Najmniejsza, wynosi ona:
M = N ∙ m0
N-Liczba obiektów,
- Zajętość pamięci potrzebna do pamiętania informacji o 1 obiekcie.
Zwiększona po wprowadzeniu modyfikacji.
Metoda List Inwersyjnych
Zwiększona złożoność w
porównaniu do MLP. Wynika to z konieczności pamiętania list
inwersyjnych. Dodatkowo
zwiększona przy wprowadzeniu dekompozycji.
Największa.
r- Liczba deskryptorów w systemie,
- Deskryptory
występujące w systemie.
N- Liczba adresów obiektów w systemie.
Największa, wynosi ona:
=
r- Liczba deskryptorów systemu,
-Zajętość pamięci potrzebna do pamiętania listy inwersyjnej.
Modyfikacje metody zmniejszają zajetośc pamięci.
Metoda List Łańcuchowy ch
Najbardziej złożona. Wynika to z konieczności pamiętania
odsyłaczy oraz tablicy zakotwiczeń.
Brak. Informacje o obiektach są pamiętane tylko raz.
Większa niż w MLP, mniejsza niż w MLI, wynosi ona:
= + +
- Zajętość pamięci wynikająca z liczby obiektów w systemie.
- Zajętość pamięci wynikająca z konieczności pamiętania odsyłaczy w opisach obiektów.
- Zajętość pamięci potrzebna do pamiętania tablicy zakotwiczeń. Implementacja
łańcuchowania w dwie strony zwiększa zajętość pamięci.