Изменения

Перейти к: навигация, поиск
Поиск ближайших соседей в слое
Жадно идём по уровню в сторону запроса.
'''searchLayer'''(q, ep, ef, layer)''':'''
<font color="green">// Входные данные: Входные данные: иерархия графов hnsw, запрос q, входные точки ep, искомое количество ближайших соседей ef, номер слоя layer</font>
<font color="green">// Возвращает: ef ближайших соседей q в слое layer</font>
candidates W = new TreeSet(ep) <tex>\emptyset</tex> <font color="green">// Вершины упорядочены по возрастанию расстояния до ближайшие к q. вершины </font> result C = new TreeSet(ep)<tex>\emptyset</tex> <font color="green">// вершины, которые предстоит посетить </font> visited V = <tex>\emptyset</tex> <font color= new HashSet(ep)"green">// посещённые вершины </font> '''while''' candidates.isNotEmpty()C != <tex>\emptyset</tex> current u = candidates.getMin(){q1 | <tex>\forall</tex> q2 <tex>\in</tex> C, |q - q1| <= |q - q2|} furthest f = {q1 | <tex>\forall</tex> q2 <tex>\in</tex> W, |q - q1| >= result.getMax()|q - q2|} '''if''' distance(current, |u - q) | > distance(furthest, |f - q)|
'''break''' <font color="green">// Мы в локальном минимуме. </font>
'''for''' v e : смежные с current вершины в слое layer(u, e) '''in''' G '''if''' !visited.contains(r)e <tex>{\notin}/tex> V visited.add(v)V = V <tex>\bigcup</tex> e furthest f = result.getMax(){q1 | <tex>\forall</tex> q2 <tex>\in</tex> W, |q - q1| >= |q - q2|} '''if''' distance(v, |e - q) | < distance(furthest, |f - q) | or result.count() |W| < ef candidates.add(v)C = C <tex>\bigcup</tex> e result.add(v)W = W <tex>\bigcup</tex> e if result.count() |W| > ef result.removeLast()W = W \ {q1 | <tex>\forall</tex> q2 <tex>\in</tex> W, |q - q1| >= |q - q2|} '''return''' resultW
===Поиск ближайших соседей во всей структуре===
120
правок

Навигация