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