У меня нет определенного ответа для вас, но у меня есть предложение для подхода, который может дать решение.
Я думаю, что стоит исследовать locality-sensitive hashing. Я думаю, что разделение точек равномерно, а затем применение такого рода LSH к каждому набору должно быть легко параллелизуемо. Если вы разработали свой алгоритм хэширования таким образом, чтобы размер ведра определялся в терминах R
, кажется вероятным, что для заданного набора точек, разделенных на ведра, точки, удовлетворяющие вашим критериям, скорее всего, будут существовать в самых полных ковшиках.
Выполняя это локально, возможно, вы можете применить какую-то стратегию сокращения карты, чтобы объединить пространственные ведра из разных параллельных прогонов алгоритма LSH поэтапно, используя тот факт, что вы можете начать чтобы исключить части вашего проблемного пространства путем дисконтирования целых ведер. Очевидно, что вам нужно быть осторожным в случаях кросс, которые охватывают разные ведра, но я подозреваю, что на каждом этапе слияния вы можете применять различные размеры/смещения ковша, чтобы удалить этот эффект (например, выполнить слияние пространственно эквивалентных ковшей, а также как соседние ведра). Я считаю, что этот метод можно использовать для того, чтобы небольшие требования к памяти (т. Е. Вам не нужно хранить гораздо больше, чем сами точки в любой момент, и вы всегда работаете на небольших (ish) подмножествах).
Если вы ищете какую-то эвристику, то я думаю, что этот результат немедленно даст что-то похожее на «хорошее» решение, то есть даст вам небольшое количество вероятных точек, которые вы можете проверить, удовлетворяя вашим критериям. Если вы ищете точный ответ, тогда вам придется применить другие методы, чтобы обрезать пространство поиска, когда вы начнете объединять параллельные ведра.
Еще одна мысль, которую я имел, заключалась в том, что это может касаться поиска metric k-center. Это определенно не такая же проблема, но, возможно, некоторые из методов, используемых при решении, применимы в этом случае. Проблема в том, что это предполагает, что у вас есть metric space, в котором можно вычислить метрику расстояния - в вашем случае, однако, наличие миллиарда точек делает нежелательным и трудным выполнить любой глобальный обход (например, сортировка расстояний между точки). Как я уже сказал, просто мысль, и, возможно, источник дальнейшего вдохновения.
Это звучит как трехмерный вариант проблемы с комплектом покрытия !! :-) –
Ваша проблема напоминает мне «Вектор QuantizatioN», который может дать вам некоторые идеи: http://www.data-compression.com/vq.shtml. На первый взгляд проблему не составит труда решить, если вы удалите это ограничение * «расстояние между любыми двумя точками этих верхних N точек должно быть больше, чем R" * - это ограничение вызывает серьезную проблему и потребует много мышления, чтобы преодолеть это. – SigTerm