Я не уверен, почему вы используете очередь здесь.Это не похоже на правильную структуру данных для проблемы.Кроме того, Python имеет встроенную структуру данных очереди (collections.deque
, и просто используйте popleft()
вместо pop(0)
).
Более простой способ (imo) - просто поддерживать «указатель» (или индекс) к каждому массиву, начиная с начала.Если элементы находятся в пределах approx
друг от друга, добавьте их и увеличьте оба указателя.Если элемент a
меньше элемента b
, увеличьте указатель a
s.Иначе, приращение указателя b
s.Продолжайте до тех пор, пока оба указателя не будут исчерпаны (т.е. указывают на конец списка).Это работает в O (N), линейное время.Вот реализация указанного алгоритма:
def match_approximate(a, b, approx=3):
a_ind, b_ind = 0, 0
result = []
while a_ind < len(a) and b_ind < len(b):
if abs(a[a_ind] - b[b_ind]) <= approx:
result.append(b[b_ind])
if a[a_ind] == b[b_ind]:
b_ind += 1
a_ind += 1
elif a[a_ind] < b[b_ind]: a_ind += 1
else: b_ind += 1
def match_last_element(a, a_ind, last_elt_of_b, result):
while a_ind != len(a):
if abs(a[a_ind] - last_elt_of_b) <= approx:
result.append(a[a_ind])
a_ind += 1
else:
break
if a_ind != len(a): match_last_element(a, a_ind, b[-1], result)
else: match_last_element(b, b_ind, a[-1], result)
return result
Выполнение
a = [7, 22, 34, 49, 56, 62, 76, 82, 89, 161, 163, 174]
b = [5, 6, 7, 14, 49, 57, 66, 76, 135, 142, 161]
print(match_approximate(a, b, 3))
выдаст [5, 6, 7, 49, 57, 76, 161, 163]
(что, как я предполагаю , ожидается, но см. Ниже онекоторые крайние случаи, которые не ясны).Если вы запустите этот случай на своем текущем импле, вы получите IndexError
.
Не совсем понятно, что делать в некоторых крайних случаях:
Когда выесть приблизительное совпадение, какой элемент вы добавляете к результату?Это подразумевает просто добавление элемента b
s (как в примере).
Как обрабатывать дубликаты?В этом случае, если оба списка содержат дубликаты, они будут добавлены дважды.Если только один список содержит дубликаты, элементы будут добавлены только один раз.Более сложный пример с dups состоит в том, чтобы понять, есть ли у нас [4,5]
и [4,5]
в качестве входных данных, если наш вывод будет [4,5]
или [4,4,5,5]
(поскольку 4
и 5
оба находятся в пределах approx
каждогопрочее, 4
также соответствует 5
).
Является ли привязка approx
включительно или исключительной (т. е. <= approx
или < approx
)?
Не стесняйтесь отрегулировать вышеупомянутое значение, чтобы справиться с тем, что вы считаете необходимым сделать в этих случаях.
HTH.