Поиск ближайших соседей с помощью иерархического маленького мира — различия между версиями
Marsermd (обсуждение | вклад) м |
Marsermd (обсуждение | вклад) |
||
| Строка 1: | Строка 1: | ||
| − | '''Иерархия графов-представителей''' (англ. ''Hierarchical Navigable Small World graphs'') {{---}} структура данных, позволяющая | + | '''Иерархия графов-представителей''' (англ. ''Hierarchical Navigable Small World graphs'') {{---}} структура данных, позволяющая эффективно находить K почти что ближайших соседей. По своей концепции напоминает [[список с пропусками]]. |
| + | |||
| + | ==Граф-представители== | ||
| + | '''Граф-представитель''' (англ. ''Navigable Small World'') {{---}} граф на множестве точек в пространстве, удовлетворяющий правилу <tex>O(\log{n})</tex> рукопожатий. Т.е. средняя длина пути в графе <tex>O(\log{n})</tex>. | ||
| + | |||
| + | На таком графе поиск K ближайших соседей будет выглядеть так: | ||
| + | '''bool''' KNN(request)''':''' | ||
| + | Heap = <tex> \varnothing </tex> | ||
| + | current = случайная вершина графа | ||
| + | '''while''' ''true'' | ||
| + | '''for''' v : смежные с current вершины | ||
| + | distance = getDistance(v, request) <font color="green">// getMetric(a, b) {{---}} расстояние между вершинами a и b в метрическом пространстве </font> | ||
| + | Heap.push(key=distance, v=v) | ||
| + | '''if''' Heap.first().key > getDistance(v, current) | ||
| + | break | ||
| + | '''return''' K вершин из Heap c минимальным расстоянием | ||
| + | |||
| + | |||
| + | ==Описание структуры== | ||
| + | |||
| + | |||
==Операции над структурой== | ==Операции над структурой== | ||
===Поиск элемента=== | ===Поиск элемента=== | ||
===Вставка элемента=== | ===Вставка элемента=== | ||
Версия 00:31, 28 февраля 2019
Иерархия графов-представителей (англ. Hierarchical Navigable Small World graphs) — структура данных, позволяющая эффективно находить K почти что ближайших соседей. По своей концепции напоминает список с пропусками.
Содержание
Граф-представители
Граф-представитель (англ. Navigable Small World) — граф на множестве точек в пространстве, удовлетворяющий правилу рукопожатий. Т.е. средняя длина пути в графе .
На таком графе поиск K ближайших соседей будет выглядеть так: bool KNN(request):
Heap =
current = случайная вершина графа
while true
for v : смежные с current вершины
distance = getDistance(v, request) // getMetric(a, b) — расстояние между вершинами a и b в метрическом пространстве
Heap.push(key=distance, v=v)
if Heap.first().key > getDistance(v, current)
break
return K вершин из Heap c минимальным расстоянием