Поиск ближайших соседей с помощью иерархического маленького мира — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Граф-представители)
(Маленький мир)
Строка 1: Строка 1:
 
'''Иерархия графов-представителей''' (англ. ''Hierarchical Navigable Small World graphs'') {{---}} структура данных, позволяющая эффективно находить K почти что ближайших соседей. По своей концепции напоминает [[список с пропусками]].
 
'''Иерархия графов-представителей''' (англ. ''Hierarchical Navigable Small World graphs'') {{---}} структура данных, позволяющая эффективно находить K почти что ближайших соседей. По своей концепции напоминает [[список с пропусками]].
  
==Граф-представители==
+
==Маленький мир==
'''Граф-представитель''' (англ. ''Navigable Small World'') {{---}} граф на множестве точек в Евклидовом пространстве, удовлетворяющий правилу <tex>O(\log{n})</tex> рукопожатий. Т.е. средняя длина кратчайшего пути между вершинами в графе равна <tex>O(\log{n})</tex>.
+
'''Маленький мир''' (англ. ''Small World'') {{---}} граф, в котором мат. ожидание кратчайшего пути между двумя случайно выбранными вершинами растёт пропорционально <tex>\log{N}</tex>.
  
На таком графе приближенный поиск K ближайших соседей будет выглядеть так:
+
Для маленького мира на точках в Евклидовом пространстве, приближенный поиск K ближайших соседей будет выглядеть так:
 
  KNN(request, m, k)''':'''
 
  KNN(request, m, k)''':'''
 
     nearest = new TreeSet()  <font color="green">// вершины упорядочены по возрастанию расстояния до request </font>
 
     nearest = new TreeSet()  <font color="green">// вершины упорядочены по возрастанию расстояния до request </font>

Версия 22:44, 28 февраля 2019

Иерархия графов-представителей (англ. Hierarchical Navigable Small World graphs) — структура данных, позволяющая эффективно находить K почти что ближайших соседей. По своей концепции напоминает список с пропусками.

Маленький мир

Маленький мир (англ. Small World) — граф, в котором мат. ожидание кратчайшего пути между двумя случайно выбранными вершинами растёт пропорционально [math]\log{N}[/math].

Для маленького мира на точках в Евклидовом пространстве, приближенный поиск 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

Описание структуры

Операции над структурой

Поиск элемента

Вставка элемента