Я ищу эффективный способ сравнения списков чисел, чтобы узнать, соответствуют ли они любым оборотам (по сравнению с 2 круговыми списками).Сравнить поворотные списки, содержащие дубликаты
Когда списки не имеют дубликатов, выбирают наименьшее/наибольшее значение и поворачивают оба списка до сравнения. Но когда может быть много повторяющихся больших значений, это не так просто.
Например, [9, 2, 0, 0, 9]
и [0, 0, 9, 9, 2]
это результаты,
, где [9, 0, 2, 0, 9]
не будет (так как заказ отличается).
Это пример эффективной работы, которая работает.
def min_list_rotation(ls):
return min((ls[i:] + ls[:i] for i in range(len(ls))))
# example use
ls_a = [9, 2, 0, 0, 9]
ls_b = [0, 0, 9, 9, 2]
print(min_list_rotation(ls_a) == min_list_rotation(ls_b))
Это может быть улучшен для повышения эффективности ...
- проверки отсортирован матч списки перед запуском исчерпывающих тестов.
- только испытательные вращения, начинающиеся с минимального значения
(пропуская соответствующие значения после этого)
, эффективно находим минимальное значение с самым дальним & после него (постоянно - в случае, если имеется несколько совпадающих значений самого большого значения). - сравнить ротацию без создания новых списков каждый раз ..
Однако ее по-прежнему не очень эффективный метод, так как он основан на проверке много возможностей.
Есть ли более эффективный способ выполнить это сравнение?
Связанный вопрос: Compare rotated lists in python
посмотрите на мой ответ: HTTP : //stackoverflow.com/a/26924896/1090562. Я считаю, что это то, что вы ищете. –
Извинения за задание повторяющегося вопроса (хотя я действительно искал эту тему, просто пропустил, используя ключевое слово ** круговое **). – ideasman42