Скажем, у меня есть список элементов со значениями
[1, 2, 3, 5, 6, 7, 9, 12]
По сути, элементы в массиве могут иметь максимальную разницу в n, в данном случае в три, в порядке возрастания.
Приведенный выше массив будет работать так:
2-1 = 1 | difference of 1
3-2 = 1 | difference of 1
5-3 = 2 | difference of 2
6-5 = 1 | difference of 1
И так далее. Как мне найти все перестановки массива с длиной x и максимальной разницей n?
Я думаю, что если x=4
и n=2
, то [1,2,3,5]
будет правильным числом...
Поскольку вам нужно сохранить порядок, это очень легко использовать рекурсию...
С рекурсией не работает, в списке есть пара сотен элементов. :/
Пришествие Кода 2020 День 10...
Юпп, я понятия не имею, как делать перестановки.
Если вы не ищете разницу между абсолютными значениями соседних элементов, будет либо только одно решение, либо его вообще не будет. Любой массив, который не находится в порядке возрастания, будет иметь отрицательную разницу между по крайней мере одним элементом и следующим. Отсортированный массив либо будет соответствовать вашему ограничению разницы, либо нет. Если вы на самом деле ищете различия в абсолютном значении, пожалуйста, будьте конкретны в своем вопросе.
Попробуйте это как рекурсию. Должен распечатать все допустимые значения.x
описывается как required_number
, а n
есть diff
.
def getPermutations(cur_permutation, arr_to_check, required_number, diff):
if len(arr_to_check) == 0:
return
if required_number == 0:
print cur_permutation
return
cur_last_item = cur_permutation[-1]
for index, arr_item in enumerate(arr_to_check):
if arr_item - cur_last_item <= diff:
new_copy = cur_permutation[:]
new_copy.append(arr_item)
return getPermutations(new_copy, arr_to_check[1:], required_number - 1, diff)
(Это также можно сделать, сохранив требуемую длину и проверив, имеет ли cur_permutation
эту длину).
Предполагая, что вы ищете различия в абсолютном значении, вы можете сделать это рекурсивно, постепенно добавляя каждый подходящий элемент к результату:
вот пример использования рекурсивной функции генератора:
def permuteSort(A,maxDiff,previous=None):
if not A: yield []; return
for i,a in enumerate(A):
if previous is not None and abs(a-previous) > maxDiff:
continue
yield from ([a]+p for p in permuteSort(A[:i]+A[i+1:],maxDiff,a))
Выход
for p in permuteSort([1, 2, 3, 5, 6, 7, 9, 12],3):
print(p,"differences:",[b-a for a,b in zip(p,p[1:])])
[1, 2, 3, 5, 6, 7, 9, 12] differences: [1, 1, 2, 1, 1, 2, 3]
[1, 2, 3, 5, 7, 6, 9, 12] differences: [1, 1, 2, 2, -1, 3, 3]
[1, 2, 3, 6, 5, 7, 9, 12] differences: [1, 1, 3, -1, 2, 2, 3]
[1, 2, 5, 3, 6, 7, 9, 12] differences: [1, 3, -2, 3, 1, 2, 3]
[1, 3, 2, 5, 6, 7, 9, 12] differences: [2, -1, 3, 1, 1, 2, 3]
[1, 3, 2, 5, 7, 6, 9, 12] differences: [2, -1, 3, 2, -1, 3, 3]
[2, 1, 3, 5, 6, 7, 9, 12] differences: [-1, 2, 2, 1, 1, 2, 3]
[2, 1, 3, 5, 7, 6, 9, 12] differences: [-1, 2, 2, 2, -1, 3, 3]
[2, 1, 3, 6, 5, 7, 9, 12] differences: [-1, 2, 3, -1, 2, 2, 3]
[3, 1, 2, 5, 6, 7, 9, 12] differences: [-2, 1, 3, 1, 1, 2, 3]
[3, 1, 2, 5, 7, 6, 9, 12] differences: [-2, 1, 3, 2, -1, 3, 3]
[5, 2, 1, 3, 6, 7, 9, 12] differences: [-3, -1, 2, 3, 1, 2, 3]
[6, 3, 1, 2, 5, 7, 9, 12] differences: [-3, -2, 1, 3, 2, 2, 3]
[7, 5, 2, 1, 3, 6, 9, 12] differences: [-2, -3, -1, 2, 3, 3, 3]
[12, 9, 6, 3, 1, 2, 5, 7] differences: [-3, -3, -3, -2, 1, 3, 2]
[12, 9, 6, 7, 5, 2, 1, 3] differences: [-3, -3, 1, -2, -3, -1, 2]
[12, 9, 6, 7, 5, 2, 3, 1] differences: [-3, -3, 1, -2, -3, 1, -2]
[12, 9, 6, 7, 5, 3, 1, 2] differences: [-3, -3, 1, -2, -2, -2, 1]
[12, 9, 6, 7, 5, 3, 2, 1] differences: [-3, -3, 1, -2, -2, -1, -1]
[12, 9, 7, 5, 2, 1, 3, 6] differences: [-3, -2, -2, -3, -1, 2, 3]
[12, 9, 7, 5, 6, 3, 1, 2] differences: [-3, -2, -2, 1, -3, -2, 1]
[12, 9, 7, 5, 6, 3, 2, 1] differences: [-3, -2, -2, 1, -3, -1, -1]
[12, 9, 7, 6, 3, 1, 2, 5] differences: [-3, -2, -1, -3, -2, 1, 3]
[12, 9, 7, 6, 3, 5, 2, 1] differences: [-3, -2, -1, -3, 2, -3, -1]
[12, 9, 7, 6, 5, 2, 1, 3] differences: [-3, -2, -1, -1, -3, -1, 2]
[12, 9, 7, 6, 5, 2, 3, 1] differences: [-3, -2, -1, -1, -3, 1, -2]
[12, 9, 7, 6, 5, 3, 1, 2] differences: [-3, -2, -1, -1, -2, -2, 1]
[12, 9, 7, 6, 5, 3, 2, 1] differences: [-3, -2, -1, -1, -2, -1, -1]
Итак... что является допустимой перестановкой для данного массива?