簡體   English   中英

數組的所有排列,其中數組中的每個元素必須按 0 和 n 之間的范圍增加

[英]All permutations of array where each element in the array must be increasing by range between 0 and n

假設我有一個帶有值的元素列表

[1, 2, 3, 5, 6, 7, 9, 12]

基本上,數組中的元素可能最大有 n 的差異,在這種情況下為 3,按遞增順序排列。

上面的數組將像這樣工作:

2-1 = 1 | difference of 1
3-2 = 1 | difference of 1
5-3 = 2 | difference of 2
6-5 = 1 | difference of 1

等等。 我將如何 go 找到長度為 x 且最大差為 n 的數組的所有排列?

假設您正在尋找絕對值的差異,您可以通過逐步將每個符合條件的元素添加到結果中來遞歸地執行此操作:

這是使用遞歸生成器 function 的示例:

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))

Output

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]

試試這個作為遞歸。 應該打印出所有允許的值。
x被描述為required_number並且ndiff

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是否具有該長度來完成)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM