26.01.2015 Views

sprawozdanie z metody list inwersyjnych

sprawozdanie z metody list inwersyjnych

sprawozdanie z metody list inwersyjnych

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

© COPYRIGHT 2004 MARCIN KARWIŃSKI & MARCIN DZIĘGIELEWSKI<br />

1 z 19<br />

SYSTEMY<br />

WYSZUKIWANIA<br />

INFORMACJI<br />

METODA<br />

LIST<br />

INWERSYJNYCH


© COPYRIGHT 2004 MARCIN KARWIŃSKI & MARCIN DZIĘGIELEWSKI<br />

2 z 19<br />

Spis treści<br />

Słowo wstępne......................................................................................................................................................... 3<br />

Parę słów o <strong>list</strong>ach <strong>inwersyjnych</strong>, czyli czym są właściwie te <strong>list</strong>y....................................................................... 3<br />

Krótka analiza wad MLP.........................................................................................................................................3<br />

Redundancja w MLI – czyli jak ograniczyć zajętość pamięci.................................................................................3<br />

Gdzie to przyspieszenie......................................................................................................................................... 4<br />

Aktualizacja nieco utrudniona.................................................................................................................................4<br />

A gdzie ta inwersyjność.........................................................................................................................................4<br />

Klasycznie biorąc się z bykiem za rogi................................................................................................................... 4<br />

Zadawanie pytań, uzyskiwanie odpowiedzi – czyli jak to działa....................................................................... 5<br />

Modyfikacje, czyli ulepszamy jedno, pogarszamy drugie... bilans równa się zero ;-)............................................ 5<br />

Modyfikacje pamięciowe....................................................................................................................................5<br />

Modyfikacje czasowe..........................................................................................................................................6<br />

Trochę praktyki dla utrwalenia wiedzy, czyli trening czyni mistrza........................................................................7<br />

Przypomnienie kartoteki wtórnej, czyli jak to było.................................................................................................7<br />

Tworzymy funkcję adresującą............................................................................................................................ 8<br />

Tworzenie kartoteki wyszukiwawczej, czyli jeszcze raz to samo...........................................................................9<br />

Kartoteka w metodzie klasycznej...................................................................................................................... 9<br />

Metoda klasyczna – przykłady..........................................................................................................................11<br />

Przykład 1 – wyszukiwanie określonych obiektów..................................................................................... 11<br />

Przykład 2 – wstawianie obiektu..................................................................................................................12<br />

Przykład 3 – aktualizacja opisu obiektu.......................................................................................................12<br />

Przykład 4 – usuwanie obiektu.................................................................................................................... 13<br />

Kartoteka w MLI ze zmniejszonym zbiorem <strong>list</strong> <strong>inwersyjnych</strong>....................................................................... 13<br />

Trochę teorii nie zawadzi, czyli od teoretyka do praktyka...........................................................................13<br />

Właściwa kartoteka, czyli widać zmniejszenie redundancji........................................................................ 14<br />

MLI ze zmniejszonym zbiorem <strong>list</strong> <strong>inwersyjnych</strong> – przykłady........................................................................ 14<br />

Przykład 1 – wyszukanie obiektu.................................................................................................................14<br />

Przykład 2 – wstawianie nowego obiektu....................................................................................................16<br />

Przykład 3 – aktualizacja opisu obiektu.......................................................................................................16<br />

Przykład 4 – usuwanie obiektu.................................................................................................................... 17<br />

Parametry MLI, czyli króciutkie podsumowanie...................................................................................................18<br />

Struktura bazy danych.......................................................................................................................................18<br />

Redundancja i zajętość pamięci........................................................................................................................18<br />

Aktualizacja bazy danych................................................................................................................................. 18<br />

Czas wyszukiwania...........................................................................................................................................18<br />

Język wyszukiwania..........................................................................................................................................19<br />

Tryb pracy......................................................................................................................................................... 19<br />

Wnioski, czyli jeszcze trochę ględzenia na koniec................................................................................................ 19


© COPYRIGHT 2004 MARCIN KARWIŃSKI & MARCIN DZIĘGIELEWSKI<br />

3 z 19<br />

Słowo wstępne<br />

Informatyka jest najdynamiczniej rozwijającą się nauką w dziejach ludzkości. Rozwiazania stosowane<br />

kilka lat temu, dzisiaj są juz mocno przestarzałe. Jest to widoczne zarówno w postępie jaki dokonał się w<br />

dziedzinie budowy sprzętu komputerowego, jak i rozwoju oprogramowania. Wiąże się to oczywiscie z<br />

rozwojem i wdrażaniem nowych technologii produkcji i technik projektowania, ale taże z wykożystaniem<br />

komputerów do coraz to nowych zadań. Ciągle rośnie liczba użytkowników komputerów na całym<br />

świecie co wiąże się oczywiście z rozwojem internetu. Nie zdajemy sobie nawet sprawy jak wiele<br />

informacji znajduje sie w zasiegu naszej ręki. Informatyka przecież to nauka o przetwarzaniu informacji.<br />

Taka skarbnicą wiedzy jest internet, a kluczem przeglądarki internetowe. Korzystamy z nich praktycznie<br />

za każdym razem gdy łączymy się z siecią. Wymagamy nie tylko szybkiej odpowiedzi, ale chcemy, aby<br />

wskazane adresy zawierały dokładnie to czego szukamy. Nie jest to proste zadanie. Z podobnymi<br />

problemami stykamy sie w duzych systemach bazodanowych. Ilość danych do przetworznia rośnie z roku<br />

na rok. Pojawiają się także nowe ich rodzaje (zdjęcia, filmy). Powstają coraz to nowsze sposoby ich<br />

opisu. Coraz częściej od czasu uzyskania jakichś danych zależą losy jakiegoś przedsiębiorstwa.<br />

Zmierzamy do tego, aby pokazać , że algorytmy dobrze sprawdzajace się jeszcze kilka lat temu dzisiaj<br />

mogą być szalenie nieefektywne w użytkowaniu. Poznana przez nas metoda wyszukiwania informacji,<br />

jaką niewątpliwie jest metoda przeglądu zupełnego, nie mogła dalej funkcjonować jako efektywny<br />

algorytm do zastosowania we wciąż rozwijających sie systemach bazodanowych. Należało wymyśleć coś<br />

lepszego – powstała więc metoda <strong>list</strong> <strong>inwersyjnych</strong>. Jest bardzo szybka w porównaniu do swojej<br />

poprzedniczki. Niestety kosztem szybkości inne parametry uległy pogorszeniu, ale więcej na ten temat<br />

znajduje się w naszym sprawozdaniu.<br />

Parę słów o <strong>list</strong>ach <strong>inwersyjnych</strong>, czyli czym są właściwie te <strong>list</strong>y<br />

Opisy obiektów są określone przez podanie wartości cech, za pomocą których opisujemy obiekty w<br />

systemie. Cechy te noszą nazwę atrybutów, a wartości, które można przporządkować obiektom w ramach<br />

jednego atrybutu, noszą nazwę deskryptorów. Tyle wiemy z dotychczasowych rozważań. W czym tkwi<br />

myk tej <strong>metody</strong> Opowiedź na to pytanie znajdziemy w niniejszym rozważaniu poświęconemu<br />

najważniejszym parametrom MLP.<br />

Krótka analiza wad MLP<br />

Otóż już prosta analiza procesu wyszukiwania informacji w metodzie przeglądu zupełnego prowadzi nas<br />

do zaskakująco prostego acz bardzo ważnego wniosku... Zauważmy, że przy prostych pytaniach<br />

jednodeskryptorowych system oparty na MLP musi przejrzeć wszystkie obiekty, bądź część (np. w<br />

przypadku modyfikacjach grupowania, odcinkowania, czy też podziału połówkowego) ich zbioru, choć<br />

stosunkowo często nawet podane modyfikacje nie pomogą jeśli w zapytaniu pojawi się atrybut,<br />

względem którego nie była przeprowadzana optymalizacja modyfikacji <strong>metody</strong>. Rozwiązaniem, choć<br />

kosztownym ze względu na pewną nadmiarowość w opisach, jest utworzenie kartoteki wyszukiwawczej,<br />

w której dla każdego deskryptora w systemie tworzona jest <strong>list</strong>a obiektów zawierających w swoim opisie<br />

ten deskryptor.<br />

Redundancja w MLI – czyli jak ograniczyć zajętość pamięci<br />

Dla zmniejszenia zajętości pamięci, a także dla zmniejszenia redundancji, kartotekę wyszukiwawczą<br />

generujemy w taki sposób, że dla każdego deskryptora zapisywane są adresy (numery) wszystkich<br />

obiektów opisywanych przez ten deskryptor. W przypadku malej liczby obiektów, a także ich krótkiej<br />

nazwy, w zamian za adresy obiektów, stosujemy ich nazwy/identyfikatory.


© COPYRIGHT 2004 MARCIN KARWIŃSKI & MARCIN DZIĘGIELEWSKI<br />

4 z 19<br />

Gdzie to przyspieszenie<br />

Taka budowa kartoteki powoduje dużą szybkość wyszukiwania, w przypadku, gdy mamy zapytania<br />

składające się z pojedynczych deskryptorów, co też nietrudno wywnioskować z powyższego wywodu.<br />

Wiadome jest, że w takich przypadkach kartoteka zbudowana z <strong>list</strong> <strong>inwersyjnych</strong> pozwala niezwykle<br />

szybko, jak na tak prostą metodę, znaleźć odpowiedź na pytanie zadane do systemu. Jeżeli bowiem<br />

pytamy o obiekty mające w swoim opisie określony deskryptor, to dla znalezienia odpowiedzi wystarczy<br />

znaleźć właściwą <strong>list</strong>ę inwersyjną. Obiekty podane w tej liście stanowią odpowiedź na pytanie. Ale też<br />

zwiększenie liczby deskryptorów nie powoduje dużej komplikacji obliczeń. Jeżeli bowiem pytanie<br />

dotyczy obiektów opisanych kilkoma deskryptorami, to aby otrzymać odpowiedź, należy znaleźć <strong>list</strong>y<br />

inwersyjne dla wszystkich deskryptorów występujących w pytaniu. Następnie w takich wypadkach na<br />

zbiorach odpowiedzi z pojedynczych deskryptorów wykonywana jest operacja AND lub OR. Wstawianie<br />

do zapytań operatora logicznego NOT nie wiąże się również z większym problemem obliczeniowym.<br />

Zatem dla znalezienia odpowiedzi na pytanie skierowane do systemu wystarczy wykonać pewne proste<br />

operacje na <strong>list</strong>ach <strong>inwersyjnych</strong> (czyli w zasadzie na zbiorach). Można zauważyć, ze odpowiedzi<br />

uzyskujemy rzeczywiście szybko.<br />

Aktualizacja nieco utrudniona<br />

Ponieważ obiekty pamiętane są w wielu <strong>list</strong>ach, to właśnie ta nadmiarowość danych powoduje pewne<br />

utrudnienia dla procesu aktualizacji bazy danych w stosunku do przecież niezwykle prostego w<br />

wykonaniu procesu aktualizacji bazy w systemie opartym na metodzie <strong>list</strong> prostych (w tym na wszystkich<br />

modyfikacjach). Dodanie lub usunięcie elementu z bazy danych wiąże się z modyfikacją całej kartoteki<br />

wyszukiwawczej - należy usunąć adres do tego rekordu (bądź nazwę obiektu opisywanego w danym<br />

rekordzie) z wszystkich powiązanych z nim deskryptorów.<br />

A gdzie ta inwersyjność<br />

Metoda <strong>list</strong> <strong>inwersyjnych</strong> różni się od <strong>metody</strong> <strong>list</strong> łańcuchowych i <strong>metody</strong> <strong>list</strong> prostych tym, że <strong>list</strong>y<br />

łańcuchowe nie są umieszczone w opisach elementów, ale w osobnych <strong>list</strong>ach. Na dodatek <strong>list</strong>y te nie<br />

opisują bezpośrednio obiektów, czytaj dostęp do informacji nie biegnie od obiektu do informacji a<br />

odwrotnie (stąd właśnie ta inwersyjność), tj. od wartości atrybutu do opisu obiektu, któremu funkcja<br />

informacji właśnie tą wartość przypisała. Poza tym, w poprzednim przypadku <strong>list</strong>y były generowane<br />

podczas wyszukiwania, tutaj natomiast są podane bezpośrednio.<br />

Klasycznie biorąc się z bykiem za rogi...<br />

Podobnie do MLP mamy zdefiniowany system wyszukiwania S, a więc zbiór obiektów X, atrybutów A,<br />

wartości tych atrybutów V oraz funkcja informacji ρ. Oczywiście te elementy tworzą czwórkę<br />

uporządkowaną:<br />

S = .<br />

Zakładamy, że obiekty opisane są iloczynem odpowiednich niezaprzeczonych deskryptorów. Opisy<br />

obiektów t x umieszczone są w dowolny sposób w pamięci komputera.<br />

Dodatkowo zakładamy, że mamy dużą bazę, zatem obiektom x 1 ,...,x n odpowiadają adresy n 1 ,...,n m .<br />

Utworzyliśmy zatem pewein zbiór adresów N = {n 1 ,...,n m } stosując funkcję adresującą μ w następujący<br />

sposób:<br />

μ: X → N, przy czym μ(x)=μ (y) ↔ t x = t y<br />

co należy czytać nastepująco – przypisujemy ten sam adres obiektom o takich samych opisach<br />

deskryptorowych.<br />

Tworzymy <strong>list</strong>y inwersyjne (oznaczane przez α(d i )), czyli <strong>list</strong>y adresów tych obiektów, które w swoim<br />

opisie zawierają deskryptor di (d i є t x ). Zapisujemy to jako:<br />

α(d i ) = {n 1 ,...,n z }, gdzie d i = (a i , v i ), a i є A, v i є V ai .<br />

Tworzymy tyle <strong>list</strong> <strong>inwersyjnych</strong> ile mamy deskryptorów w systemie.


© COPYRIGHT 2004 MARCIN KARWIŃSKI & MARCIN DZIĘGIELEWSKI<br />

5 z 19<br />

Zadawanie pytań, uzyskiwanie odpowiedzi – czyli jak to działa...<br />

Pytania do tak zdefiiowanego systemu S zadajemy w postaci termu t będącego sumą termów składowych<br />

t = t 1 +...+ t m .<br />

• Termy składowe pytania mogą być pojedynczymi deskryptorami, a więc term t jest postaci:<br />

t = d 1 + d 2 + d 3 + ... + d k .<br />

Opowiedź na pytanie t otrzymujemy bezpośrednio przez wygenerowanie <strong>list</strong> <strong>inwersyjnych</strong> dla<br />

deskryptorów występujących w pytaniu. Zatem:<br />

σ(t) = α(d 1 ) u α(d 2 ) u...u α(d k ).<br />

• Termy składowe mają postać iloczynu deskryptorów. Odpowiedź na term t jest więc sumą odpowiedzi<br />

na termy składowe:<br />

σ(t) = σ(t 1 ) u σ(t 2 ) u...u σ(t m ).<br />

Odpowiedź na trm składowy t i otrzymujemy jako przecięcie (część wspólna) <strong>list</strong> <strong>inwersyjnych</strong><br />

związanych z deskryptorami występującymi w pytaniu t i :<br />

σ(t i ) = α(d 1 ) n α(d 2 ) n...n α(d k ), gdzie t i = d 1 ∙ d 2 ∙...∙ d k .<br />

Jeśli w <strong>list</strong>ach <strong>inwersyjnych</strong> występowały adresy obiektów, to kolejnym krokiem będzie znalezienie<br />

obiektów odpowiadających tym adresom.<br />

Ogólnie więc biorąc odpowiedź na zapytanie t, będące sumą termów składowych jest sumą odpowiedzi<br />

na termy składowe:<br />

σ(t) = σ(t 1 ) u σ(t 2 ) u...u σ(t m ),<br />

przy czym σ(t i ) = {x є X, μ(x)=n i oraz n i є N' = ∩ j α(d j ), gdzie N' є N, a d j є t i }. Odpowiedź na pytanie t<br />

jest sumą odpowiedzi na pytania składowe, przy czym odpowiedź na pytanie składowe uzyskujemy jako<br />

przecięcie <strong>list</strong> <strong>inwersyjnych</strong> związanych z deskryptorami występującymi w pytaniu składowym.<br />

Metoda ta wnosi dużą redundancję, którą można opisać wzorem:<br />

R = (∑ r i=1 #α(d i ) – N)/N,<br />

gdzie r – liczba deskryptorów w systemie, N – liczba obiektów (lub adresów), a symbol #x oznacza moc<br />

zbioru x.<br />

Modyfikacje, czyli ulepszamy jedno, pogarszamy drugie... bilans równa się zero ;-)<br />

Jak zwykle modyfikacje wprowadzane do <strong>metody</strong> klasycznej mają na celu zlikwidowanie jakichś wad tej<br />

pierwotnej <strong>metody</strong>, bądź też mają za zadanie polepszyć/podrasować te cechy, z których dana metoda<br />

słynie i dzięki którym jest tak szeroko wykorzystywana. Już pobieżna analiza wykazuje, iż w metodzie<br />

<strong>list</strong> <strong>inwersyjnych</strong> obiekty pamiętane są wielokrotnie. Wynika stąd istotna wada tej <strong>metody</strong> – jest nią duża<br />

redundancja. Oczywiste więc że modyfikacje w większości zostały stworzone dla zmniejszenia<br />

redundancji w systemie.<br />

Modyfikacje pamięciowe<br />

Modyfikacje tej grupy mają na celu zmniejszenie zajętości pamięci przez <strong>list</strong>y inwersyjne. Należą do nich<br />

proste modyfikacje związane z innym zapisem kartoteki wyszukiwawczej:<br />

• zaznaczanie przedziałów elementów<br />

• pamiętanie <strong>list</strong> zanegowanych<br />

• tworzenie <strong>list</strong> zredukowanych dla dwóch deskryptorów: w danej liście początek odnosi się do<br />

pierwszego deskryptora, środek do obydwu, końcówka do drugiego<br />

a także te które oprócz samego zmiejszenia zajętości pamięci przyśpieszają dodatkowo dla pewnej klasy<br />

pytań funkcjonowanie systemu wyszukiwania informacji, np:<br />

• MLI ze zmniejszonym zbiorem <strong>list</strong> <strong>inwersyjnych</strong>: w tej metodzie <strong>list</strong>y nie są tworzone dla wszystkich<br />

deskryptorów występujących w opisach obiektów, a dla pewnego podzbioru D' є D tych deskryptorów.<br />

Wybrany podzbiór D' może być zbiorem deskryptorów najczęściej występujących w pytaniach do<br />

systemu S lub zbiorem deskryptorów pewnego atrybutu (ew. Atrybutów), co jest związane z<br />

modyfikacjami MLP.<br />

• MLI z dekompozycją obiektową polega z kolei na tym by zdekomponować system S o ile to możliwe<br />

w taki sposób, iż otrzymamy podsystemy o zmniejszonej liczbie obiektów, to znaczy:<br />

S = U n i=1 S i ,


© COPYRIGHT 2004 MARCIN KARWIŃSKI & MARCIN DZIĘGIELEWSKI<br />

6 z 19<br />

gdzie:<br />

S i = ,<br />

X i є X i U i X i = X,<br />

ρ i = ρ| Xi .<br />

W tak zdekomponowanym systemie stosujemy MLI w podsystemach. Gdzie ta oszczędność Otóż<br />

<strong>list</strong>y inwersyjne tworzone w podsystemach są na ogół znacznie krótsze, co przyspiesza wyszukiwanie i<br />

zmniejsza zajętość pamięci w obrębie podsystemu. Odpowiedź na pytanie t jest tworzona w systemie<br />

S po wyszukaniu odpowiedzi z podsystemów. Dzięki temu często wyszukiwania prowadzone są<br />

niezależnie, w oddzielnych fizycznie podsystemach (przetwarzanie rozproszone). Wzór na<br />

redundancję w tym przypadku przyjmie postać:<br />

R = (∑ r i=1 #α(d i )| Xi – N)/N.<br />

Taka modyfikacja stosowana jest przede wszystkim dla systemów wyszukiwania o dużych zbiorach<br />

obiektów, które opisane są takimi samymi atrybutami. Wtedy wygodniej jest podzielić ten zbiór<br />

obiektów na podzbiory.<br />

• MLI z dekompozycją atrybutową wprowadzamy w przypadku, gdy pytania do systemu specyfikują<br />

tylko wartości pewnego podzbioru atrybutów. Wówczas system S = dzielimy na<br />

podsystemy S i tak, że:<br />

S = U i S i ,<br />

gdzie:<br />

S i = ,<br />

A i є A i U i A i = A,<br />

V i є V,<br />

ρ i = ρ| X×Ai .<br />

W takim przypadku z każdym podsystemem S i systemu S związany jest zbiór deskryptorów D i . Listy<br />

inwersyjne tworzymy oddzielnie dla każdego podsystemu S i . Odpowiedź znajdujemy w systemie S i<br />

jako odpowiedź przybliżoną (σ(t i ) = (α(d 1 ) n α(d 2 ) n...n α(d k ))| Di ). Dokładną odpowiedź można w<br />

zawężonym zbiorze obiektów znaleźć metodą przeglądu zupełnego. Redundancja R przyjmuje dla tej<br />

modyfikacji wartość określoną wzorem:<br />

R = (∑ r i=1 #α(d i )| Di – N)/N.<br />

Jak widać zmniejsza to jedynie zbiór <strong>list</strong> w podsystemach. Tego typu modyfikacja jest stosowana<br />

przede wszystkim wtedy, gdy napływające do systemu pytania dotyczą tylko pewnych atrybutów.<br />

Wtedy zgodnie z typem pytań tworzymy podsystemy o takim samym zbiorze obiektów i mniejszym<br />

zbiorze atrybutów.<br />

Modyfikacje czasowe<br />

Polegają na ustawieniu kolejności całych <strong>list</strong> <strong>inwersyjnych</strong> w celu skrócenia czasu wyszukiwania dla<br />

pytań szczegółowych.<br />

• uporządkowanie kolejności <strong>list</strong> <strong>inwersyjnych</strong> według długości (od krótkich do długich) - umożliwia<br />

efektywne stosowanie wyszukiwanie poprzez generację <strong>list</strong>y, a następnie sprawdzania wyszukanych<br />

obiektów z odpowiedzi przybliżonej. Przypomina to wyszukiwanie szczegółowe dla <strong>metody</strong><br />

łańcuchowej.<br />

• uporządkowanie kolejności <strong>list</strong> <strong>inwersyjnych</strong> np. alfabetyczne, umożliwia szybsze wyszukanie samej<br />

<strong>list</strong>y inwersyjnej. W wyszukiwaniu <strong>list</strong>y można stosować np. metodę podziału połówkowego.<br />

• uporządkowanie kolejności <strong>list</strong> <strong>inwersyjnych</strong> względem częstości pytania o deskryptory.


© COPYRIGHT 2004 MARCIN KARWIŃSKI & MARCIN DZIĘGIELEWSKI<br />

7 z 19<br />

Trochę praktyki dla utrwalenia wiedzy, czyli trening czyni mistrza...<br />

Przypomnienie kartoteki wtórnej, czyli jak to było...<br />

X = {P54C, P55C, Covington, Mendocino, Coppermine, Klamath, Deschutes, Katmai,<br />

Coppermine2, Tualatin, Willamette, NorthwoodA, NorthwoodB, NorthwoodC, Prestonia,<br />

Prescott, P6, DeschutesMP, Tanner, Cascades, Foster, Gallatin, 5K86, LittleFoot, Chompers,<br />

Sharptooth, Spitfire, Morgan, Pluto, Orion, Thunderbird, Palomino, Thoroughbred, Barton,<br />

Applebred, Thorton, SledgeHammer, Newcastle, ClawHammer} jest zbiorem obiektów systemu S,<br />

w naszym przypadku każdy obiekt to jeden z rdzeni procesorów firmy Intel lub AMD.<br />

A = {Proc, Obud, Ltr, Socket, L2, FSB, Clock, PrT, Tmax, Pmax, HT, MemC} stanowi zbiór<br />

atrybutów systemu S, gdzie:<br />

• Proc oznacza rodzinę procesorów w jakiej świat ujrzał dany rdzeń,<br />

• Obud oznacza rodzaj obudowy w jakiej ujrzeliśmy dany rdzeń,<br />

• Ltr określa liczbę tranzystorów z których jest zbudowany dany rdzeń,<br />

• Socket określa jakim złączem dany rdzeń komunikował się z resztą świata,<br />

• L2 opisuje maksymalną ilość pamięci Cache level2 dostępnej dla danego rdzenia,<br />

• FSB traktuje o maksymalnej prędkości pracy tej szyny dla danego rdzenia,<br />

• Clock opisuje największy zegar osiągnięty dla danego rdzenia,<br />

• PrT informuje o procesie technologicznym w jakim dany rdzeń był/jest wytwarzany,<br />

• Tmax podaje największą temperaturę do jakiej dany rdzeń może się grzać,<br />

• Pmax podobnie do powyższego, ale określa maksymalną pobieraną moc,<br />

• HT informuje czy dany rdzeń oferuje technologię HyperThreadingu,<br />

• MemC informuje czy dany rdzeń jest wyposażony w kontroler pamięci, a także jakiego typu jest ten<br />

kontroler.<br />

V jest zbiorem wszystkich wartości wszystkich atrybutów, i tak:<br />

• Vproc = {I, P, Pm. Pro, P2, P3, P4, C, P2X, P3X, X, K5, K6, D, A, AXP, A64}, gdzie: I – Inna,<br />

P – Intel Pentium, Pm – Intel Pentium MMX, Pro – Intel Pentium Pro, P2 – Intel Pentium 2,<br />

P3 – Intel Pentium 3, P4 – Intel Pentium 4, C – Intel Celeron, P2X – Intel Pentium 2 Xeon,<br />

P3X – Intel Pentium 3 Xeon, X – Intel Xeon DP/MP, K5 – AMD K5, K6 – AMD K6, D – AMD<br />

Duron, A – AMD Athlon, AXP – AMD Athlon XP, A64 – AMD Athlon 64/FX/Opteron.<br />

• Vobud = {S1, S2, S3, P1, P2, F, C, CM, O1, O2, O3, L, I}, gdzie: S1 – SPGA, S2 – SEPP, S3<br />

– SECC/SECC2, P1 – PGA, P2 – PPGA, F – FCPGA/FCPGA2, C – CPGA, CM –<br />

CardModule, O1 – OPGA, O2 – OOI, O3 – OLGA2/OLGA1, L – FCLGA4, I – Inna.<br />

• Vltr = {b.malo, malo, srednio, duzo, b.duzo, tlum, wow!}, gdzie: 100mln wow!.<br />

• Vsocket = {3, 4a, 4b, 4c, 5, 6, 7a, 7b, 7c, 8, 9a, 9b, A, SA, S1, S2, I}, gdzie: 3 – 370, 4a –<br />

423pins, 4b – 478pins, 4c – 495pins, 5 – socket5 (320pins), 6 – 603pins (INT3/INT2), 7a –<br />

socket7 (321pins), 7b – 775pins, 7c – 754pins, 8 – socket8 (387pins), 9a – 940pins, 9b –<br />

939pins, A – socket a (462pins), SA – SlotA (SC242), S1 – Slot1 (SC242), S2 – Slot 2<br />

(330pins), I – Inny.<br />

• Vl2 = {M, S, D, O}, gdzie: M - 512KB.<br />

• VFSB = {0, 1, 2, 3, 4, I}, gdzie: 0 –


© COPYRIGHT 2004 MARCIN KARWIŃSKI & MARCIN DZIĘGIELEWSKI<br />

8 z 19<br />

X\A Proc Obud Ltr Socket L2 FSB Clock PrT Tmax Pmax HT MemC<br />

P54C P S1 b.malo 7 D 0 b.wolny b.stary Chlodny 1 0 0<br />

P55C Pm S1 b.malo 7 D 1 b.wolny Stary Chlodny 1 0 0<br />

Covington C S2 b.malo S1 M 1 b.wolny Stary Goracy 1 0 0<br />

Mendocino C S2 Malo S1 S 1 b.wolny Sredni Parzy 2 0 0<br />

Coppermine C F Malo 3 S 1 Sredni Nowy Zar 2 0 0<br />

Klamath P2 S3 b.duzo S1 D 1 b.wolny Stary Cieply 3 0 0<br />

Deschutes P2 S3 b.duzo S1 D 1 b.wolny Sredni Zar 2 0 0<br />

Katmai P3 S3 b.duzo S1 D 2 Wolny Sredni Zar 2 0 0<br />

Coppermine2 P3 S3 Srednio S1 S 2 Wolny Nowy Parzy 2 0 0<br />

Tualatin P3 F Srednio 3 S 2 Sredni b.nowy Chlodny 2 0 0<br />

Willamette P4 O2 b.duzo 4a S 1 Sredni Nowy Cieply 4 0 0<br />

NorthwoodA P4 F Tlum 4b D 2 b.szybki b.nowy Cieply 4 0 0<br />

NorthwoodB P4 F Tlum 4b D 2 b.szybki b.nowy Cieply 5 1 0<br />

NorthwoodC P4 F Tlum 4b D 4 b.szybki b.nowy Chlodny 5 1 0<br />

Prestonia P4 F Wow! 4b D 4 b.szybki b.nowy Chlodny 6 1 0<br />

Prescott P4 L Wow! 7b O 4 Hyper Mikro Cieply 6 1 0<br />

P6 Pro C Tlum 8 O 0 b.wolny Stary Parzy 3 0 0<br />

DeschutesMP P2X O3 Wow! S2 O 1 b.wolny Sredni Cieply 3 0 0<br />

Tanner P3X S3 Wow! S2 O 1 Wolny Sredni Cieply 3 0 0<br />

Cascades P3X O3 Srednio 4c S 2 Wolny Nowy Lod 3 0 0<br />

Foster X P2 Tlum 6 O 1 Sredni Nowy Goracy 4 1 0<br />

Gallatin X P2 Wow! 6 D 1 b.szybki b.nowy Cieply 5 1 0<br />

5K86 K5 P1 b.malo 5 D 0 b.wolny Stary Parzy 1 0 0<br />

LittleFoot K6 P1 b.malo 5 D 1 b.wolny Stary Chlodny 2 0 0<br />

Chompers K6 P1 b.malo 7a D 1 Wolny Sredni Chlodny 2 0 0<br />

Sharptooth K6 P1 Srednio 7a D 1 b.wolny Sredni Chlodny 2 0 0<br />

Spitfire D C Srednio A S 1 Wolny Nowy Zar 3 0 0<br />

Morgan D C Srednio A S 1 Sredni Nowy Zar 3 0 0<br />

Pluto A CM Srednio SA D 1 Wolny Sredni Chlodny 3 0 0<br />

Orion A CM Srednio SA D 1 Wolny Nowy Chlodny 4 0 0<br />

Thunderbird A C Duzo A S 2 Sredni Nowy Zar 4 0 0<br />

Palomino AXP O1 Duzo A S 2 Sredni Nowy Zar 4 0 0<br />

Thoroughbred AXP O1 Duzo A S 3 Szybki b.nowy Zar 4 0 0<br />

Barton AXP O1 Tlum A D 4 Szybki b.nowy Parzy 4 0 0<br />

Applebred D O1 Srednio A M 3 Sredni b.nowy Parzy 3 0 0<br />

Thorton AXP O1 Duzo A S 3 Szybki b.nowy Zar 4 0 0<br />

SledgeHammer A64 O1 Wow! 9a O 4 Szybki b.nowy Parzy 5 0 2<br />

Newcastle A64 O1 Tlum 9b O 4 Szybki b.nowy Chlodny 5 0 1<br />

ClawHammer A64 O1 Wow! 7c O 4 Szybki b.nowy Parzy 5 0 1<br />

Tworzymy funkcję adresującą<br />

Jak widać nasza kartoteka wtórna jest stosunkowo rozbudowana, a duża liczba obiektów o długiej nazwie<br />

może spowodować, iż redundantna MLI może zająć względnie duży obszar pamięci. Aby ją zaoszczędzić<br />

w trakcie tworzenia <strong>list</strong> <strong>inwersyjnych</strong>, już teraz wprowadzamy „adresy” obiektów (w naszym przypadku<br />

będą to tylko indexy obiektów) do kartoteki wtórnej, oto więc nasza funkcja adresująca w postaci tabeli:


© COPYRIGHT 2004 MARCIN KARWIŃSKI & MARCIN DZIĘGIELEWSKI<br />

9 z 19<br />

Index<br />

X\A<br />

1 P54C<br />

2 P55C<br />

3 Covington<br />

4 Mendocino<br />

5 Coppermine<br />

6 Klamath<br />

7 Deschutes<br />

8 Katmai<br />

9 Coppermine<br />

10 Tualatin<br />

11 Willamette<br />

12 NorthwoodA<br />

13 NorthwoodB<br />

14 NorthwoodC<br />

15 Prestonia<br />

16 Prescott<br />

17 P6<br />

18 DeschutesMP<br />

19 Tanner<br />

20 Cascades<br />

21 Foster<br />

22 Gallatin<br />

23 5K86<br />

24 LittleFoot<br />

25 Chompers<br />

26 Sharptooth<br />

27 Spitfire<br />

28 Morgan<br />

29 Pluto<br />

30 Orion<br />

31 Thunderbird<br />

32 Palomino<br />

33 Thoroughbred<br />

34 Barton<br />

35 Applebred<br />

36 Thorton<br />

37 SledgeHammer<br />

38 Newcastle<br />

39 ClawHammer<br />

Tworzenie kartoteki wyszukiwawczej, czyli jeszcze raz to samo...<br />

Kartoteka w metodzie klasycznej<br />

α(Proc,P1)={1}<br />

α(Proc,Pm)={2}<br />

α(Proc,C)={3,4,5}<br />

α(Proc,P2)={6,7}<br />

α(Proc,P3)={8,9,10}<br />

α(Proc,P4)={11,12,13,14,15,16}<br />

α(Proc,Pro)={17}<br />

α(Proc,P2X)={18}<br />

α(Proc,P3X)={19,20}


© COPYRIGHT 2004 MARCIN KARWIŃSKI & MARCIN DZIĘGIELEWSKI<br />

10 z 19<br />

α(Proc,X)={21,22}<br />

α(Proc,K5)={23}<br />

α(Proc,K6)={24,25,26}<br />

α(Proc,D)={27,28,35}<br />

α(Proc,A)={29,30,31}<br />

α(Proc,AXP)={32,33,34,36}<br />

α(Proc,A64)={37,38,39}<br />

α(Proc,I)={Ø}<br />

α(Obud,S1)={1,2}<br />

α(Obud,S2)={3,4}<br />

α(Obud,F)={5,9,11,12,13}<br />

α(Obud,S3)={6,7,8,19}<br />

α(Obud,O2)={10}<br />

α(Obud,L)={14}<br />

α(Obud,C)={15}<br />

α(Obud,O3)={18,20}<br />

α(Obud,P2)={21,22}<br />

α(Obud,P1)={23,24,25,26}<br />

α(Obud,C)={27,28,31}<br />

α(Obud,CM)={29,30}<br />

α(Obud,O1)={32,33,34,35,36,37,38,39}<br />

α(Obud,I)={Ø}<br />

α(Ltr,b.mało)={1,2,3,23,24,25}<br />

α(Ltr,mało)={4,5}<br />

α(Ltr,srednio)={9,10,20,26,27,28,29,30,35}<br />

α(Ltr,duzo)={31,32,33,36}<br />

α(Ltr,b.duzo)={6,7,8,11}<br />

α(Ltr,tlum)={12,13,14,17,21,34,38}<br />

α(Ltr,Wow!)={15,16,18,19,22,37,39}<br />

α(Socket,7)={1,2}<br />

α(Socket,S1)={3,4,6,7,8,9,}<br />

α(Socket,3)={5,10}<br />

α(Socket,4a)={11}<br />

α(Socket,4b)={12,13,14,15}<br />

α(Socket,7b)={16}<br />

α(Socket,8)={17}<br />

α(Socket,S2)={18,19}<br />

α(Socket,4c)={20}<br />

α(Socket,6)={21,22}<br />

α(Socket,5)={23,24}<br />

α(Socket,7a)={25,26}<br />

α(Socket,A)={27,28,31,32,33,34,35,36}<br />

α(Socket,SA)={29,30}<br />

α(Socket,9a)={37}<br />

α(Socket,9b)={38}<br />

α(Socket,7c)={39}<br />

α(Socket,I)={Ø}<br />

α(L2,D)={1,2,6,7,8,12,13,14,15,22,23,24,25,26,29,30,34}<br />

α(L2,M)={3,35}<br />

α(L2,S)={4,5,9,10,11,20,27,28,31,32,33,36}<br />

α(L2,O)={16,17,18,19,21,37,38,39}<br />

α(FSB,0)={1,17,23}<br />

α(FSB,1)={2,3,4,5,6,7,11,18,19,21,22,24,25,26,27,28,29,30}<br />

α(FSB,2)={8,9,10,12,13,20,31,32}<br />

α(FSB,3)={33,35,36}<br />

α(FSB,4)={14,15,16,34,37,38,39}<br />

α(FSB,I)={Ø}<br />

α(Clock,b.wolny)={1,2,3,4,6,7,17,18,23,24,26}<br />

α(Clock,Wolny)={8,9,19,20,25,27,29,30}<br />

α(Clock,Sredni)={5,10,11,21,28,31,32,35}<br />

α(Clock,Szybki)={33,34,36,37,38,39}


© COPYRIGHT 2004 MARCIN KARWIŃSKI & MARCIN DZIĘGIELEWSKI<br />

11 z 19<br />

α(Clock,b.szybki)={12,13,14,15,22}<br />

α(Clock,Hyper)={16}<br />

α(PrT,b.stary)={1}<br />

α(PrT,Stary)={2,3,6,17,23,24}<br />

α(PrT,Sredni)={4,7,8,18,19,25,26,29}<br />

α(PrT,Nowy)={5,9,11,20,21,27,28,30,31,32}<br />

α(PrT,b.nowy)={10,12,13,14,15,22,33,34,35,36,37,38,39}<br />

α(PrT,Mikro)={16}<br />

α(PrT,I)={Ø}<br />

α(Tmax,Lod)={20}<br />

α(Tmax,Chlodny)={1,2,10,14,15,24,25,26,29,30,38}<br />

α(Tmax,Cieply)={6,11,12,13,16,18,19,22}<br />

α(Tmax,Goracy)={3,21}<br />

α(Tmax,Parzy)={4,9,17,23,34,35,37,39}<br />

α(Tmax,Zar)={5,7,8,27,28,31,32,33,36}<br />

α(Pmax,1)={1,2,3,23}<br />

α(Pmax,2)={4,5,7,8,9,10,24,26}<br />

α(Pmax,3)={6,17,18,19,20,27,28,29,35}<br />

α(Pmax,4)={11,12,21,30,31,32,33,34,36}<br />

α(Pmax,5)={13,14,22,37,38,39}<br />

α(Pmax,6)={15,16}<br />

α(HT,0)={1,2,3,4,5,6,7,8,9,10,11,12,17,18,19,20,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39}<br />

α(HT,1)={13,14,15,16,21,22}<br />

α(MemC,0)=<br />

{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31<br />

,32,33,34,35,36}<br />

α(MemC,1)={38,39}<br />

α(MemC,2)={37}<br />

α(MemC,I)={Ø}<br />

Metoda klasyczna – przykłady<br />

W części zatytułowanej „Klasycznie biorąc się z bykiem za rogi” już omówiliśmy podstawy teoretyczne<br />

operacji w systemiewyszukiwania informacji opartym na klasycznej MLI, zatem nie będziemy już<br />

dublować naszych słów, zainteresowanych natomiast odsyłamy do odpowiedniego fragmentu tego tekstu.<br />

W przypadku aktualizacji, dla oszczędzenia miejsca, będziemy podawać tylko te fragmenty kartoteki<br />

wyszukiwawczej, które się zmienią.<br />

Przykład 1 – wyszukiwanie określonych obiektów<br />

Mamy za zadanie wyszukać te jądra procesorów, które nie dysponują wbudowanym kontrolerem pamięci<br />

i zegarem o maksymalnej prędkości lężącej gdzieś w przedziale (2.5GHz-3.5GHz)lub procesorów<br />

oferujących funkcję przetwarzania wielopotokowego realizowanego „sprzętowo”, tj. Oferującego<br />

HyperThreading. Zadajemy więc do naszej bazy danych następujące pytanie:<br />

t = (MemC,0)•(Clock,b.szybki)+(HT,1)<br />

t = t 1 + t 2<br />

Jak widać nasz term złożony jest z 2 termów składowych, zatem szukając odpowiedzi skorzystamy ze<br />

wzoru:<br />

σ(t) = σ(t 1 ) u σ(t 2 )<br />

tu jednak, trzeba zauważyć, że t 1 jest iloczynem deskryptorowym, więc:<br />

σ(t 1 ) = α(d 1 ) n α(d 2 ),<br />

gdzie d 1 =(MemC,0), a d 2 =(Clock,b.szybki). Term składowy t 2 składa się tylko z jednego deskryptora,<br />

więc:<br />

σ(t 2 ) = α(d 3 )<br />

Mając juz przygotowane i rozłożone na czynniki pierwsze pytanie przystępujemy do analizy <strong>list</strong>:<br />

α(d 1 ) = α(MemC,0) =<br />

{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36}<br />

α(d 2 ) = α(Clock,b.szybki)={12,13,14,15,22}


© COPYRIGHT 2004 MARCIN KARWIŃSKI & MARCIN DZIĘGIELEWSKI<br />

12 z 19<br />

α(d 3 ) = α(HT,1)={13,14,15,16,21,22}<br />

otrzymując kolejno:<br />

σ(t 1 ) = {12,13,14,15,22}<br />

σ(t 2 ) = {13,14,15,16,21,22}.<br />

Mając wyznaczone odpowiedzi na termy składowe przystępujemy do wyznaczenia odpowiedzi<br />

całkowitej:<br />

σ(t) = σ(t 1 ) u σ(t 2 ) = {12,13,14,15,16,21,22}.<br />

Jak widać taka odpowiedź mogłaby być dla użytkownika w pewnym stopniu nieczytelna, dlatego<br />

korzystając z tablicy funkcji adresowej uzyskujemy ostatecznie, że:<br />

σ(t) = {NorthwoodA, NorthwoodB, NorthwoodC, Prestonia, Prescott, Foster, Gallatin}<br />

która to odpowiedź pokrywa się z tym samym przykładem ze sprawozdania poświęconego MLP.<br />

Przykład 2 – wstawianie obiektu<br />

Niech dane nam będzie zadanie wstawienia informacji o procesorze Nocona. Mamy dane po<br />

zinterpretowaniu tekstu normalnego takie informacje o jądrze 64bitowym Intela przedstawione w formie<br />

adekwatnej do naszej kartoteki wtórnej:<br />

.<br />

.<br />

.<br />

37 SledgeHammer A64 O1 Wow! 9a O 4 Szybki b.nowy Parzy 5 0 2<br />

38 Newcastle A64 O1 Tlum 9b O 4 Szybki b.nowy Chlodny 5 0 1<br />

39 ClawHammer A64 O1 Wow! 7c O 4 Szybki b.nowy Parzy 5 0 1<br />

40 Nocoma X L Wow! I O 4 Hyper Mikro Chlodny 5 1 0<br />

To samo zapisane w kartotece wyszukiwawczej MLP by wyglądało tak:<br />

tNocoma = (Proc,X)•(Obud,L)•(Ltr,wow!)•(Socket,I)•(L2,O)•(FSB,4)•(Clock,Hyper)•<br />

(PrT,Mikro)•(Tmax,chlodny)•(Pmax,5)•(HT,1)•(MemC,0)<br />

Aby wstawić taki obiekt musimy tak zmodyfikować wszystkie <strong>list</strong>y inwersyjne opisujące deskryptory<br />

występujące w opisie nowego obiektu by wskazywały na nowy obiekt:<br />

α(Proc,X)={21,22,40}<br />

α(Obud,L)={14,40}<br />

α(Ltr,Wow!)={15,16,18,19,22,37,39,40}<br />

α(Socket,I)={40}<br />

α(L2,O)={16,17,18,19,21,37,38,39,40}<br />

α(FSB,4)={14,15,16,34,37,38,39,40}<br />

α(Clock,Hyper)={16,40}<br />

α(PrT,Mikro)={16,40}<br />

α(Tmax,Chlodny)={1,2,10,14,15,24,25,26,29,30,38,40}<br />

α(Pmax,5)={13,14,22,37,38,39,40}<br />

α(HT,1)={13,14,15,16,21,22,40}<br />

α(MemC,0)=<br />

{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31<br />

,32,33,34,35,36,40}<br />

W ten sposób dodaliśmy ten obiekt. Jądro Nocoma jest już w naszej bazie...<br />

Przykład 3 – aktualizacja opisu obiektu<br />

Niech dane nam będzie zadanie modyfikacji opisu dopiero co wprowadzonego opisu Nocomy, tak by<br />

teraz opis wyglądał jak w kartotece wtórnej:<br />

.<br />

.<br />

.<br />

37 SledgeHammer A64 O1 Wow! 9a O 4 Szybki b.nowy Parzy 5 0 2<br />

38 Newcastle A64 O1 Tlum 9b O 4 Szybki b.nowy Chlodny 5 0 1<br />

39 ClawHammer A64 O1 Wow! 7c O 4 Szybki b.nowy Parzy 5 0 1<br />

40 Nocoma X I Wow! I O 4 Hyper Mikro Chlodny 5 1 0<br />

Aby to zrobić musimy usunąć wskaźnik do obiektu z jednej <strong>list</strong>y i wstawić go do innej. A zatem:<br />

α(Obud,L)={14}<br />

α(Obud,I)={40}


© COPYRIGHT 2004 MARCIN KARWIŃSKI & MARCIN DZIĘGIELEWSKI<br />

13 z 19<br />

Dokonaliśmy zatem zmiany opisu...<br />

Przykład 4 – usuwanie obiektu<br />

Aby usunąć obiekt, poza usunięciem nazwy i opisu, a zatem i wszystkich odnośników, należy zawsze<br />

sprawdzić czy taka zmiana nie zachwieje funkcją adresacji, przez co musielibyśmy dla wszystkich zmian<br />

ewentualnych adresu modyfikować opisy i <strong>list</strong>y obiektów dotknietych „fluktuacją”. W naszym przypadku<br />

usuwamy jednakże obiekt ostatni, więc nie będziemy musieli męczyć się z aktualizacją opisów innych<br />

obiektów. Przejdźmy więc do usuwania:<br />

α(Proc,X)={21,22}<br />

α(Obud,I)={Ø}<br />

α(Ltr,Wow!)={15,16,18,19,22,37,39}<br />

α(Socket,I)={Ø}<br />

α(L2,O)={16,17,18,19,21,37,38,39}<br />

α(FSB,4)={14,15,16,34,37,38,39}<br />

α(Clock,Hyper)={16}<br />

α(PrT,Mikro)={16}<br />

α(Tmax,Chlodny)={1,2,10,14,15,24,25,26,29,30,38}<br />

α(Pmax,5)={13,14,22,37,38,39}<br />

α(HT,1)={13,14,15,16,21,22}<br />

α(MemC,0)=<br />

{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31<br />

,32,33,34,35,36}<br />

Kartoteka w MLI ze zmniejszonym zbiorem <strong>list</strong> <strong>inwersyjnych</strong><br />

Zakładamy, że do naszego systemu funkcjonującego 24 godziny na dobę, 7 dni w tygodniu od miesiąca<br />

wpłynęło wystarczająco dużo pytań, stosunkowo zróżnicowanych, że możemy wykorzystać tę metodę dla<br />

zoptymalizowania procesu. Oto bowiem jak się przedstawia <strong>list</strong>a najczęściej pojawiających się<br />

deskryptorów w pytaniach kierowanych do naszego SWI:<br />

• α(Clock,b.szybki) – 75%<br />

• α(L2,O) – 10%<br />

• α(FSB,4) – 9%<br />

• α(PrT,b.nowy) – 3%<br />

Jak widać, ponieważ pozostałe deskryptory nie były do tej pory wykorzystywane przy zadawaniu pytań<br />

do systemu, to stwierdzamy, że pytania o inny deskryptor jak te wymienione powyzej i w dalszym<br />

funkcjonowaniu systemu będą grupą marginalną.<br />

Aktualizacje przedstawimy podobnie do aktualizacji w klasycznym podejściu do MLI, tj. Pokażemy tylko<br />

te <strong>list</strong>y inwersyjne, które w wyniku aktualizacji zmienią się.<br />

Przejdźmy więc do opisu dokładniejszego tej <strong>metody</strong>, bowiem w części teoretycznej podaliśmy tylko<br />

krótkie wprowadzenia do najczęściej stosowanych metod.<br />

Trochę teorii nie zawadzi, czyli od teoretyka do praktyka...<br />

W tej modyfikacji tworzymy <strong>list</strong>y inwersyjne α(d i ), gdzie d i є D' i U i d i = D'.<br />

Pytanie do systemu zadajemy w postaci termu t. Zakładamy, ze tak jak w klasycznej metodzie <strong>list</strong><br />

<strong>inwersyjnych</strong> term t ma postać sumy termów składowych:<br />

t = t 1 +...+ t m .<br />

Odpowiedź na taki term, tj. σ(t) jest sumą odpowiedzi na termy składowe. Wyszukiwanie odpowiedzi na<br />

term składowy z kolei odbywa się zależnie od tego jak wygląda ten term t i :<br />

• Przypadek pierwszy – wszystkie deskrytpory pytania d i є D'<br />

W tym przypadku wyszukiwanie odpowiedzi odbywa się tak jak w klasycznej metodzie <strong>list</strong><br />

<strong>inwersyjnych</strong>, tj.<br />

σ(t i ) = α(d 1 ) n α(d 2 ) n...n α(d m ), gdzie t i = d 1 ∙ d 2 ∙...∙ d m ,<br />

gdzie odpowiednio d j є D' i 1≤j≤m a m – liczba deskryptorów pytania t i .<br />

• Przypadek drugi – nie wszystkie deskryptory pytania t i należą do zbioru D'<br />

W tym przypadku znajdujemy najpierw odpowiedź przybliżoną jako zbiór X D' następującej postaci:<br />

X D' = ∩ j є J α(d j ), gdzie J = {j: d j є D', d j є t i }.<br />

Oczywiście X ti є X D' . Zatem dla deskryptorów ze zbioru D' znajdujemy zbiór obiektów zgodnie z metodą


© COPYRIGHT 2004 MARCIN KARWIŃSKI & MARCIN DZIĘGIELEWSKI<br />

14 z 19<br />

<strong>list</strong> <strong>inwersyjnych</strong>. Otrzymany zbiór obiektów przglądamy następnie metodą <strong>list</strong> prostych, aby znaleźć<br />

adresy obiektów, w których opisie są pozostałe deskryptory pytania, co opisuje poniższy wzór:<br />

σ(t i ) =X ti = {x є X D' , ρx(ai) = vi, (ai, vi) = di є t i oraz di∉D ' }.<br />

• Przypadek trzeci – wszystkie deskryptory pytania ti∉D '<br />

W tym przypadku nie pozostaje nam nic innego jak znaleźć odpowiedź metodą przeglądu zupełnego.<br />

Właściwa kartoteka, czyli widać zmniejszenie redundancji...<br />

Uzbrojeni w młodzieńczy zapał oraz tonaż wiedzy teoretycznej budujemy kartotekę wyszukiwawczą<br />

zmodyfikowanej MLI.<br />

α(Clock,b.szybki)={12,13,14,15,22}<br />

α(L2,O)={16,17,18,19,21,37,38,39}<br />

α(FSB,4)={14,15,16,34,37,38,39}<br />

α(PrT,b.nowy)={10,12,13,14,15,22,33,34,35,36,37,38,39}<br />

Jak widać tak zredukowana kartoteka, dla D' = {(Clock,b.szybki),(L2,O),(FSB,4),(PrT,b.nowy)} nie dość<br />

że zmniejszy redundancję to jeszcze, co było do przewidzenia, znacznie poprawi parametr z którego<br />

słynie MLI (oczywiście wciąż mówimy o pewnej klasie pytań – to jest przypadek pierwszy na pewno tu<br />

pasuje, drugi natomiast zależnie od czasu jaki będzie potrzebny na przegląd zupełny zawężonego<br />

podzbioru N lub X). Dodatkowo zastosowaliśmy tu dodatkową metodę czasową (3 z wymienionych w<br />

części teoretycznej), która dodatkowo powinna skrócić czas wyszukiwania odpowiedzi.<br />

MLI ze zmniejszonym zbiorem <strong>list</strong> <strong>inwersyjnych</strong> – przykłady<br />

Przejdźmy więc do podstawowych procesów/czynności jakie możemy na kartotece wyszukiwawczej w<br />

tej modyfikacji wykonać.<br />

Przykład 1 – wyszukanie obiektu<br />

Pomijamy prymitywny przypadek, gdy pytanie zawiera tylko i wyłącznie deskryptory, względem których<br />

dokonaliśmy modyfikacji, bowiem wtedy nie byłoby to niczym interesującym i nie wniosło by do tematu<br />

żadnej informacji. Niech dane nam będzie zadanie znalezienia tych jąder procesorowych, które oferują<br />

maksymalny zegar leżący gdzieś w przedziale (2.5GHz-3.5GHz), z ogromnym cachem L2 (tj. powyżej<br />

512KB) i szyną systemową 200MHz lub procesory produkowane w procesie technologicznym 130nm<br />

debiutujące w ramach rodziny Inetl Pentium4.<br />

Mamy więc:<br />

t = (Clock,b.szybki)•(L2,O)•(FSB,4) + (PrT,b.nowy)•(Proc,P4)<br />

czyli t = t 1 + t 2 po wydzieleniu termów składowych pytania.<br />

Zatem bazując na teorii mamy:<br />

σ(t 1 ) = α(d 1 ) n α(d 2 ) n α(d 3 )<br />

σ(t 2 ) = α(d 4 ) n α(d 5 )<br />

Jak widać odpowiedź na term składowy t 1 , tj. σ(t 1 ), zostanie wyznaczona w sposób klasyczny w ramach<br />

zawężonej kartoteki wyszukiwawczej, bo wszytkie deskryptory d i termu składowego t 1 należą do D'.<br />

Otrzymujemy więc, że:<br />

σ(t 1) = α(d 1) n α(d 2) n α(d 3) = {12,13,14,15,22} n {16,17,18,19,21,37,38,39} n {14,15,16,34,37,38,39} = Ø<br />

W drugim termie składowym sytuacja nieco się komplikuje, bowiem o ile deskrytpor d 4 =(PrT,b.nowy)<br />

jest jednym z wyodrębnionych deskryptorów, względem których przeprowadzony był proces<br />

optymalizacji, o tyle drugi deskryptor (d 5 = (Proc,P4)) już do tego wyodrębnionego zbioru D' nie należy.<br />

Mamy zatem przypadek drugi opisany w podczęści „Trochę teorii nie zawadzi...”. Postępując zgodnie z<br />

podaną tam techniką wyznaczamy zbiór przybliżony odpowiedzi generując <strong>list</strong>ę α(d 4 ):<br />

N ti | D' = α(d 4 ) = α(Pr.T,b.nowy) = {10,12,13,14,15,22,33,34,35,36,37,38,39}<br />

następnie korzystając z funkcji adresującej uzyskujemy obiekty będące przybliżoną odpowiedzią na nasze<br />

pytanie:


© COPYRIGHT 2004 MARCIN KARWIŃSKI & MARCIN DZIĘGIELEWSKI<br />

15 z 19<br />

X ti | D' = X D' = {Tualatin, NothwoodA, NorthwoodB, NorthwoodC, Prestonia, Gallatin, Palomino,<br />

Thoroughbred, Barton, Applebred, Thorton, SledgeHammer, Newcastle, ClawHammer}<br />

Dla takiego zbioru, kontynuując algorytm stosujemy metodę <strong>list</strong> prostych, czyli bazując na opisach:<br />

tTualatin = (Proc,P3)•(Obud,O2)•(Ltr,srednio)•(Socket,3)•(L2,S)•(FSB,1)•<br />

(Clock,sredni)•(PrT,b.nowy)•(Tmax,chlodny)•(Pmax,2)•(HT,0)•(MemC,0)<br />

tNorthwoodA = (Proc,P4)•(Obud,F)•(Ltr,tlum)•(Socket,4b)•(L2,D)•(FSB,2)•<br />

(Clock,b.szybki)•(PrT,b.nowy)•(Tmax,cieply)•(Pmax,4)•(HT,0)•(MemC,0)<br />

tNorthwoodB = (Proc,P4)•(Obud,F)•(Ltr,tlum)•(Socket,4b)•(L2,D)•(FSB,4)•<br />

(Clock,b.szybki)•(PrT,b.nowy)•(Tmax,cieply)•(Pmax,5)•(HT,1)•(MemC,0)<br />

tNorthwoodC = (Proc,P4)•(Obud,F)•(Ltr,tlum)•(Socket,4b)•(L2,D)•(FSB,4)•<br />

(Clock,b.szybki)•(PrT,b.nowy)•(Tmax,chlodny)•(Pmax,5)•(HT,1)•(MemC,0)<br />

tPrestonia = (Proc,P4)•(Obud,L)•(Ltr,wow!)•(Socket,4b)•(L2,D)•(FSB,4)•<br />

(Clock,b.szybki)•(PrT,b.nowy)•(Tmax,chlodny)•(Pmax,6)•(HT,1)•(MemC,0)<br />

tGallatin = (Proc,X)•(Obud,P1)•(Ltr,wow!)•(Socket,6)•(L2,D)•(FSB,0)•(Clock,b.szybki)<br />

•(PrT,b.nowy)•(Tmax,cieply)•(Pmax,5)•(HT,1)•(MemC,0)<br />

tPalomino = (Proc,AXP)•(Obud,O1)•(Ltr,duzo)•(Socket,A)•(L2,S)•(FSB,3)•(Clock,sredni)<br />

•(PrT,nowy)•(Tmax,zar)•(Pmax,4)•(HT,0)•(MemC,0)<br />

tThoroughbred = (Proc,AXP)•(Obud,O1)•(Ltr,duzo)•(Socket,A)•(L2,S)•(FSB,4)•<br />

(Clock,szybki)•(PrT,b.nowy)•(Tmax,zar)•(Pmax,4)•(HT,0)•(MemC,0)<br />

tBarton = (Proc,AXP)•(Obud,O1)•(Ltr,tlum)•(Socket,A)•(L2,D)•(FSB,3)•(Clock,szybki)•<br />

(PrT,b.nowy)•(Tmax,parzy)•(Pmax,4)•(HT,0)•(MemC,0)<br />

tApplebred = (Proc,D)•(Obud,O1)•(Ltr,srednio)•(Socket,A)•(L2,M)•(FSB,3)•<br />

(Clock,sredni)•(PrT,b.nowy)•(Tmax,parzy)•(Pmax,3)•(HT,0)•(MemC,0)<br />

tThorton = (Proc,AXP)•(Obud,O1)•(Ltr,duzo)•(Socket,A)•(L2,S)•(FSB,)•(Clock,szybki)•<br />

(PrT,b.nowy)•(Tmax,zar)•(Pmax,4)•(HT,0)•(MemC,0)<br />

tSledgeHammer = (Proc,A64)•(Obud,O1)•(Ltr,wow!)•(Socket,9a)•(L2,O)•(FSB,)4•<br />

(Clock,szybki)•(PrT,b.nowy)•(Tmax,parzy)•(Pmax,5)•(HT,0)•(MemC,2)<br />

tNewcastle = (Proc,A64)•(Obud,O1)•(Ltr,tlum)•(Socket,9b)•(L2,O)•(FSB,4)•<br />

(Clock,szybki)•(PrT,b.nowy)•(Tmax,chlodny)•(Pmax,5)•(HT,0)•(MemC,1)<br />

tClawHammer = (Proc,A64)•(Obud,O1)•(Ltr,wow!)•(Socket,7c)•(L2,O)•(FSB,4)•<br />

(Clock,szybki)•(PrT,b.nowy)•(Tmax,parzy)•(Pmax,5)•(HT,0)•(MemC,1)<br />

Przeprowadzamy przeszukiwanie:<br />

σ(d 5 ) = σ((Proc, P4))<br />

dla odnalezienia odpowiedzi szczegółowej:<br />

t 2 ≤tTualatin nie bo d 5 !≤ tTualatin<br />

t 2 ≤tNorthwoodA tak bo d 5 ≤ tNorthwoodA<br />

t 2 ≤tNorthwoodB tak bo d 5 ≤ tNorthwoodB<br />

t 2 ≤tNorthwoodC tak bo d 5 ≤ tNorthwoodC<br />

t 2 ≤tPrestonia tak bo d 5 ≤ tPrestonia<br />

t 2 ≤tGallatin nie bo d 5 !≤ tGallatin<br />

t 2 ≤tPalomino nie bo d 5 !≤ tPalomino<br />

t 2 ≤tThoroughbred nie bo d 5 !≤ tThoroughbred<br />

t 2 ≤tBarton nie bo d 5 !≤ tBarton<br />

t 2 ≤tApplebred nie bo d 5 !≤ tApplebred<br />

t 2 ≤tThorton nie bo d 5 !≤ tThorton<br />

t 2 ≤tSledgeHammer nie bo d 5 !≤ tSledgeHammer<br />

t 2 ≤tNewcastle nie bo d 5 !≤ tNewcastle<br />

t 2 ≤tClawHammer nie bo d 5 !≤ tClawHammer<br />

Bez problemu więc uzyskaliśmy, że<br />

σ(t 2 ) = {NorthwoodA, NorthwoodB, NorthwoodC, Prestonia} = {12,13,14,15}.


© COPYRIGHT 2004 MARCIN KARWIŃSKI & MARCIN DZIĘGIELEWSKI<br />

16 z 19<br />

Udzielamy więc odpowiedź całkowitą:<br />

σ(t) = σ t1∪σ t2 = Ø∪{12,13,14 ,15 } = {12,13,14,15}<br />

Ponownie korzystając z funkcji adresowej otrzymujemy ostateczny wynik czytelny dla użytkownika:<br />

σ(t) = {NorthwoodA, NorthwoodB, NorthwoodC, Prestonia}.<br />

Przykład 2 – wstawianie nowego obiektu<br />

Niech dane nam będzie zadanie wstawienia informacji o procesorze Nocona. Mamy dane po<br />

zinterpretowaniu tekstu normalnego takie informacje o jądrze 64bitowym Intela architekturalnie zgodnym<br />

wstecznie przedstawione w formie adekwatnej do naszej kartoteki wtórnej:<br />

.<br />

.<br />

.<br />

37 SledgeHammer A64 O1 Wow! 9a O 4 Szybki b.nowy Parzy 5 0 2<br />

38 Newcastle A64 O1 Tlum 9b O 4 Szybki b.nowy Chlodny 5 0 1<br />

39 ClawHammer A64 O1 Wow! 7c O 4 Szybki b.nowy Parzy 5 0 1<br />

40 Nocoma X L Wow! I O 4 Hyper Mikro Chlodny 5 1 0<br />

To samo zapisane w kartotece wyszukiwawczej MLP by wyglądało tak:<br />

tNocoma = (Proc,X)•(Obud,L)•(Ltr,wow!)•(Socket,I)•(L2,O)•(FSB,4)•(Clock,Hyper)•<br />

(PrT,Mikro)•(Tmax,chlodny)•(Pmax,5)•(HT,1)•(MemC,0)<br />

Aby wstawić taki obiekt musimy tak zmodyfikować wszystkie <strong>list</strong>y inwersyjne opisujące deskryptory<br />

występujące w opisie nowego obiektu by wskazywały na nowy obiekt. Dodatkowo w przypadku gdy w<br />

kartotece wyszukiwawczej dla <strong>metody</strong> klasycznej tego obiektu nie ma musimy go tam wstawić, po czym<br />

wygenerować na nowo kartotekę wyszukiwawczą dla MLI ze zmniejszonym zbiorem <strong>list</strong> <strong>inwersyjnych</strong>.<br />

Przystępujemy do aktualizacji klasycznej kartoteki wyszukiwawczej:<br />

α(Proc,X)={21,22,40}<br />

α(Obud,L)={14,40}<br />

α(Ltr,Wow!)={15,16,18,19,22,37,39,40}<br />

α(Socket,I)={40}<br />

α(L2,O)={16,17,18,19,21,37,38,39,40}<br />

α(FSB,4)={14,15,16,34,37,38,39,40}<br />

α(Clock,Hyper)={16,40}<br />

α(PrT,Mikro)={16,40}<br />

α(Tmax,Chlodny)={1,2,10,14,15,24,25,26,29,30,38,40}<br />

α(Pmax,5)={13,14,22,37,38,39,40}<br />

α(HT,1)={13,14,15,16,21,22,40}<br />

α(MemC,0)=<br />

{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31<br />

,32,33,34,35,36,40}<br />

W ten sposób dodaliśmy ten obiekt. Jądro Nocoma jest już w naszej bazie... Pozostaje tylko<br />

zmodyfikowanie/aktualizacja kartoteki wyszukiwawczej w modyfikacji MLI:<br />

α(Clock,b.szybki)={12,13,14,15,22}<br />

α(L2,O)={16,17,18,19,21,37,38,39,40}<br />

α(FSB,4)={14,15,16,34,37,38,39,40}<br />

α(PrT,b.nowy)={10,12,13,14,15,22,33,34,35,36,37,38,39}<br />

Ot i cała robota skończona!<br />

Przykład 3 – aktualizacja opisu obiektu<br />

Niech dane nam będzie zadanie modyfikacji opisu dopiero co wprowadzonego opisu Nocomy, tak by<br />

teraz opis wyglądał jak w kartotece wtórnej:<br />

.<br />

.<br />

.


© COPYRIGHT 2004 MARCIN KARWIŃSKI & MARCIN DZIĘGIELEWSKI<br />

17 z 19<br />

37 SledgeHammer A64 O1 Wow! 9a O 4 Szybki b.nowy Parzy 5 0 2<br />

38 Newcastle A64 O1 Tlum 9b O 4 Szybki b.nowy Chlodny 5 0 1<br />

39 ClawHammer A64 O1 Wow! 7c O 4 Szybki b.nowy Parzy 5 0 1<br />

40 Nocoma X I Wow! I O 4 Hyper Mikro Chlodny 5 1 0<br />

Aby to zrobić musimy usunąć wskaźnik do obiektu z jednej <strong>list</strong>y i wstawić go do innej. Oczywiście<br />

wszelka zmiana <strong>list</strong>y inwersyjnej wybranej do optymalizowanego zbioru D' pociąga za sobą<br />

przygotowanie nowej zmodyfikowanej kartoteki wyszukiwawczej bazującej na zaktualizowanej kartotece<br />

<strong>metody</strong> klasycznej. A zatem:<br />

α(Obud,L)={14}<br />

α(Obud,I)={40}<br />

Dokonaliśmy zatem zmiany opisu... Jak widać nie trzeba było zmieniać kartoteki wyszukiwawczej w<br />

zmodyfikowanej MLI. Załóżmy jednak, ze należy przeprowadzić inną aktualizcję, bo użytkownik pomylił<br />

się co do najszybszego zegara oferowanego przez jądro Nocoma, tzn. Niech teraz kartoteka wtórna zyska<br />

takie oblicze:<br />

.<br />

.<br />

.<br />

37 SledgeHammer A64 O1 Wow! 9a O 4 Szybki b.nowy Parzy 5 0 2<br />

38 Newcastle A64 O1 Tlum 9b O 4 Szybki b.nowy Chlodny 5 0 1<br />

39 ClawHammer A64 O1 Wow! 7c O 4 Szybki b.nowy Parzy 5 0 1<br />

40 Nocoma X I Wow! I O 4 b.szybki Mikro Chlodny 5 1 0<br />

Jak widać taka aktualizacja ma na celu zmianę <strong>list</strong> <strong>inwersyjnych</strong> α(Clock,b.szybki) i α(Clock,Hyper):<br />

α(Clock,b.szybki)= {12,13,14,15,22, 40}<br />

α(Clock,Hyper)= {16}<br />

a co za tym idzie modyfikujemy również kartotekę wyszukiwawczą w MLI ze zmniejszonym zbiorem <strong>list</strong><br />

<strong>inwersyjnych</strong>. Tak więc nasz nowa kartoteka wyszukiwawcza przyjmuje taką postać:<br />

α(Clock,b.szybki)={12,13,14,15,22, 40}<br />

α(L2,O)={16,17,18,19,21,37,38,39,40}<br />

α(FSB,4)={14,15,16,34,37,38,39,40}<br />

α(PrT,b.nowy)={10,12,13,14,15,22,33,34,35,36,37,38,39}<br />

Przykład 4 – usuwanie obiektu<br />

Aby usunąć obiekt, poza usunięciem jego nazwy i opisu, a zatem i wszystkich odnośników w kartotece,<br />

należy zawsze sprawdzić czy taka zmiana nie zachwieje funkcją adresacji, przez co musielibyśmy dla<br />

wszystkich zmian/fluktuacji adresów innych obiektów modyfikować opisy i <strong>list</strong>y obiektów dotknietych tą<br />

zmianą. W naszym przypadku usuwamy jednakże obiekt ostatni (dopiero co zaktualizowany procesor<br />

Intela – Nocomę), więc nie będziemy musieli męczyć się z aktualizacją opisów innych obiektów.<br />

Przejdźmy więc do usuwania – usuwamy dane z kartoteki klasycznej <strong>metody</strong>:<br />

α(Proc,X)={21,22}<br />

α(Obud,I)={Ø}<br />

α(Ltr,Wow!)={15,16,18,19,22,37,39}<br />

α(Socket,I)={Ø}<br />

α(L2,O)={16,17,18,19,21,37,38,39}<br />

α(FSB,4)={14,15,16,34,37,38,39}<br />

α(Clock,b.szybki)={12,13,14,15,22}<br />

α(PrT,Mikro)={16}<br />

α(Tmax,Chlodny)={1,2,10,14,15,24,25,26,29,30,38}<br />

α(Pmax,5)={13,14,22,37,38,39}<br />

α(HT,1)={13,14,15,16,21,22}<br />

α(MemC,0)=<br />

{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36}<br />

Teraz przechodzimy do finalnej części procesu usuwania, czyli do aktualizacji kartoteki zmodyfikowanej:<br />

α(Clock,b.szybki)={12,13,14,15,22}<br />

α(L2,O)={16,17,18,19,21,37,38,39}<br />

α(FSB,4)={14,15,16,34,37,38,39}


© COPYRIGHT 2004 MARCIN KARWIŃSKI & MARCIN DZIĘGIELEWSKI<br />

18 z 19<br />

α(PrT,b.nowy)={10,12,13,14,15,22,33,34,35,36,37,38,39}<br />

W ten oto sposób usunęliśmy obiekt Nocoma, a także zaktualizowaliśmy wszystkie <strong>list</strong>y odnoszące się do<br />

usuniętego obiektu. Proces istotnie zakończony.<br />

Parametry MLI, czyli króciutkie podsumowanie...<br />

Struktura bazy danych<br />

Struktura w tej metoszie jest na pewno bardziej złożona aniżeli jej odpowiednik w metodzie <strong>list</strong> prostych.<br />

Bierze się to stąd, iż poza pamiętaniem opisów obiektów istnieje konieczność pamiętania w kartotece<br />

wyszukiwawczej wysoce redundantnego systemu <strong>list</strong> <strong>inwersyjnych</strong> utworzonych dla deskryptorów tego<br />

systemu. Dodatkowo, dla obiektów o dużych nazwach, bądź występujących w bardzo dużych systemach,<br />

dla ułatwienia i przyspieszenia czynności opartych na kartotece wyszukiwawczej, i dla jej zmniejszenia,<br />

wprowadza się funkcję adresową, która również wnosi pewną redundancję i pewne skomplikowanie owej<br />

struktury.<br />

Redundancja i zajętość pamięci<br />

Metoda ta wnosi dużą redundancję określaną wzorem:<br />

R = (∑ r i=1 #α(d i ) – N)/N,<br />

gdzie r – liczba deskryptorów w systemie, N – liczba obiektów (lub adresów), a symbol #x oznacza moc<br />

zbioru x. Pewne modyfikacje wpływają na zmniejszenie wartości ∑ r i=1 #α(d i ) w podsystemach, albowiem:<br />

1. zmniejszają liczbę deskryptorów r, albo<br />

2. skracają <strong>list</strong>y inwersyjne.<br />

Zatem modyfikacje tej grupy zmniejszają redundancję w podsystemach przy jednoczesnym zachowaniu<br />

lub tylko niewielkim zmniejszeniu szybkości pracy systemu. Inne modyfikacje zmniejszają redundancję,<br />

kosztem niepełnej informacji uzyskiwanej bezpośrednio bazując na zmodyfikowanej kartotece<br />

wyszukiwawczej. Przez co są odpowiednie tylko dla określonej klasy pytań.<br />

Aktualizacja bazy danych<br />

Wszelkie aktualizacje związane z liczbą obiektów pamiętanych w systemie, zmianą ich opisów, czy pełną<br />

reorganizacją są wykonywane w podobny sposób. Każda aktualizacja wymaga bowiem dokonania zmian<br />

w <strong>list</strong>ach <strong>inwersyjnych</strong> niezależnie od dodania czy usunięcia samego opisu obiektu w systemie. W<br />

przypadku zmian w opisie natomiast, jesteśmy zmuszeni usunąć obiekt o nieaktualnym opisie,<br />

wprowadzić nowy aktualny, oraz zreorganizować i zupdate'wać odpowiednie <strong>list</strong>y inwersyjne.<br />

Wprowadzenie natomiast większości modyfikacji pociąga za sobą w tym procesie całościową<br />

reorganizację bazy danych.<br />

Czas wyszukiwania<br />

Czas wyszukiwania w tej metodzie jest bez wątpienia bardzo krótki. W przypadku gdy pytanie jest<br />

zadane w postaci sumy deskryptorów, tj.<br />

t = d 1 + d 2 + d 3 + ... + d k<br />

odpowiedź jest niemal natychmiastowa i czas wyszukiwania τ jest nieomal równy czasowi generowania<br />

<strong>list</strong> τ g :<br />

τ = τ g ,<br />

czy też jak kto woli czasowi wyszukania w kartotece wyszukiwawczej odpowiednich, uprzednio<br />

wygenerowanych <strong>list</strong> τ s i ich połączenia.<br />

W przypadku gdy pytanie zadajemy w postaci termu t będącego sumą termów składowych t = t 1 +...+ t m ,<br />

to znaczy pytanie jest sumą pytań składowych t i = d 1 ∙ d 2 ∙...∙ d k czas odpowiedzi na pytanie t jest dłuższy,<br />

gdyż dochodzi czas potrzebny na znalezienie części wspólnej wygenerowanych lis:<br />

τ = ∑ i (τ gi + τ pi ),<br />

gdzie: τ gi – czas generowania i-tej <strong>list</strong>y, a τ pi – czas porównywania i-tej <strong>list</strong>y z resztą.<br />

Czas generowania zależy od pytania t i – bo zależy od liczby deskryptorów w pytaniu, czas porównywania<br />

z kolei zależy od liczby deskryptorów pytania t i oraz od długości <strong>list</strong> związanych z tym pytaniem (τ p ><br />

τ g ). Modyfikacje mogą prowadzić do dodania czasu przeglądu <strong>list</strong>, zatem czas wyszukiwania będzie<br />

równy:<br />

τ' = τ + τ 0 ,


© COPYRIGHT 2004 MARCIN KARWIŃSKI & MARCIN DZIĘGIELEWSKI<br />

19 z 19<br />

gdzie τ 0 – czas wynikający z konieczności przeglądu zupełnego pewnych opisów obiektów z<br />

wygenerowanej <strong>list</strong>y.<br />

Język wyszukiwania<br />

W przypadku tej <strong>metody</strong> mozemy zastosować rózne języki – tworzenie <strong>list</strong> jest łatwe przy zadanym<br />

zbiorze deskryptorów, stąd też stosowanie prostego języka deskryptorowego jest bardzo dogodne. W<br />

przypadku systemu pracującego w języku naturalnym konieczne jest natomiast wyodrębnienie zbioru<br />

deskryptorów charakterystycznych dla danej dziedziny w naszym systemie.<br />

Tryb pracy<br />

Ze względu na stosunkowo czasochłonną aktualizację metoda ta używana jest raczej przy pracy<br />

wsadowej (bez konieczności bieżęcej aktualizacji).<br />

Wnioski, czyli jeszcze trochę ględzenia na koniec...<br />

W odróżnieniu od innych metod wyszukiwania, metoda <strong>list</strong> <strong>inwersyjnych</strong> przy zapytaniu nie wymaga<br />

przeszukiwania całej bazy. Stąd też, a także z faktu pewnego przyśpieszenia procesu wyszukiwania,<br />

można powiedzieć że jest to metoda, w której dla pewnej klasy zapytań osiągane są bardzo krótkie czasy<br />

wyszukiwania odpowiedzi. Z tego też powodu jest to metoda często stosowana w sytemach<br />

wyszukiwania informacji wszelakiego typu. Wadą tej <strong>metody</strong>, i to stosunkowo istotną, może być to, że na<br />

przetrzymywanie kartoteki wyszukiwawczej potrzebna jest dodatkowa pamięć. Jednakże istnieją pewne<br />

modyfikacje prawie likwidujące lub silnie minimalizujące tą wadę.<br />

W metodzie tej, dla każdego z deskryptorów wypisujemy kolejno adresy wszystkich obiektów<br />

zawierających dany deskryptor. Dla pytań bardziej szczegółowych należy wyszukać <strong>list</strong>y inwersyjne dla<br />

każdego z deskryptorów pytania, a odpowiedź powstaje przez określenie części wspólnej tych <strong>list</strong>.<br />

Sposób ten jest alternatywnym do sposobu dla <strong>list</strong> łańcuchowych dla pytań szczegółowych. Z założenia w<br />

metodzie <strong>list</strong> <strong>inwersyjnych</strong> nie pamięta się długości <strong>list</strong> dla poszczególnych deskryptorów (brak tablicy<br />

adresowej), tak więc obliczanie części wspólnej może okazać się znacznie bardziej opłacalne pod<br />

względem czasowym.<br />

Metody <strong>list</strong> prostych i <strong>list</strong> <strong>inwersyjnych</strong> umożliwiały uzyskiwanie bardzo szybkich odpowiedzi na pytania<br />

ogólne (np. jednodeskryptorowe). Pytania bardziej szczegółowe znacznie wydłużały proces<br />

wyszukiwania. Oczywiście pojęcie "długo" czy "krótko" są pojęciami względnymi. W zależności od<br />

implementacji programowej względny jest również stopień zajęcia pamięci przez odnośniki, tablice<br />

adresowe (np. dla <strong>list</strong> łańcuchowych), <strong>list</strong>y inwersyjne. Do baz niewielkich, gdzie zakładamy, że<br />

będziemy do bazy zadawać pytania ogólne - na pewno <strong>metody</strong> podane wyżej będą wystarczające. W<br />

epoce komputerów opracowano jednak szereg metod matematycznych, pozwalających na bardzo szybkie<br />

uzyskiwanie odpowiedzi na pytanie szczegółowe w bazach danych o wielu elementach. Postaramy się, w<br />

ramach następnych sprawozdań, przedstawić przynajjmniej najpopularniejsze dwie z nich: metodę<br />

Chowa i metodę Luma.<br />

Mamy nadzieje, ze całe nasze <strong>sprawozdanie</strong> udowodniło konieczność stosowania bardziej efektywnych<br />

algorytmów, oraz fakt iż lepszy algorytm to więcej niz lepszy komputer. Kiepski algorytm potrafi<br />

zadławić nawet najnowszy superkomputer, podczas gdy znalezienie nowego sposobu wyszukiwania<br />

informacji, który byłby znacznie szybszy pozwala znacznie skrócić czasy wyszukiwania i to przy<br />

znacznie niższych kosztach.<br />

Ostatecznie więc podsumowując... W metodzie <strong>list</strong> <strong>inwersyjnych</strong>) czasy odpowiedzi na pytania<br />

jednodesktyptorowe są bardzo krótkie, ale to przyspieszenie wykonane jest kosztem dużej redundancji!<br />

C.D.N ;-)

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!