Поиск ближайших соседей с помощью иерархического маленького мира — различия между версиями
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 минимальным расстоянием