3.4.6 R-Tree • Idee: (Guttman, 1984) – Im Gegensatz zu den bisherigen Strukturen soll der R-Baum perfekt balanciert sein. Wie beim B-Baum soll jeder Knoten (ausser der Wurzel) einen MindestFüllgrad aufweisen und die Blätter sollen alle auf der selben Höhe liegen. R-Tree Multimedia Retrieval - SS01 Kap.3-93 – Im R-Baum gibt es zwei Knotentypen: • Blattknoten enthalten die Punktdaten. Für jedes Blatt wird zudem das kleinste Rechteck gespeichert, welches alle Punkte des Blattes enthält (minimum bounding region, MBR). Natürlich sollten Blätter so gewählt werden, dass sie nur benachbarte Punkte enthalten. • Innere Knoten umfassen entweder eine Menge von Blattknoten oder eine Menge von inneren Knoten. Ein innerer Knoten enthält alle MBRs seiner Kindknoten und seine eigene MBR. – Einfügen eines neuen Punktes in den R-Baum 1. Suche einen Pfad von der Wurzel zu einem Blatt 2. Füge den neuen Punkt in den Blattknoten ein und passe evtl. die MBR des Blattes an (falls der Punkt nicht im MBR des Blattes liegt) 3. Falls das Blatt voll ist, d.h. kein Platz für den Punkt vorhanden ist, dann teile das Blatt in zwei neue Blätter auf. Füge die neuen Blätter in den Elternknoten ein. Dies kann evtl. zu einem Überlauf des Elternknotens führen. In diesem Fall wird rekursiv weiter geteilt. 4. Falls die Wurzel geteilt werden muss, dann muss ein neuer Wurzelknoten erzeugt werden. Dabei wird die Höhe des Baumes um 1 grösser. – Dieser Einfügalgorithmus garantiert, dass der Baum stets balanciert ist und dass alle Knoten (ausser der Wurzel) mind. einen Füllgrad von 50% aufweisen. Multimedia Retrieval - SS01 Kap.3-94 – Einige Punkte des Einfügealgorithmuses bedürfen weiterer Erläuterungen • Suchen eines Pfades von der Wurzel zu einem Blatt: Da sich die MBRs der inneren Knoten überlappen können, gibt es mehrere Möglichkeiten, um einen Kindknoten auszuwählen. – Falls der neue Punkt in keiner MBR enthalten ist, dann wird derjenige Knoten selektiert, dess MBR am nächsten zum neuen Punkt liegt. – Falls der neue Punkt in genau einer MBR enthalten ist, dann folge dem entsprechenden Kindknoten – Falls der neue Punkt in mehreren MBRs liegt, dann wähle einen Knoten aus (z.B. zufällig, oder nach einer bestimmten Metrik) Damit kann also nicht garantiert werden, dass ein neuer Punkt auch tatsächlich in das beste Blatt eingefügt wird. gewähltes Blatt Auf der ersten Stufe des Baumes (äussere Rechtecke) scheint der neue Punkt besser zum linken Bereich zu passen (Punkt liegt ganz am Rande des rechten Bereichs). Auf Blattstufe wäre aber ein Blatt des linken Bereichs besser. Neuer Punkt bestes Blatt Multimedia Retrieval - SS01 Kap.3-95 • Aufteilen eines Blattes (splitting): Falls ein Knoten überläuft, so müssen zwei neue Knoten konstruiert werden. Die Aufteilung der Punkte/MBRs sollte möglichst so erfolgen, dass die MBRs der neuen Knoten disjunkt werden. Zu diesem Zweck werden die MBRs eines Knotens entlang einer Achse geteilt und in zwei Gruppen getrennt. Ein Optimalitätskriterium bestimmt, welche Achse gewählt wird und wie die Gruppen zusammengesetzt sein müssen. In der Regel führt das Aufteilen aber nicht zu disjunkten Bereichen. – Punktsuche: • Der Baum wird von der Wurzel zu den Blättern traversiert. Bei jedem inneren Knoten werden all jene Kindknoten weiterverfolgt, deren MBR den Punkt enthalten. In Blattknoten wird direkt nach dem Punkt gesucht. • Im Gegensatz zum k-d-Tree (k-d-B-Tree) führt die Punktsuche im R-Baum evtl. zum Besuch von mehreren Blättern (wegen der Überlappung der MBR) – „Spatial data“ • Der R-Baum kann nicht nur Punktdaten verwalten sondern beliebige Extensionen (z.B. Rechtecke, Polygone, Kreise, etc.). Die Blätter enthalten dann nicht mehr Punkte sonder Rechtecke, welche die Extension der Datenobjekte begrenzen (minimum bounding box). • Der R-Baum ist sehr verbreitet im GIS Bereich. Einzelne Datenbanken (Informix) bieten den R-Baum als Indestruktur an Multimedia Retrieval - SS01 Kap.3-96 • Vorteile: – Der R-Baum ist stets perfekt balanciert. Die Höhe des Baumes ist logarithmisch in der Anzahl der Punkte. – Die Implementierung ist optimiert für sekundäre Speicher. Z.B. können die inneren Knoten in einem Cache im Hauptspeicher gehalten werden. Nur die Blätter müssen von Disk geladen werden – Gute Performanz in niedrig-dimensionalen Räumen – Es exisitieren einige Bulkload-Operationen, welche das Aufbauen des Baumes enorm beschleunigen • Nachteile: – Die Überlappung der MBRs ist eines der grossen Probleme des R-Baums. Der RBaum sollte deshalb von Zeit zu Zeit neu aufgebaut werden (und zwar mit einem Bulkload-Algorithmus) – Schlechte Performanz in hoch-dimensionalen Räumen – Grundoperationen (insert, update, delete) sind recht teuer Multimedia Retrieval - SS01 • Kap.3-97 R-Tree Erweiterungen – In den letzten Jahren sind unzählige Erweiterungen/Verfeinerungen des R-Baums publiziert worden. Das Grundkonzept des Baumes ist aber stets dasselbe. Varriert wurden unter anderem: • Die Form der MBRs: – Der SS-Baum (SS: similarity search) und SS+-Baum benutzen kreisförmige Regionen um die Ausdehnung der Knoten zu beschreiben. – Der TV-Baum (TV: telescope vector) benutzt eine variable Anzahl von Dimensionen für die Indxierung, d.h. die inneren Knoten „sehen“ nur die wichtigsten Komponenten der Vektoren darunter. Wie der SS-Baum werden die MBRs mit Sphären beschrieben – Der SR-Baum benutzt eine Kombination von Rechtecken und Sphären zur Beschreibung der MBRs. • Splitting: – Der SS+-Baum verwendet einen Clusterungsalgorithmus (k-means), um den übervollen Knoten aufzuteilen – Der R*-Baum teilt einen Knoten analog zum R-Baum. Um die Überlappung der MBRs zu verkleineren, wird bei jedem Aufteilen eines Blattknotens ein Teil der Punkte neu eingefügt – Der X-Baum teilt die Knoten so auf, dass (fast) keine Überlappungen entstehen. Multimedia Retrieval - SS01 Kap.3-98 • Seitengrösse der Knoten: – Der X-Baum verwendet sogenannte Superknoten. Falls sich ein split nicht lohnt (Überlappung zu gross), dann wird der Knoten nicht geteilt sondern auf mehreren Seiten gespeichert (overflow buffer) – Noch einen Schritt weiter geht der DABS-Baum. Bei jedem Überlauf wird mit Hilfe eines Kostenmodells überprüft, welche Seitengrösse optimal für einen Knoten ist. • Metrik: – Während alle bisher besprochenen Bäume nur für d-dimensionale Räume mit einer Ls-norm verwendet werden können, bietet der M-Baum eine hierarchische Struktur für beliebige Metriken an. Die gespeicherten Objekte müssen nicht mal Punktdaten sein. So kann der M-Baum auch mit Strings und „Edit-Distance“ umgehen. Multimedia Retrieval - SS01 Kap.3-99 Übersicht der R-Baum Erweiterungen • R-Tree [Guttman:1984] • R+-Tree [Sellis:1987] – nur nicht-überlappende MBRs auf der selben Indexhöhe; zu diesem Zweck können Objekte mit einer Fläche>0 auf mehrere Knoten verteilt werden, d.h. die Objekte werden in mehreren Blättern redundant gespeichert • R*-Tree [Beckmann:1990] – bessere Splitting Strategie im Vergleich zu R- und R+-Baum – Bei jedem split wird ein Teil der Datenobjekte erneut eingefügt; diese Restrukturierung führen zu einer weiteren Verkleinerung der Überlappung der MBRs • P-Tree [Jagadish:1990] – Beim Splitting können die Knoten nicht nur entlang der Achsen geteilt werden, sondern auch entlang weiterer m Richtungen. – MBRs werden durch Polygone beschrieben; die Seitenflächen liegen orthogonal zu einer der m Richtungen oder einer der Achsen • TV-Tree [Faloutsos:1994] – In inneren Knoten werden die Vektoren durch niedrig-dimensionale Vektoren approximiert (eine Art Dimensionsreduktion). Dadurch soll es möglich werden, auch sehr hoch-dimensionale Daten zu indexieren. Multimedia Retrieval - SS01 Kap.3-100 • vp-Tree [Chiueh:1994] – Der vp-Tree ist ein binärer Suchbaum, der rekursiv von der Wurzel zu den Blättern aufgebaut wird (top-down). – In jedem Knoten wird ein so genannter vantage point ermittelt. Die Datenpunkte werden in Abhängigkeit ihrer Distanz zum vantage point in zwei Gruppen aufgeteilt, d.h. in eine Gruppe mit Distanzen kleiner der Median-Distanz und in eine Gruppe mit Distanzen grösser der Median-Distanz. Die zwei Gruppen bilden die neuen Kindknoten und werden rekursiv weiter geteilt bis die Knoten genügend klein sind. • X-Tree [Berchtold:1996] – Verbesserter Splitting-Algorithmus (fast keine Überlappungen der MBRs mehr) – Optimierte Disk-Organisation für hoch-dimensionale Räume; Falls sich ein split nicht lohnt (resultierende Knoten haben eine zu starke Überlappung) werden die Knoten zu so genannte Super-nodes umgewandelt. Ein Super-node kann auf mehreren Diskseiten liegen • SS-Tree [White:1996] – Der SS-Baum verwendet wie der R*-Baum eine re-insertion strategy, um die Überlappung der MBRs zu verkleinern (welche leicht unterschiedlich ist). Desweiteren werden sphärische MBRs benutzt. • SS+-Tree [Kurniawati:1997] – Eine Erweiterung des SS-Baums, welche im Durchschnitt kleinere MBRs für die Knoten benutzt. Bei der Teilung wird ein Clusterungs-Algorithmus angewendet. Multimedia Retrieval - SS01 Kap.3-101 • SR-Tree [Katayama:1997] – Der SR-Baum ist eine Mischung des R*-Baumes und des SS-Baumes. Die MBRs werden mit Hilfe von Rechtecken und Sphären bestimmt, d.h. die MBRs werden durch den Schnitt von Rechteck und Sphäre beschrieben. • M-Tree [Ciaccia:1997] – Der M-Baum eignet sich nicht nur für Vektorräume mit einer Lp-Norm, sondern kann beliebige Objekte, für die eine Metrik definiert wurde, verwalten. In einem Vektorraum mit L2-Norm sieht der M-Baum wie ein SS-Baum aus. • DABS-Tree [Böhm:2000] – Verfeinert das Konzept der Super-nodes im X-Tree. Ein Knoten muss nun nicht mehr auf eine Diskseite passen, sondern kann auf mehrere, nacheinander liegenden Seiten abgespeichert werden. Die optimale (in Bezug auf Suchkosten) Grösse der Knoten wird mit Hilfe eines Kostenmodells ermittelt. • GiST [Hellerstein:1995] – Der generalized search tree ist ein Framework für multi-dimensionale Indexstrukturen. Die Implementierung übernimmt die ganze Verwaltung (inkl. Diskorganisation); der Benutzer muss nur noch die Index spezifischen Merkmale hinzufügen (z.B. splitting, Format der Datenobjekte, Format der inneren Knoten, re-insertion Strategie) Multimedia Retrieval - SS01 Kap.3-102 3.4.7 Andere hierarchische Indexstrukturen • Pyramid-Tree [Berchtold:1998] – Der Pyramid-Baum ist ein auf die L∞-Norm optimierter Index. Der Datenraum wird durch Pyramiden aufgeteilt, deren Grundfläche einer Aussenfläche des (rechteckigen) Datenraums entsprichen und deren Spitzen sich in einem Punkt im Raum treffen. Jede Pyramide wird entlang der Falllinie von Spitze zu Grundfläche in mehrere Scheiben aufgeteilt. Wie bei den space-filling curves kann mit Hilfe dieser Scheiben und einer geeigneten Nummerierung eine Abbildung der Punkte auf einen ein-dimensionalen Bereich definiert werden. • P-Sphere Tree [Goldstein:2000] – Der P-Sphere Baum hat eine zweistufige Struktur: die Wurzel enthält eine Menge von sphärischen MBRs; jede MBR repräsentiert eine Menge von Punkten, welche in den Blattknoten gespeichert sind. – Im Gegensatz zu allen bisher besprochenen Ansätzen kann ein Punkt in mehreren Blättern gespeichert sein, d.h. der P-Sphere Baum nimmt Redundanzen in Kauf. Auf der anderen Seite sind die Blätter und deren MBRs so gross, dass nur noch sehr wenige Blätter bei der NN-Suche betrachtet werden müssen. Mit anderen Worten, die eingeführte Redundanz soll die Suchzeiten reduzieren. – Der P-Sphere Tree ist, gemäss Messungen, eine gute Alternative für Räume mit 10-100 Dimensionen. Multimedia Retrieval - SS01 Kap.3-103 3.4.8 NN-Suche in hierarchischen Strukturen • • Hjaltson und Samet haben 1995 einen allgemein gültigen Algorithmus vorgestellt, der eine optimale NN-Suche in Bäumen ausführt. Optimal heisst hierbei, dass die Anzahl besuchter Blätter und damit auch die Anzahl gelesener Seiten minimal ist. Der Algorithmus verwendet eine Priority-Queue für die Knoten und Punkte. Die Priorität ist dabei gegeben als der minimale Abstand des Anfragepunktes zur MBR des Knotens resp. zum Punkt (aufsteigend geordnet, d.h. zuoberst ist der Knoten/Punkt mit kleinster Distanz). Die Knoten/Punkte werden dann in dieser Reihenfolge besucht. Für einen gegebenen Anfragepunkt wird der nächste Nachbar wie folgt ermittelt: 1. Initialisierung: der Wurzelknoten wird in die Queue eingefügt 2. Solange die Queue nicht leer ist a) Lese das oberste Element und entferne es aus der Queue b) Falls das oberste Element ein innerer Knoten ist, dann füge alle Kindknoten in die Queue ein. Die Priorität der Kindknoten ist gegeben als minimale Distanz zwischen Anfragepunkt und MBR des Kindknotens. c) Falls das oberste Element ein Blattknoten ist, dann füge alle Punkte in die Queue ein. Die Priorität der Datenpunkte ist durch die Distanz zwischen Anfragepunkt und Datenpunkt gegeben. d) Falls das oberste Element eine Punkt ist, dann ist dies der NN zum Anfragepunkt und die Suche kann abgebrochen werden. Multimedia Retrieval - SS01 Kap.3-104 • Beweis der Korrektheit – Die Prioritäten in der Queue entsprechen den minimalen Distanzen zwischen dem Anfragepunkt und der MBR des Knotens resp. den Distanzen zwischen Anfragepunkt und Datenpunkten. – Wegen der Konstruktion der MBRs muss gelten: die Prioritäten der Kindelemente eines Knotens ist stets grösser (gleich) wie diejenige des Knotens. – Falls also ein Datenpunkt zu oberst in der Queue liegt, so bedeutet dies, dass alle nicht besuchten Knoten weiter entfernt liegen. Damit sind aber auch alle Punkte unterhalb dieser Knoten weiter entfernt und können somit nicht der nächste Nachbar zum Anfragepunkt sein. • Beweis der Optimalität – Angenommen wir kennen den nächsten Nachbar bereits. Dann können wir einen Kreis mit Mittelpunkt=Anfragepunkt durch den nächsten Nachbar legen. Der Kreis heisst NNSphäre (NN-sphere) und enthält genau einen NN-dist Datenpunkt – den nächsten Nachbar (siehe Figur). – Ein optimaler Algorithmus muss nun all jene Knoten des Baumes betrachten, deren MBR sich mit dieser NN-Sphäre schneidet, um sicher zu sein, dass der NN-sphere gefundene Punkt der NN ist. Multimedia Retrieval - SS01 Kap.3-105 • Beweis der Optimalität (Forts.) – Alle Knoten, deren MBR sich nicht mit der NN-Sphäre schneidet müssen nicht betrachtet werden, da sie unmöglich den nächsten Nachbar enthalten können. – Der HS-Algorithmus betrachtet Knoten mit aufsteigender minimalen Distanz zum Anfragepunkt. Falls ein Datenpunkt zu oberst in der Queue liegt, dann wurden nur jene Knoten betrachtet, welche eine kleinere Distanz zum Anfragepunkt hatten als dieser Datenpunkt. Mit anderen Worten, es wurden nur Knoten betrachtet, deren MBR sich mit der NN-Sphäre schneidet. Die Knoten, deren MBR sich nicht mit der NN-Sphäre schneiden, liegen alle noch in der Queue (resp. deren Elternknoten liegen noch in der Queue). Somit betrachtet der HS-Algorithmus genau jene Knoten, welche auch ein optimaler Algorithmus lesen muss. • Bemerkungen – Der HS-Algorithmus muss in der Regel mehrere Blätter lesen bis der NN gefunden werden kann (auch wenn die MBRs der Blätter sich nicht überlappen) – Da der HS-Algorithmus genau jene Blätter liest, deren MBRs sich mit der NNSphäre schneiden, kann man die Kosten der NN-Suche relativ gut abschätzen. Es gibt eine Anzahl von Modellen, welche zuerst die erwartete NN-Distanz schätzen und dann die zu erwartende Anzahl Blattknoten bestimmen, die gelesen werden muss. Damit ist es möglich, die Kosten schon vor der Suche abzuschätzen; dies ist vor allem für Query-Optimizer wichtig. Multimedia Retrieval - SS01 Kap.3-106 3.4.9 Fluch der hohen Dimensionen • • Ein Grund für die Flut von Indexstrukturen für multi-dimensionale Daten ist die schlechte Performanz der Methoden in hoch-dimensionalen Räumen. Das Hauptproblem liegt darin, dass die Indexstrukturen für 2/3-dimensionale Probleme konstruiert und dann auf höher dimensionale Probleme übertragen wurden. Dabei wurde häufig nicht berücksichtig (oder zu wenig konsequent), dass ein hochdimensionaler Raum sich völlig anders verhält als ein 2/3-dimensionaler Raum. Im Folgenden wollen wir das Phänomen des „Fluch der hohen Dimensionen“ näher betrachten, also das Problem, dass die Indexstrukturen zwar sehr gut in 2/3dimensionalen Räumen funktionieren, aber in hoch-dimensionalen Räumen komplett versagen. Wir tun dies, indem wir uns zuerst einige Eigenheiten des hochdimensionalen Raumes vergegenwärtigen und schliesslich mit einem (einfachen) Kostenmodell belegen, dass NN-Suche in hoch-dimensionalen Räumen nicht effizient sein kann, wenn man hierarchische Strukturen verwendet. • Annahmen: Zur Vereinfachung der mathematischen Betrachtung nehmen wir im Folgenden an, dass der Raum durch Ω = [0,1]d gegeben ist und dass Datenpunkte und Anfragen uniform im Datenraum verteilt sind. • Beobachung: Unter diesen Annahmen ist die W‘keit, dass ein Punkt innerhalb einer Region liegt, gegeben durch das Volumen dieser Region. Kap.3-107 Multimedia Retrieval - SS01 1. Eigenheit: Schlechte Intuition für hoch-dimensionale Räume • • • Gegeben sei – Datenraum: Ω = [0,1]d – Zentrum von Ω : c = (0.5, …, 0.5) – Punkt p = (0.3, ... , 0.3) – Kreis um p mit Radius 0.7 Im 2-dimensionalen Raum (siehe Grafik) deckt der Kreis beinahe den ganzen Datenraum ab. Zudem ist es klar, dass das Zentrum c innerhalb des Kreises liegt. Ω = [0,1]d c 0.7 p Im hoch-dimensionalen Raum gilt dies nicht mehr! Der Abstand zwischen p und c ist gegeben als: δ = 0.2 sqrt(d). Nur falls δ ≤ 0.7 ist, wird c vom Kreis abgedeckt. Dies ist aber nur für d < (0.7/0.2)2 = 12.25 der Fall. D.h. in hoch-dimensionalen Räumen ist der Kreis zu klein, um c zu überdecken! Multimedia Retrieval - SS01 Kap.3-108 2. Eigenheit: Partitionierung in hoch-dim. Räumen nicht möglich • Gegeben sei – Datenraum: Ω = [0,1]d – Nach oben beschränkte Anz. Punkte, z.B. N = 109 • In 2-dimensionalen Räumen kann der Datenraum z.B. partitioniert werden, indem man jede Achse mehrfach teilt (z.B. k-d-Tree, Gridfile, ...). Die entstehenden Partitionen sind recht klein und die räumliche Aufteilung macht Sinn. • In hoch-dimensionalen Räumen ist dies aber nicht mehr der Fall! Nehmen wir an, dass jede Achse genau einmal geteilt wird (z.B. in der Mitte). Dann können wir folgende Grössen berechnen: – Anz. Partitionen: p = 2d – Anz. Punkte/Partition: m = N/2d d p m 10 50 100 103 1015 1030 106 10-6 10-24 D.h. im hoch-dimensionalen Räumen sind die meisten Partitionen leer. Eine Partitionierung macht also keinen Sinn mehr. Um das Problem zu entschärfen, sollten nur eine relativ kleine Anzahl Achsen geteilt werden (z.B. 10 Achsen). Kap.3-109 Multimedia Retrieval - SS01 3. Eigenheit: Wo liegen die Datenpunkte? • • • Gegeben sei – Datenraum: Ω = [0,1]d – Ein rechteckiger Bereich mit Seitenlänge s = 0.95 (siehe Grafik) In 2-dimensionalen Räumen liegen die Datenpunkte gleichmässig über den Datenraum verteilt. Bei N=109 Punkten ist der Datenraum dicht belegt. Der rechteckige Bereich enthält sehr viele Punkte. Ω = [0,1]d s s Im hoch-dimensionalen Räumen ist der Bereich fast leer! Das Volumen des Bereichs ist gegeben durch sd. Bei d = 100 ist dies gerade mal 0.0059. D.h. 0.59% der Punkte liegen in diesem Bereich. Des weiteren kann man keine Punkte im Zentrum des Datenraums finden. All Punkte liegen in der Nähe einer der Seitenflächen des Raumes. „In der Nähe“ heisst dabei, dass der Abstand zur Aussenfläche kleiner als ε = 0.05 ist. Die W‘keit, dass ein Punkt in der Nähe einer Aussenfläche liegt, ist gegeben durch 1 - ( 1-2ε ) d. – für d = 2 ist diese W‘keit 0.19, d.h. 19% der Punkte liegen nahe am Rand – für d = 100 ist diese W‘keit 1, d.h. alle Punkte liegen jetzt nahe am Rand Multimedia Retrieval - SS01 Kap.3-110 4. Eigenheit: Der NN ist in hoch-dimensionalen Räumen weit entfernt • Gegeben sei – Datenraum: Ω = [0,1]d – Nach oben beschränkte Anz. Punkte, z.B. N = 109 – Zentrum von Ω : c = (0.5, …, 0.5) – Kreis um c mit Radius 0.5 Ω= [0,1]d 0.5 c • In einem 2-dimensionalen Raum erwarten wir, dass der NN eines Punktes in unmittelbarer Nähe liegt (d.h. die Distanz ist klein). So würde der Kreis um c sicher den NN zu c enthalten. • In einem hoch-dimensionalen Raum ist dies aber nicht der Fall! Das Volumen der ddim. Sphäre geht gegen 0 mit zunehmendem d. Für d = 10 ist das Volumen 0.002, d.h. 0.2% der Punkte liegen innerhalb der Sphäre. Für d = 100 ist das Volumen 1.9*10-70, d.h. neben c liegt mit grösster W‘keit kein weiterer Punkt in der Sphäre. Mit anderen Worten, der Kreis um c müsste grösser sein, um den NN zu enthalten resp. die Distanz von c zu seinem NN ist sehr viel grösser als 0.5! Multimedia Retrieval - SS01 Kap.3-111 Kostenmodell für NN-Suche • Auf den folgenden Seiten wollen wir die Kosten für die NN-Suche in hierarchischen Strukturen schätzen. Zu diesem Zweck müssen wir uns erst überlegen, wie gross die erwartete Distanz zwischen NN und Anfragepunkt ist. Danach müssen wir die Anzahl der Blätter bestimmen, welche während der Suche gelesen wird. Da wir den HSAlgorithmus anwenden, können wir die Anzahl gelesener Blätter relativ leicht abschätzen: gelesen werden müssen genau jene Blätter, welche die NN-Sphäre um den Anfragepunkt schneiden. • Erwartete NN-Distanz – Die erwartete NN-Distanz ist gegeben als die durchschnittliche Distanz zwischen einem Anfragepunkt und seinem nächsten Nachbar. – Grundidee der Herleitung: • Für einen gegeben Anfragepunkt und einen Radius r bestimmt man die W‘keit, dass der NN innerhalb des Kreises um den Punkt mit Radius r liegt. • Für die Zufallsvariable r definieren diese W‘keiten eine Verteilungsfunktion; der Erwartungswert der Zufallsvariable r ist gerade die erwartete NN-Distanz für den gegebenen Anfragepunkt • Die erwartete NN-Distanz für eine beliebigen Punkt im Datenraum ist letzlich der Mittelwert der erwarteten NN-Distanz für alle Punkte im Datenraum. Multimedia Retrieval - SS01 Kap.3-112 – Natürlich hängt die erwartete NN-Distanz von der Metrik und der Dimensionalität des Raumes ab. Die folgenden Kurven zeigen den Verlauf der NN-Distanz in Abhägnigkeit der Dimensionalität für die Normen L1 , L2 und L∞. Multimedia Retrieval - SS01 • Kap.3-113 Kostenmodell – In einem einfachen Kostenmodell werden die Kosten der NN-Suche wie folgt abgeschätzt: • CPU-Kosten sind vernachlässigbar im Vergleich zu den IO-Kosten • IO-Kosten fallen nur beim Besuch eines Blattknotens an, d.h. die inneren Knoten werden im Hauptspeicher gehalten. Das Lesen eines Blattes bewirkt einen „zufälligen“ Zugriff (random access) auf die Harddisk. Dieser kostet mit heutiger Disktechnologie zwischen 5-8ms. – Um die Performanz eines Baumes zu vergleichen, betrachten wir auch die Kosten für das sequentielle Durchgehen aller Punkte (sequentieller Scan). Auch hierbei fallen die CPU-Kosten nicht ins Gewicht; die IO-Kosten sind gegeben durch das Lesen aller Vektoren. Heutige Disks haben Datentransferraten zwischen 10 und 30 MB/s (RAIDs können sogar noch mehr MB/s übertragen). Die Anzahl zu lesender Blöcke ist kleiner als die Anzahl Blätter in einem Baum. Im Durschnitt ist nämlich ein Blatt nur zu etwa 60%-80% voll (nach einem split sind es 50%). Sei f (in %) der durchschnittliche Füllgrad und b die Grösse eines Blattes in Bytes. Dann sind die Kosten für NN-Suche mit dem seq. Scan: Tscan ≈ f ⋅ n ⋅ b / (16 MB/s) – Mit dem HS-Algorihtmus werden bei einer NN-Suche in einem Baum genau jene Blätter besucht, welche sich mit der NN-Sphäre schneiden. Sei n die totale Anzahl Blätter und v der Prozentsatz der gelesenen Blätter. Dann sind die Kosten für die NN-Suche im Baum: Tbaum ≈ v ⋅ n ⋅ (7ms + b / (16 MB/s)) Multimedia Retrieval - SS01 Kap.3-114 – Damit nun der Baum schneller ist als der seq. scan muss gelten: Tbaum < Tscan Also v < f ⋅ b / (16 MB/s) / (7ms + b / (16 MB/s)) – Die untenstehende Grafik zeigt die oberen Schranken für v (Prozentsatz gelesener Blätter) als Funktion der Blattgrösse und der Füllrate. D.h. bei vernünftiger Blockgrösse und realistischem Füllgrad sollte v kleiner als 20% sein. In diesem Fall ist der Baum aber nur unwesentlich schneller als der Scan. Damit sich der Baum wirklich lohnt für die NN-Suche, sollte v wesentlich kleiner sein, z.B. v <5%. Kap.3-115 Multimedia Retrieval - SS01 – Einfache Betrachtung: • Der Baum benutze rechteckige MBRs. Es können aber nur d‘ von d Achsen geteilt werden. Weiter nehmen wir an, dass die Aufteilung in der Mitte vorgenommen wurde. Damit sehen die MBRs der Blattknoten wie in der Grafik unten rechts aus (Achse nach vorne wurde nicht geteilt, die anderen in der Mitte). • Sei lmax der maximale Abstand eines Punktes zu einem Blatt. Aufgrund der MBR-Form der Blätter ist diese Distanz gegeben als: lmax=½ sqrt(d’2) • Wenn wir nun diese Distanz mit der erwarteten NN-Distanz vergleichen, so stellen wir überraschend fest (siehe Tabelle): lmax ist bei d=100 kleiner als NNDist. Mit anderen Worten: jeder Punkt liegt näher zu diesem Blatt als zu seinem NN. Also schneidet die MBR des Blattes auch die NNΩ = [0,1] d Sphäre jedes Anfragepunktes. Das Blatt muss für jede Anfrage gelesen werden. Oder: für jede Anfrage muss jedes Blatt besucht werden d N 40 106 100 106 Multimedia Retrieval - SS01 d‘ lmax NN-dist 14 15 1.87 1.94 1.8 3 lmax Blattseite Kap.3-116 – Allgemeine Betrachtung: • Wir wollen nun die genaue Anzahl besuchter Blätter berechnen; zudem betrachten wir nun auch allgemeine MBRs. • Wir müssen die Anzahl Blätter bestimmen, deren MBRs sich mit der NNSphäre eines Anfragepunktes schneiden. Dazu gehen wir wie folgt vor – Schätzen der erwarteten NN-Distanz (siehe vorherige Grafiken) – Die NN-Suche kann als Bereichsanfrage („range query“) umformuliert werden: gesucht sind nun all jene MBRs, welche sich mit der NN-Spähre schneiden. – Aus der Geometrie (z.B. Legen einer Tangente an zwei Kreise) kennt man das Verfahren der Minkowski Transformation. Dabei wird die NN-Sphäre auf einen Punkt geschrumpft und alle MBRs um den Radius der NNSphäre „aufgeblasen“ (d.h. eine Sphäre mit Radius NN-Dist wird entlang der gesamten Oberfläche der MBRs bewegt. Der Raum, der durch diese Bewegung abgedeckt wird, entspricht gerade der aufgeblasenen MBR). Aus der Bereichsanfrage wurde nun eine Punktanfrage: all jene Blätter müssen besucht werden, deren aufgeblasene MBR den Anfragepunkt enthalten. – Die W‘keit, dass ein Blatt besucht werden muss ist gegeben durch das Volumen seiner aufgeblasenen MBR, d.h. dem Prozentsatz der Punkte, welche innerhalb der aufgeblasenen MBR liegen. Kap.3-117 Multimedia Retrieval - SS01 Transformation im Überblick aufgeblasene MBR NN Anfragepunkt point query NN query NN-dist NN-Sphäre range query Multimedia Retrieval - SS01 Kap.3-118 • Die Berechnung der Volumen der aufgeblasenen MBRs sei an dieser Stelle ausgelassen (Interessierte finden dies unter [Weber:1998]). • Die folgenden Grafiken zeigen v, den Prozentsatz gelesener Blätter, als Funktion der Dimensionalität und für verschiedene MBRs (rechteckig, sphärisch; alle anderen Formen können ebenfalls in [Weber:1998] nachgelesen werden). Bei den rechteckigen MBRs repräsentieren „d‘=10“ und „d‘=18“ MBRs, welche entlang d‘ Achsen in der Mitte geteilt wurden. „conservative“ steht für rechteckige MBRs, welche bzgl. ihrer Grösse optimiert wurden (was aber in der Praxis kaum möglich ist). Multimedia Retrieval - SS01 • Kap.3-119 Bemerkungen: – Die 20%-Marke, oberhalb derer ein seq. Scan mit Sicherheit besser ist als ein Baum, wird bereits bei Dimensionalitäten <50 erreicht. Mit anderen Worten, die Verwenung von Bäumen für die NN-Suche in Bilddatenbanken (d>100) ist zwecklos (resp. verlangsamt die Suche im Vergleich zum seq. Scan) – Für jede hierarchische Struktur (egal welche MBRs, egal wie aufgebaut) gibt es eine Dimensionalität, oberhalb derer die NN-Suche mit einem seq. Scan schneller ist. – Messungen mit realen Datensätzen (Merkmale aus Bilddatenbanken) haben gezeigt, dass der seq. Scan schon bereits ab d=10 schneller sein kann als alle bisher besprochenen Verfahren. – Die NN-Suche in hoch-dimensionalen Räumen hat lineare Komlexität, solange die Anzahl Punkte nicht exponentiell mit der Anzahl Dimensionen wächst (dies ist aber in Datenbanken nicht gegeben). Dies kann man auch mit weiteren mathematischen Modellen zeigen. – Die Entwicklung der Harddisks zeigt, dass der Datendurchsatz sich stärker verbessert als die mittlere Zugriffszeit. D.h. die Bäume verlieren mit jeder neuen Diskgeneration weiter an Boden im Vergleich zum seq. Scan. – Also: Für die Ähnlichkeitssuche in Bilddatenbank sollte man am besten eine sequentielle Organisation wählen. Dies ist erstens sehr viel einfacher als ein Baum und zweitens auch wesentlich schneller. Multimedia Retrieval - SS01 Kap.3-120 3.4.10 Das Vector Approximation File (VA-File) • • • Das Vector Approximation File (VA-File) wurde 1997 an der ETH entwickelt. Das Ziel dieser NN-Suchmethode war es, den notwendigen Scan durch die Punktemenge zu beschleunigen. Zu diesem Zweck wurden die Vektoren quantisiert, um die zu lesende Datenmenge zu reduzieren (bis zu Faktor 8). Trotz des Datenverlustes kann das VAFile den exakten NN zum Anfragepunkt finden. Die Suchzeiten sind in der Regel 4-8 mal kleiner als jene des seq. Scan (wiederum ist IO das Hauptproblem; die CPU Kosten sind im Vergleich vernachlässigbar). In diesem Kapitel wollen wir den Aufbau und die Arbeitsweise des VA-Files genauer studieren. Aufbau: – Das VA-File besteht aus zwei Dateien. Die eine Datei enthält alle Vektoren (resp. Datenpunkte), die andere enthält die Approximationen der Vektoren. Wichtig ist, dass die Ordnung der beiden Dateien identisch ist, d.h. der Eintrag an der i-ten Position im Approximationsfile gehört zum i-ten Vektor im Vektorfile. – Ein Eintrag im Vektorfile setzt sich zusammen aus einer OID (4 bytes) und den d Komponenten des Vektors (jeweils 4 Bytes). Die OID wird von der darüberliegende Applikation benötigt, um die Vektoren in Relation zu den Objekten (z.B. Bilder) zu bringen. – Ein Eintrag im Approximationsfile ist ein Bitstring mit einer bestimmten Länge (durch 2 Bytes teilbar). Der genaue Aufbau wird in Kürze beschrieben. Multimedia Retrieval - SS01 Kap.3-121 – Headers: Jede Datei speichert in ihrem Header wichtige Informationen zu den Dateien. Z.B. die Anzahl Dimensionen, die Länge der Approximationen, die Anzahl Einträge, etc. (siehe nachfolgende Grafik). Ein Besonderheit ist der Support für die inkrementelle Berechnung der Mittelwerte und Standardabweichungen der einzelnen Komponenten (xsum[i],x2sum[i]im Header der Vektordatei). Somit lassen sich die Gewichte für die einzelnen Dimensionen leicht berechnen. • Operationen: – Einfügen: In der Regel wird ein neuer Punkt am Ende eingefügt. Falls aber zuvor Datenpunkte gelöscht wurden, so können die so entstanden Löcher gefüllt werden (allerdings sollte diese Aufgabe von einer globalen Instanz ausgeführt werden, damit VA-Files des gleichen Datensatzes auf verschiedenen Rechner die gleiche Ordnung haben; dies ist vor allem für die Parallelisierung wichtig). Jedes Einfügen hat eine Änderung des Vektors- und Approximationsfile zur Folge. Das Berechnen der Approximation werden wir gleich näher betrachten. – Update: Die Einträge in beiden Dateien werden entsprechend angepasst. – Delete: Die Einträge an der entsprechenden Postion in den Dateien werden gelöscht, d.h. auf einen speziellen NULL-Wert gesetzt. Die so entstehenden Löcher können mit späteren Einfügeoperationen wieder gefüllt werden. Multimedia Retrieval - SS01 Kap.3-122 Übersicht magic number (27182817) num changes (nChanges) num bits per dimension (b[i]) magic number (31415926) Header pos 0 1873 .21 .63 .13 .07 .94 .82 max position (maxPos) num dimensions (d) num vectors (N) statistical info. on the vectors (xsum[i], x2sum[i]) Header pos 0 01010110001 partitioning points along each dimension (m[i] [j]) num vectors in slices along each dimension (n[i] [j]) pos 21 5136 pos 21 .62 .41 .55 .23 .94 .34 vector file 00110101101 approximation file VA-File Kap.3-123 Multimedia Retrieval - SS01 Multimedia Retrieval - SS01 11 m[0,4] 10 m[0,3] 01 m[0,2] 00 m[0,1] Berechung der Approximationen – Die Vektoren werden mit einem Quantisierungsschema komprimiert. Ein (nicht notwendigerweise gleichförmiges) Gitter teilt den Datenraum in rechteckige Partitionen auf. Entlang jeder Achse werden 2bi Scheiben gebildet, wobei bi einer Anzahl Bits entspricht (für jede Dimension kann eine andere Anzahl gewählt werden). Die einzelnen Scheiben können nun mit bi Bits durchnummeriert werden (siehe Grafik). Ebenso können für die einzelnen Partitionen Bitstrings gebildet werden: sie setzen sich aus den Bitstrings der d Scheiben der Partition zusammen. In der nebenvectors stehenden Grafik sind die 1 0.6 0.8 2 0.0 1.0 Scheiben durch Markierungsy 3 1.0 0.0 data space punkte begrenzt. Z.B. ist 4 0.3 0.4 die erste Scheibe in xm[1,4] 5 0.5 0.1 p2 Richtung begrenzt durch 11 6 0.3 0.6 p1 m[0,0] und m[0,1]. Der m[1,3] p6 Datenraum wird durch die 10 approximations m[1,2] Punkte aufgespannt, d.h. p4 10 11 01 durch deren minimale und 00 11 m[1,1] maximale Werte entlang 11 00 00 p5 der d Achsen (z.B. m[1,0] p3 m[1,0] 01 01 und m[1,4] für die y-Achse) 10 00 m[0,0] • x 01 10 Kap.3-124 – Bestimmung der Markierungen: Entlang jeder Achse werden die Markierungspunkte so gewählt, dass jede Scheibe die gleiche Anzahl Punkte enthält. Zu diesem Zweck berechnet man zuerst die Verteilungsfunktion entlang der Achsen (z.B. durch Sampling einiger Punkte) und bestimmt die Markierungspunkte so, dass das Integral über die Verteilungsfunktion für alle Scheiben gleich gross ist (das Integral entspricht dabei der Anzahl Punkte in den Scheiben). Die untenstehende Figur zeigt eine typische Verteilungsfunktion der Komponentenwerte. Links wurden die Scheiben gleichförmig gewählt, rechts so, dass die Anz. Punkte pro Scheibe (ungefähr) gleich ist. Das linke Schema ist ungeeignet, da praktsich alle Punkte in der dritten Scheibe liegen. Multimedia Retrieval - SS01 m[j,4] m[j,2] m[j,3] m[j,1] value m[j,0] m[j,4] m[j,3] m[j,2] m[j,1] freq m[j,0] freq value Kap.3-125 – Bestimmung der Anzahl Bits: Grundsätzlich sollte die Anzahl Bits so gewählt werden, dass die Approximationen möglichst klein sind, aber dennoch eine effiziente Suche ermöglichen. Es gibt einige Modelle, wie man die Bits verteilen sollte und wieviele Bits total verwendet werden sollen. In der Regel genügen aber 4 oder 8 Bits pro Dimension, um eine gute Suchperformanz zu erreichen. – Berechnung der Approximation: Wie erwähnt, setzt sich die Approximation eines Datenpunktes p aus den Bitstrings der den Punkt p enthaltenden Scheiben entlang aller Achsen zusammen. Dabei sei a(p,j) der Bitstring (resp. die Nummer) der Scheibe in der j-ten Dimension, welche den Punkt enthält. Offensichtlich muss gelten m[j, a(p,j)] ≤ pj ≤ m[j, a(p,j)+1] Die Approximation des Punktes p ist die Konkatenation aller Bitstrings a(p,j). • Was nützen nun die Approximationen? – Die Approximation eines Datenpunktes, d.h. der ihn umgebende rechteckige Bereich, hat ein recht kleines Volumen. Falls der Datenraum [0,1]d, bi=b für alle Dimensionen und alle Markierungen gleichförmig verteilt sind, dann ist das Volumen einer Partition 2 -bd. Bei grossem b und d also beinahe 0. D.h. die Approximation bedeckt nur unwesentlich mehr Volumen als der Punkt selber (im Vergleich zu den Partitionen in einem R-Baum oder einem Grid-File). Multimedia Retrieval - SS01 Kap.3-126 – Betrachte die Figur: Sei q ein Anfragepunkt und der Kreis repräsentiere eine Bereichsanfrage für Euklidsche Distanz. Die Approximationen der Punkte, repräsentiert durch die umgebenden Partitioneb, erlauben die Aussage, dass • p1, p2 und p3 bestimmt nicht relevant für die Bereichsanfrage sind • p4 sicher relevant für die Bereichsanfrage ist • p5 und p6 möglicherweise relevant für die Bereichsanfrage sind Zur Beantwortung der Anfrage müssen also alle Approximationen der Datenpunkte gelesen werden und die Vektoren von p5 und p6, um das richtige Resultat {p4, p6} zu bilden. Im hoch-dim. Raum haben wir bereits gesehen, dass jede y hierarchische Struktur wie der seq. Scan alle data space Vektoren lesen muss, um eine nicht-leere p2 Bereichsanfrage zu beantworten (NN-Suche 11 ist eine nicht-leere Bereichsanfrage!). Mit dem p1 p VA-File brauchen wir aber nur noch die 6 10 Approximationen (4-8 mal weniger Daten) und p4 einige Datenpunkte zu lesen. Natürlich 01 „funktioniert“ dies nur, wenn nicht allzu viele q Vektoren gelesen werden müssen, d.h. höchstens p3 00 p5 20-50 Vektoren. Andernfalls sind die Kosten für 00 01 10 11 das Lesen der Vektoren zu hoch (random access) x Kap.3-127 Multimedia Retrieval - SS01 – Berechnung von Schranken: Die Approximation eines Datenpunktes p erlaubt es, eine obere (=uBnd(p,q)) und untere (=lBnd(p,q)) Schranke für die Distanz zwischen dem Datenpunkt p und einem Anfragepuntk q zu berechnen (siehe Grafik). Die untere (resp. obere) Schranke ist gegeben als minimale (maximale) Distanz zwischen Anfragepunkt und Partition, welche zur Approximation des Punktes gehört. Die Berechnung der Schranken ist z.B. für die Euklidsche Distanz wie folgt (für andere Normen analog): • Sei lj(p) = m[j,a(p,j)] die untere Schranke der Partition von p für die j-te Dim. • Sei uj(p) = m[j,a(p,j)+1] die obere Schranke der Partition von p für die j-te Dim. Dann gilt lBnd(p,q) ≤ δ(p,q) ≤ uBnd(p,q) mit y lBnd ( p,q ) = uBnd ( p,q ) = Multimedia Retrieval - SS01 (l j ( p ) − q j )2 d −1 2 (q j − u j ( p )) ∑ j =0 0 2 (u j ( p ) − q j ) ∑ j =0 (q j − l j ( p ))2 d −1 data space q j < l j (p) q j > u j (p) l j (p) ≤ q j ≤ u j (p) qj ≤ qj > 11 p 10 uBnd(p ,q ) l j (p)+ u j (p) 01 2 l j (p)+ u j (p) 00 2 lBnd(p ,q ) q 00 01 10 11 x Kap.3-128 – Filter Bedingungen: Die folgenden Bedingungen helfen, aufgrund der Approximationen Punkte von der Suche auszuschliessen. • Falls r ein Suchradius ist (Bereichsanfrage) für einen Anfragepunkt q, dann ist uBnd(p,q) ≤ r ⇒ „p in Antwort“ „p in Antwort“ ⇒ lBnd(p,q) ≤ r lBnd(p,q) > r ⇒ „p nicht in Antwort“ Dasselbe gilt auch für eine NN-Suche. In diesem Fall ist r durch die NNDistanz von q gegeben. • Falls der NN gesucht wird, kann man zusätzlich noch folgende Bedingung aufstellen. Seien p und p‘ Datenpunkte und q der Anfragepunkt, dann: uBnd(p‘,q) < lBnd(p,q) ⇒ „p nicht in Antwort“ – Suchalgorithmen: • Die folgenden Algorithmen beschreiben wie man eine Bereichsanfrage resp. eine NN-Suche mit dem VA-File evaluiert. Dabei beschreiben wir zwei Lösungen für die NN-Suche: die erste Methode ist optimiert bzgl. CPU-Kosten (NNSearchSSA), die zweite bzgl. IO-Kosten (NNSearchNOA) • Die Algorithmen benutzen stets zwei Phasen: in der ersten Phase werden die Approximationen gelesen und Punkte aufgrund obiger Bedingungen ausgeschlossen. In der zweiten Phase werden die exakten Vektoren gelesen und das Resultat berechnet. Multimedia Retrieval - SS01 Kap.3-129 – Benötigte Funktionen/Variablen: • ReadApxEntry(i,apx): Lesen der i-ten Approximation und speichern in apx ReadVecEntry(i,vec): Lesen des i-ten Vektors und speichern in vec • Q: Struktur, welche die Anfrage beschreibt; Q.query.q: Anfragepunkt; Q.query.r: Suchradius, Q.query.k: Anzahl NN. • GetLowerBound(apx,Q): Berechnet untere Schranke zur Anfrage für aktuelles apx GetUpperBound(apx,Q): Berechnet obere Schranke zur Anfrage für aktuelles apx GetDist(vec,Q): Berechnet die Distanz zwischen vec und Anfrage – Range Search: FUNCTION RangeSearch(Q: RangeSearch): Answer; VAR i: INTEGER; ans: Answer; dist: REAL; apx: BitString; vec: Vector; BEGIN FOR i:=0 TO maxPos DO IF ReadApxEntry(i,apx) THEN /* first phase: filtering step */ IF GetLowerBound(apx,Q)<Q.query.r THEN /* second phase: refinement step */ ReadVecEntry(i,vec); dist:=GetDist(vec,Q); IF dist<Q.query.r THEN ans.Add(vec,dist) END; END; END; RETURN ans; END RangeSearch; Multimedia Retrieval - SS01 Kap.3-130 – NN-Suche (CPU optimiert) • NNSearchSSA (SSA: simple search algorithm) ist ein einfacher Algorithmus, um die nächsten k Nachbarn für einen Punkt zu finden. • Es werden alle Approximationen gelesen. Zu jedem Zeitpunkt enthalten die Arrays v[] und dst[], die k besten bisher gesehenen Punkte und deren Distanzen zum Anfragepunkt (Kandidatenliste). • Falls die aktuelle Approximation eine untere Schranke hat, welche kleiner ist als die grösste in dst[] gespeicherte Distanz (=max), dann könnte der aktuelle Punkt näher liegen als der entsprechende Punkt in v[]. In diesem Fall muss der Vektor gelesen (ReadVecEntry) und die exakte Distanz (GetDist) berechnet werden. Die Funktion Candidate überprüft dann, ob der aktuelle Punkt neu zu den besten k Punkten gehört und fügt in gegebenenfalls in die Kandidatenliste ein. • NNSearchSSA benutzt nur die Filterbedingung lBnd(p,q) > r ⇒ „p nicht in Antwort“ wobei r der maximalen Distanz der bisher k besten Punkte entspricht. Die Suche ist korrekt (der tastächliche NN wird gefunden), da r stets grösser gleich der endgültigen NN-Distanz ist. Damit werden also nur Punkte ausgeschlossen, deren untere Schranke grösser als die NN-Distanz ist. Für alle anderen Punkte wird die exakte Distanz bestimmt und mit Hilfe der Kandidatenliste werden die besten k Punkte ermittelt. Kap.3-131 Multimedia Retrieval - SS01 FUNCTION NNSearchSSA(Q: NNSearch): Answer; VAR i: INTEGER; v: ARRAY OF Vector; apx: BitString; ans: Answer; max: REAL; dist: REAL; dst: vec: ARRAY OF REAL; Vector; /* initializes candidate set; returns MAXREAL as k-th smallest distance */ FUNCTION InitCandidate(): REAL; BEGIN FOR i:=1 TO Q.query.k DO dst[i]:=MAXREAL; v[i].OID:=-1 END; RETURN MAXREAL; END InitCadidate; /* adds a point to the candidate set; returns k-th smallest distance */ FUNCTION Candidate(p: Vector; dist: REAL): REAL; BEGIN IF dist<dst[Q.query.k-1] THEN dst[Q.query.k-1]:=dist; v[Q.query.k-1]:=p; SortOnDst(v,dst,Q.query.k); END; RETURN dst[Q.query.k-1]; END Candidate; BEGIN max:=InitCandidate(); FOR i:=0 TO maxPos DO IF ReadApxEntry(i,apx) THEN /* first phase: filtering step */ IF GetLowerBound(apx,Q)<max THEN /* second phase: refinement step */ ReadVecEntry(i,vec); dist:=GetDist(vec,Q); max:=Candidate(vec,dist); END; END; /* build answer set, compute scores */ FOR i:=0 TO Q.query.k-1 DO ans.Add(v[i],dst[i]); RETURN ans; END NNSearchSSA; Multimedia Retrieval - SS01 Kap.3-132