2016-09-09 7 views
2

Давайте предположим, что у вас есть два существующих словарей A и BПоиск ближайших возможных значений из двух словарей

Если вы уже остановили свой выбор на первые два элементов из словарей A и B со значениями A1 = 1.0 и B1 = 2.0, соответственно, есть ли способ найти любые два разных существующих предмета в словарях A и B, каждый из которых имеет разные значения (то есть A2 и B2) от A1 и B1, а также минимизирует значение (A2-A1)**2 + (B2-B1)**2?

Количество элементов в словаре нефиксировано и может превышать 100 000.

Edit - Это важно: ключи для A и B одинаковы, но значения, соответствующие этим ключам в A и B различны. Определенный выбор ключа даст упорядоченную пару (A1, B1), которая отличается от любой другой возможной пары ордеров (A2, B2) - разные ключи имеют разные пары ордеров. Например, оба A и B будут иметь ключ 3,4, и это даст значение 1.0 для dict A и 2.0 для B. Затем этот один ключ сравнивается с любым другим ключом, который может найти другую упорядоченную пару (то есть как ключ, так и значения элементов в A и B), что минимизирует квадраты различий между ними.

+2

Ваш вопрос не заполнен. Вам небезразличны, какие соответствующие клавиши относятся к A2 и B2? Вам просто нужны ценности? Если A2 и B2 появляются более одного раза, вам нужно вернуть список всех ключей? Ozgur (который, кажется, удалил свой комментарий) находится на правильном пути, но вы будете сортировать по значениям. –

+0

@MaxWen Я не обязательно указываю, какие ключи сами по себе могут варьироваться.Обычно они будут упорядоченными парами формы 'j, k', где j и k - целые числа, но это не является строгим требованием для моего вопроса. Будет оценен более общий подход. Основное значение имеет поиск предметов в словарях с близкими, но не одинаковыми значениями. Требуется возврат двух ключей из 'A' и' B' с ближайшим значением в 'A1' и' B1'. Да, я думал, что потребуется какой-то метод сортировки, но любые особенно эффективные методы будут очень полезны. – Mathews24

+0

@MaxWen Чтобы добавить, все ключи в словаре уже известны. Хотя элемент (то есть его ключ и значение) со значением, самым близким к A1 и B1, как указано выше, запрашивается. Я также сделал редактирование, так что никакой выбор ключей не может дать те же два значения, что и A2 и B2, так как ключи, рассмотренные во время сравнения, одинаковы. Я могу привести пример, если это будет более ясным. – Mathews24

ответ

2

Вам понадобится специализированная структура данных, а не стандартный словарь Python. Посмотрите на квадратное дерево или kd-дерево. Вы эффективно сводите к минимуму евклидово расстояние между двумя точками (ваша целевая функция - всего лишь квадратный корень от евклидова расстояния, а ваш словарь A хранит x-координаты, B y-координаты.). Люди вычислительной геометрии изучали это в течение многих лет.

Возможно, я неверно истолковал ваш вопрос и делал его труднее, чем он есть. Вы говорите, что вы можете выбрать любое значение от A и любое значение от B, независимо от того, являются ли их ключи одинаковыми? Например, выбор из A может быть K: V (3,4): 2,0, а выбор из B может быть (5,6): 3,0? Или это должно быть (3,4): 2,0 от A и (3,4): 6,0 от B? Если первое, проблема проста: просто пробегите значения от A и найдите ближайший к A1; затем пробегите значения из B и найдите ближайший к B1. Если последний, мой первый абзац был правильным ответом.

Ваш комментарий говорит, что сложнее проблема, которую вы хотите решить, так что вот немного больше. Слайды Sedgewick объясняют, как работают статическая сетка, 2d-дерево и квадро-дерево. http://algs4.cs.princeton.edu/lectures/99GeometricSearch.pdf. Слайды с 15 по 29 объясняют главным образом 2d-дерево, с 27 по 29, охватывающее решение проблемы ближайшего соседа. Поскольку у вас есть ограничение на то, что точка, найденная алгоритмом, не должна делиться ни координатой x, ни y с точкой запроса, вам, возможно, придется реализовать алгоритм самостоятельно или изменить существующую реализацию. Одна из альтернативных стратегий - использовать структуру данных kNN (k ближайших соседей, в отличие от одного ближайшего соседа), экспериментировать с k и надеяться, что ваш выбранный k всегда будет достаточно большим, чтобы найти хотя бы одного соседа, который соответствует вашему ограничению.

+0

Это последнее - ключи должны быть одинаковыми. Это по существу неравномерная 2-мерная сетка, на которой я пытаюсь найти ближайшую точку на сетке к первоначально заданной. – Mathews24

+0

Получил это. Я добавил третий абзац к моему ответу. –

+0

Ты точно понял мое дело. Это второстепенная точка, но для каждой упорядоченной пары (An, Bn) только Bn должно отличаться от всех остальных Bm. Другая упорядоченная пара (Am, Bm) может иметь или не иметь Am = An, но Bn! = Bm всегда. Я все еще читаю ссылку, которую вы мне прислали, но подумал, что я проясню этот момент. – Mathews24