Поиск ближайших соседей с помощью иерархического маленького мира — различия между версиями
Marsermd (обсуждение | вклад) м (→Граф-представители) |
Marsermd (обсуждение | вклад) (→Граф-представители) |
||
| Строка 2: | Строка 2: | ||
==Граф-представители== | ==Граф-представители== | ||
| − | '''Граф-представитель''' (англ. ''Navigable Small World'') {{---}} граф на множестве точек в пространстве, удовлетворяющий правилу <tex>O(\log{n})</tex> рукопожатий. Т.е. средняя длина пути в графе <tex>O(\log{n})</tex>. | + | '''Граф-представитель''' (англ. ''Navigable Small World'') {{---}} граф на множестве точек в Евклидовом пространстве, удовлетворяющий правилу <tex>O(\log{n})</tex> рукопожатий. Т.е. средняя длина кратчайшего пути между вершинами в графе равна <tex>O(\log{n})</tex>. |
| − | На таком графе поиск K ближайших соседей будет выглядеть так: | + | На таком графе приближенный поиск K ближайших соседей будет выглядеть так: |
| − | KNN(request)''':''' | + | KNN(request, m, k)''':''' |
| − | + | nearest = new TreeSet() <font color="green">// вершины упорядочены по возрастанию расстояния до request </font> | |
| − | + | candidates = new TreeSet() | |
| − | + | visited = new HashSet() | |
| − | + | '''for''' i = 1 '''to''' m | |
| − | + | candidates.add(случайная вершина графа) | |
| − | + | tempNearest = new TreeMap() | |
| − | + | '''while''' ''true'' | |
| − | + | current = candidates.popMin() | |
| − | '''return''' | + | '''if''' current дальше чем k-й элемент nearest |
| + | '''break''' | ||
| + | '''for''' v : смежные с current вершины | ||
| + | '''if''' !visited.contains(v) | ||
| + | candidates.add(v) | ||
| + | visited.add(v) | ||
| + | tempNearest.add(v) | ||
| + | result.addAll(tempNearest) | ||
| + | '''return''' k первых вершин из nearest | ||
==Описание структуры== | ==Описание структуры== | ||
Версия 01:49, 28 февраля 2019
Иерархия графов-представителей (англ. Hierarchical Navigable Small World graphs) — структура данных, позволяющая эффективно находить K почти что ближайших соседей. По своей концепции напоминает список с пропусками.
Содержание
Граф-представители
Граф-представитель (англ. Navigable Small World) — граф на множестве точек в Евклидовом пространстве, удовлетворяющий правилу рукопожатий. Т.е. средняя длина кратчайшего пути между вершинами в графе равна .
На таком графе приближенный поиск K ближайших соседей будет выглядеть так:
KNN(request, m, k):
nearest = new TreeSet() // вершины упорядочены по возрастанию расстояния до request
candidates = new TreeSet()
visited = new HashSet()
for i = 1 to m
candidates.add(случайная вершина графа)
tempNearest = new TreeMap()
while true
current = candidates.popMin()
if current дальше чем k-й элемент nearest
break
for v : смежные с current вершины
if !visited.contains(v)
candidates.add(v)
visited.add(v)
tempNearest.add(v)
result.addAll(tempNearest)
return k первых вершин из nearest