2013-08-07 5 views
0

У меня есть массив, который выглядит примерно так:Поиск по несортированному неоднородном массиве пары для ближайшего входа

[[320, 80], [300, 70], [300, 80], [270, 75], [260, 70], [280, 70]] 

Это только фрагмент, фактический массив является 338 большой.

Я пытаюсь найти следующий логический элемент в массиве на основе некоторого ввода. Так, например, я питаюсь двумя номерами, I.e. 315, 80 Следующим логическим является 320, 80, если вы хотите найти более крупную запись.

Я не хочу связывать логическое с ближайшим, потому что это зависит от того, нужен ли вам более крупный или меньший элемент. Поэтому я предполагаю, что по логике я имею в виду «ближе всего в нужном направлении».

В качестве дополнительного требования второе число должно пытаться оставаться как можно ближе к введенному значению ИЛИ первое число должно пытаться оставаться как можно ближе к первоначальный номер.

У меня возникли проблемы, когда дело доходит до таких случаев, как 275, 70, и я хочу найти следующее самое маленькое. Это должен быть 260, 70, но моя реализация продолжает сбор 280, 70

Моей текущая реализация добавляет разницу между двумя числами и ищет минимально возможную разницу. Я не уверен, как обеспечить руководство.

Python Пример (хотя на самом деле я ищу для агностика решения языка)

elements = [ [320, 80], 
      [300, 70], 
      [300, 80], 
      [270, 75], 
      [260, 70], 
      [280, 70] 
      ] 

target = [275, 70] 
bestMatch = [] 
bestDifference = 0 

for e in elements: 
    currentDifference = abs((target[0] - e[0]) - (target[1] - e[1])) 

    if not bestMatch or currentDifference < bestDifference: 
     bestMatch = e 
     bestDifference = currentDifference 

print bestMatch 

ответ

1

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

Идти в правильном направлении, вы можете просто проверить, является ли элемент вы в настоящее время больше или меньше, чем цель

Doing что вы получите следующее:

elements = [ [320, 80], 
      [300, 70], 
      [300, 80], 
      [270, 75], 
      [260, 70], 
      [280, 70] 
      ] 

def nextLogicalElement(target, bigger=True): 
    bestScore = 0 
    bestMatch = [] 
    for e in elements: 
     score = min(abs(target[0] - e[0]), abs(target[1] - e[1])) 

     if bigger and target[0] > e[0] or not bigger and target[0] < e[0]: 
      continue 

     if not bestMatch or score < bestScore: 
      bestMatch = e 
      bestScore = score 

    return bestMatch 

Выход:

>>> print nextLogicalElement([315, 80], bigger=True) 
[320, 80] 
>>> print nextLogicalElement([275, 70], bigger=False) 
[260, 70] 
+0

ahhh, perfect. Я столкнулся с настоящим ментальным блоком по этой проблеме. спасибо – Lerp