System informacyjny S = < X, A, V, \rho > przechowuje obiekty w dowolnej kolejności. Istnieje funkcja adresacji \mu przyporządkowująca adresy numeryczne wszystkim obiektom zbioru :

\mu: X \to N 

gdzie: – to zbiór liczb naturalnych.

Analogicznie jak w przypadku list inwersyjnych zachodzi zależność:

\mu(x) = \mu(y) \quad \iff \quad t_x = t_y

W takim systemie dla każdego deskryptora d_i = ( a_i, v_i ) \in D tworzymy listę:

\mathcal{L}(d_i) = \{n_1 - \overline{n}_2 - ... - \overline{n}_n \}

gdzie: n_1 = \mu(x^i_1) jest adresem pierwszego wystąpienia obiektu zawierającego w swoim opisie deskryptor d_i , a kolejne są referencjami względnymi (odsyłaczami w adresacji pośredniej względem obiektu bazowego x_1 o adresie n_1 ). Tak stworzona lista \mathcal{L}(d_i) jest listą łańcuchową deskryptora )d_i. Bazując na liście można łatwo określić adresy obiektów zawierających w swoim opisie deskryptor d_i :

\mu(x^i_1) = n_1, \quad \mu(x^i_2) = n_1 + \overline{x}_2, \quad ... , \quad \mu(x^i_j) = n_1 + \overline{n}_j

gdzie: x^1_j to j-ty obiekt zawierający w swoim opisie deskryptor d_i .

UWAGA: Można także alternatywnie ustalić adresację obiektów posługując się adresem pośrednim pomiędzy dwoma kolejnymi obiektami x_i zawierającymi d_i – w ten sposób wyznaczanie adresu każdego obiektu w systemie polega na zsumowaniu adresów wszystkich poprzedzających go elementów należących do danej listy łańcuchowej \mathcal{L}(d_i).

Tak określone listy łańcuchowe nie są jednakże pamiętane w systemie. System przechowuje opisy obiektów x wraz z odnośnikami do kolejnych obiektów ze zgodnym deskryptorem; oraz tworzona jest tablica zakotwień list łańcuchowych, gdzie przechowuje się informację o pierwszym adresie obiektu zawierającym poszukiwany deskryptor i długość listy łańcuchowej dla tego deskryptora.

tab(d_1) = \lgroup n_1, \overline{\overline{\mathcal{L}(d_i)}} \rgroup dla d_i \in D

gdzie: n_1 = \mu(x^i_1) .

Wyszukiwanie w systemie

Do systemu zadajemy pytanie t będącego sumą termów składowych t = t_1 + t_2 + ... + t_m, a odpowiedź jest sumą odpowiedzi na termy składowe.

Przypadek 1

Jeśli pytaniem jest term prosty t_i = d_i to odpowiedź uzyskujemy odnajdując w tablicy zakotwień adres pierwszego obiektu będącego odpowiedzią na pytanie oraz moc (liczebność) zbioru (n_1, \overline{\overline{\mathcal{L}(d_i)}} ). Generując listę łańcuchową dla tego deskryptora uzyskujemy dostęp do wszystkich obiektów posiadających go w swoim opisie.

Przypadek 2

W sytuacji, gdy pytaniem jest term złożony t_1 = d_1 \cdot d_2 \cdot ... \cdot d_k poszukiwanie rozpoczynamy od znalezienia wszystkich inicjatorów list łańcuchowych w tablicy zakotwień dla deskryptorów będących częścią termu. Następnie wybieramy łańcuch \mathcal{L_{min}} o najniższej liczebności.

\mathcal{L}_{min}(d_i) = \underset{d_i}{min} \{\overline{\overline{\mathcal{L}(d_1)}}\}

Następnie możliwe są dwa scenariusze postępowania:

Przegląd zupełny obiektów x_i wchodzących w skład najkrótszej listy łańcuchowej celem zweryfikowania, które obiekty z listy posiadają zgodność dla pozostałych deskryptorów pytania.

\sigma(t_i) = \{ x_i \in \mathcal{L}_{min}(d_i)\mathcal{\&} \quad \underset{d_j \in t_i}\bigwedge d_j \neq d_i \Rightarrow d_j \in t_{x_i} \}

Przecięcie list łańcuchowych dla pozostałych deskryptorów z wybraną, najkrótszą listą łańcuchową obiektów celem określenia zbioru obiektów z części wspólnej przecięcia tych list.

\sigma(t_i) = \{ x_i \in \lgroup \mathcal{L}_{min}(d_i) \cap ( \underset{j}\bigcap \; \mathcal{L}(d_j)) \rgroup, d_i, d_j \in t_{x_i} \}

Przykład wyszukiwania

Odnosząc się do naszego flagowego przykładu bazy informacyjnej dokonajmy jej przekształcenia do list łańcuchowych. Taka kartoteka wtórna może przyjąć postać:

Adres obiektuOpis obiektuOdsyłaczeAdres obiektuOpis obiektuOdsyłacze
x_{1}M+3x_{11}K+10
b+2b+11
W+4W+13
D+4D+13
PR+16DR+8
x_{2}K+1x_{12}K+12
c+4b+12
S+2S+11
A+1T+9
BT+1BT+11
x_{3}K+5x_{13}M+14
b+4b+13
PRøSø
AøTø
BT+2BTø
x_{4}M+4x_{14}K+17
aøb+17
S+10W+14
T+8D+14
BT+10DR+12
x_{5}M+5x_{15}M+15
b+8c+14
W+5W+15
D+5D+15
MR+5DC+8
x_{6}M+7x_{16}M+16
c+5c+15
W+6W+16
D+6D+16
DR+1DCø
x_{7}K+7x_{17}M+17
c+6cø
W+7W+17
D+7D+17
DR+3PRø
x_{8}M+9x_{18}Mø
c+13b+18
W+8W+18
D+8D+18
DC+7DR+14
x_{9}K+9x_{19}K+18
b+9b+19
W+9W+19
D+9D+19
DR+5MRø
x_{10}M+12x_{20}Kø
b+10bø
W+10Wø
D+10Dø
MR+14DRø

Dla uproszczenia przyjęto, że numer obiektu jest jego adresem. Na podstawie kartoteki wtórnej jesteśmy w stanie wygenerować listy łańcuchowe i przybiorą one postać:

  • \mathcal{L}(M) = {1 – 3 – 4 – 5 – 7 – 9 – 12 – 14 – 15 – 16 – 17 – ø},
  • \mathcal{L}(K) = {2 – 1 – 5 – 7 – 9 – 10 – 12 – 17 – 18 – ø},
  • \mathcal{L}(a) = {4 – ø},
  • \mathcal{L}(b) = {1 – 2 – 4 – 8 – 9 – 10 – 11 – 12 – 13 – 17 – 18 – 19 – ø},
  • \mathcal{L}(c) = {2 – 4 – 5 – 6 – 13 – 14 – 15 – ø},
  • \mathcal{L}(P) = {3 – ø},
  • \mathcal{L}(S) = {2 – 2 – 10 – 11 – ø},
  • \mathcal{L}(W) = {1 – 4 – 5 – 6 – 7 – 8 – 9 – 10 – 13 – 14 – 15 – 16 – 17 – 18 – 19 – ø}
  • \mathcal{L}(A) = {2 – 1 – ø},
  • \mathcal{L}(D) = {1 – 4 – 5 – 6 – 7 – 8 – 9 – 10 – 13 – 14 – 15 – 16 – 17 – 18 – 19 – ø},
  • \mathcal{L}(T) = {4 – 8 – 9 – ø},
  • \mathcal{L}(BT) = {2 – 1 – 2 – 10 – 11 – ø},
  • \mathcal{L}(MR) = {5 – 5 – 14 – ø},
  • \mathcal{L}(DR) = {6 – 1 – 3 – 5 – 8 – 12 – 14 – ø},
  • \mathcal{L}(DC) = {8 – 7 – 8 – ø},
  • \mathcal{L}(PR) = {1 – 16 – ø}.

Jak widać listy łańcuchowe w przypadku tego systemu zostały zdefiniowane jako adres bazowy + przesunięcie względem adresu bazowego. Kolejną cechą jest terminowanie takiej listy znakiem ø (null) informującym, że nie występuje już kolejny obiekt posiadający ten deskryptor w opisie.

W takim systemie niezbędna jest tabela zakotwień, gdzie umieścimy adresy bazowe dla wszystkich występujących w systemie deskryptorów i wygląda ona następująco:

Deskryptor d_iAdres bazowyDługość łańcucha
M111
K29
a41
b112
c27
P31
S24
W115
A22
D115
T43
BT25
MR53
DR67
DC83
PR12

Przeanalizujmy procedurę znalezienia odpowiedzi na zadane do systemu pytania.

Przykład 1

Podaj osoby będące pracownikami dydaktycznymi w wieku pomiędzy 20 a 35 lat.

Takie pytanie można sformalizować w postaci termu:

t_1 = (A4, D) \cdot (A2,b)

W tablicy zakotwień odnajdujemy oba deskryptory i wybieramy krótszą listę do dalszego przetwarzania:

tab(D) = (1, 15) \qquad tab(b) = (1,12) \quad \Rightarrow \quad \mathcal{L}_{min} = \mathcal{L}(b)

Dokonując porównania w celu znalezienia części wspólnej (przecięcia) \mathcal{L}_{min}() z pozostałymi listami łańcuchowymi (tu: \mathcal{L}(D)) określamy zbiór obiektów spełniających ten warunek i będących odpowiedzią na zadanie do systemu pytanie:

\sigma(t_1) = \{ x_1, x_3, x_5, x_9, x_{10}, x_{11}, x_{12}, x_{13}, x_{14}, x_{18}, x_{19}, x_{20} \} \\ \cap \\ \{ x_1, x_5, x_6, x_7, x_8, x_9, x_{10}, x_{11}, x_{14}, x_{15}, x_{16}, x_{17}, x_{18}, x_{19}, x_{20} \} \\ \Downarrow \\ \sigma(t_1) = \{ x_{1}, x_{5}, x_{9}, x_{10}, x_{11}, x_{14}, x_{18}, x_{19}, x_{20} \}

Przykład 2

Podaj osoby zajmujące stanowiska techniczne w wieku pomiędzy 20 a 35 lat lub osoby z wykształceniem średnim nie pracujące w administracji.

t_2 = (A_2, b) \cdot (A_4, T) + (A_3, S) \cdot ( \neg (A_4, A))

W tym przypadku ponownie musimy rozpisać pytanie na pytania składowe z wykorzystaniem dopełnienia przy użytej negacji, a więc:

t_2 = (A_2, b) \cdot (A_4, T) + (A_3, S) \cdot ( (A_4, T) + (A_4, D) )

t_2 = (A_2, b) \cdot (A_4, T) + (A_3, S) \cdot (A_4, T) + (A_3, S) \cdot (A_4, D)

Zajmując się każdym powstałym t_2^1, t_2^2 i t_2^3termem składowym z osobna, szukamy sumy zbiorów odpowiedzi na takie pytanie, a więc:

\sigma(t_2) = \sigma(t_2^1) \cup \sigma(t_2^2) \cup \sigma(t_2^3)

Dla t^1_2 z tablicy zakotwień odszukujemy odpowiednie deskryptory i uzyskujemy:

tab (b) = (1, 12), \qquad tab (T) = (4, 3) \quad \Rightarrow \quad \mathcal{L}_{min} = \mathcal{L}(T)

Z uwagi na bardzo krótką listę dokonujemy przeglądu zupełnego elementów zbioru odszukując te, które są relewantne dla drugiego składnika (deskryptora) termu składowego (A2, b). W rezultacie otrzymujemy:

\mathcal{L}(T) = \{ x_4, x_{12}, x_{13} \} |_{_{(A2,b)}} \quad \Rightarrow \quad \sigma(t^1_2) = \{x_{12}, x_{13}\}.

Analogicznie postępujemy z pozostałymi termami składowymi, każdorazowo dokonując wyboru czy posłużymy się przeglądem zupełnym, czy też dokonamy przecięcia zbiorów w celu określenia ich części wspólnej.

Na koniec odpowiedzią jest suma tak określonych zbiorów.

Zadanie 1

Dla tablicy opisów obiektów wygeneruj kartotekę wyszukiwawczą, tablicę zakotwień oraz listy łańcuchowe

Znajdź odpowiedź na pytanie o płyty główne posiadające grafikę i umożliwiające zamontowanie 4 kości RAM.
.
Model SocketChipsetRAMgniazda RAM TaktowanieVGA / HDMI
ASRock A320M-DVS R4.0AM4AMD A320DDR423200Tak
MSI A520M PROAM4AMD A520DDR424600Tak
MSI B450-A PRO MAXAM4AMD B450DDR444133Tak
Gigabyte X570S AERO GAM4AMD X570DDR445400Tak
Gigabyte B550 AORUS PRO ACAM4AMD B550DDR445400Tak
Gigabyte TRX40 AORUS PRO WIFITR4AMD TRX40DDR484400Nie
ASUS X399 ROG ZENITH EXTREME ALPHATR4AMD X399DDR483600Nie
ASUS PRIME Z690-A DDR5s1700Intel Z690DDR546000Tak
MSI MAG Z590 TORPEDOs1200Intel Z590DDR445333Tak
Gigabyte B560 AORUS PRO AXs1200Intel B560DDR443200Tak
Gigabyte X299X AORUS MASTERs2066Intel X299DDR484333Nie
MSI H510M-A PROs1200Intel H510 DDR423200Tak

Modyfikacje list łańcuchowych

Wyróżnione modyfikacje list łańcuchowych to:

Parametry list łańcuchowych

Struktura bazy danych wśród wszystkich poznanych uprzednio metod jest najbardziej skomplikowana. Wynika to z faktu konieczności pamiętania odnośników, wprowadzenia kartoteki wtórnej i tablicy zakotwień.

Redundancja wprowadzona tą metodą praktycznie nie występuje, jednakże z uwagi na konieczność przechowywania dodatkowych składników zajętość pamięci jest znacząco większa i wynosi:

M = M_x + M_o + M_t

gdzie:

  • M_x – zajętość pamięci przez opisy obiektów,
  • M_o – zajętość pamięci przez konieczność pamiętania odsyłaczy,
  • M_t – zajętość pamięci przez tablicę zakotwień.

Aktualizacja bazy informacyjnej z uwagi na jej skomplikowanie jest kłopotliwa. System oparty na metodzie list łańcuchowych dedykowany jest raczej pracy wsadowej. Zmiana opisu obiektu może wpływać na konieczność ponownej generacji tablicy zakotwień i wymagać reorganizacji bazy danych.

Czas wyszukiwania informacji w tego typu systemie jest bardzo krótki i jest zdecydowaną zaletą tego systemu. W zasadzie czas ten opiera się na sumie czasów generowania łańcuchów dla deskryptorów występujących w pytaniu:

\tau = \underset{i}\sum\tau_{g_i}

W przypadku pytań złożonych dochodzi czas znalezienia części wspólnej wygenerowanych łańcuchów (bądź czas przeglądu zupełnego opisów obiektów względem najkrótszego łańcucha). Porównując czasy wyszukiwania z metodą list inwersyjnych można zauważyć przewagę na korzyść metody list łańcuchowych z powodu faktu, iż korzystamy tutaj z najkrótszej listy dla przeszukania, a metoda list inwersyjnych nie uwzględnia długości list.

Kategorie: DydaktykaSWI