Size: a a a

2020 October 29

HJ

Happy Jupiter in pro.algorithms
источник

e

evgeniy in pro.algorithms
 ‌‌Gleb Pilipets
Ребят, а какую структуру данных использовать для нахождения k ближайших соседей, если множество данных нужно изменять.

Ну например, есть геолокации, которые можно обновлять и нужны запросы на нахождения k ближайших соседей к заданной геолокации.

Смотрел KDTree в пайтоне, но там только query запросы есть, то есть рассчитано на статическое множество, по которому делают запросы.
источник

A

Angelina in pro.algorithms
Добрый вечер! Есть какая-нибудь годная книга по алгоритмам?
источник

S

Stas in pro.algorithms
Да. Кормен
источник

 P

 ‌‌Gleb Pilipets... in pro.algorithms
Топ, как раз по теме - спасибо
источник
2020 October 30

e

evgeniy in pro.algorithms
 ‌‌Gleb Pilipets
Топ, как раз по теме - спасибо
Если задача состоит в том, чтобы найти ближайших соседей для одной точки/объекта, то можно  просто пробегать по списку с координатами всех объектов, вычисляя расстояние от целевой точки до каждого. Сложность O(n). И деревья не нужны.
источник

e

evgeniy in pro.algorithms
Зелёная точка целевая, красные находятся от неё на расстоянии k, синие дальше.
источник

e

evgeniy in pro.algorithms
Вот такой скриптик на Python написал:

import matplotlib.pyplot as plt
import random
from math import sqrt

def draw_points(target_x, target_y, x_lst, y_lst, distance):
   for x, y in zip(x_lst, y_lst):
       # Pythagorean theorem
       a = abs(target_x - x)
       b = abs(target_y - y)
       c = sqrt(a**2 + b**2)

       color = "blue"
       if c < distance:
           color = "red"

       plt.plot(x, y, 'o', color=color)

# Случайные числа зафиксированны для воспроизводимости графика.
# Закомментировать или удалить для генерации разных чисел.
random.seed(196008)

x_lst = [random.randint(1, 100) for _ in range(20)]
y_lst = [random.randint(1, 100) for _ in range(20)]

target_point_x, target_point_y = random.randint(1, 100), random.randint(1, 100)

plt.plot(target_point_x, target_point_y, 'go', markersize=10)
draw_points(target_point_x, target_point_y, x_lst, y_lst, 40)

plt.show()
источник

A

Arthur in pro.algorithms
перепроверил условие - k ближайших соседей. целевая точка не меняется, множество точек может изменяться, так?
источник

 P

 ‌‌Gleb Pilipets... in pro.algorithms
Изначально была задача, что все точки меняют координаты чаще чем делается запрос на ближайших соседей. И тип как это реализовать для хотя бы 1к эллементов.

Тип динамическое множество точек.

Потом былы другие обсуждения...
источник

RR

Roman Rubanenko in pro.algorithms
 ‌‌Gleb Pilipets
Изначально была задача, что все точки меняют координаты чаще чем делается запрос на ближайших соседей. И тип как это реализовать для хотя бы 1к эллементов.

Тип динамическое множество точек.

Потом былы другие обсуждения...
Если задача практическая, то не хватает ещё очень много контекста
источник

RR

Roman Rubanenko in pro.algorithms
Распределение точек, как часто запросы, насколько большие координаты, на чём это все будет раниться
источник

RR

Roman Rubanenko in pro.algorithms
Если 1к элементов и если апдейты заметно чаще запросов, то вариации наивных решений могут быть очень даже ничего
источник

 P

 ‌‌Gleb Pilipets... in pro.algorithms
Roman Rubanenko
Если 1к элементов и если апдейты заметно чаще запросов, то вариации наивных решений могут быть очень даже ничего
Да, я решил не усложнять со структурой данных, и остановился на мапе.

В итоге использую ConcurrentHashMap с тредпулом от 2 до 10 потоков, время idle потока 120 секунд до удаления.

Решил брать либо одного ближайшего либо всех в радиусе
источник

e

evgeniy in pro.algorithms
1. O(log n) конечно лучше, чем O(n), кто спорит.
2. O(log n) это для нахождения одного соседа, а если задать k = "максимально возможное расстояние", то искать надо будет n элементов.
3. Дерево ещё и строить надо или обновлять. Если элементы меняются часто и помногу, то выгоднее каждый раз строить дерево заново. А построить дерево для 10 000 элементов явно дольше, чем просто пробежать по 10 000 элементам.
источник

e

evgeniy in pro.algorithms
источник

AT

Anatoly Tomilov in pro.algorithms
 ‌‌Gleb Pilipets
Ребят, а какую структуру данных использовать для нахождения k ближайших соседей, если множество данных нужно изменять.

Ну например, есть геолокации, которые можно обновлять и нужны запросы на нахождения k ближайших соседей к заданной геолокации.

Смотрел KDTree в пайтоне, но там только query запросы есть, то есть рассчитано на статическое множество, по которому делают запросы.
а какие n и k?
источник

 P

 ‌‌Gleb Pilipets... in pro.algorithms
Anatoly Tomilov
а какие n и k?
n ~ 1к, k < 10
источник

AT

Anatoly Tomilov in pro.algorithms
быстрее всего цикл, конечно же. Вплоть до k == 20-30k
источник

AT

Anatoly Tomilov in pro.algorithms
если учесть частоту обновления, то k ещё может быть в разы больше
источник