首頁 >Java >java教程 >如何產生數組的所有排列,包括具有重複元素的排列?

如何產生數組的所有排列,包括具有重複元素的排列?

Susan Sarandon
Susan Sarandon原創
2024-12-10 00:06:11687瀏覽

How to Generate All Permutations of an Array, Including Those with Repeated Elements?

產生數組的所有排列

給定一個由不同元素組成的數組,目標是列出數組元素的所有可能排列。

演算法

以下演算法在O(N!) 時間內產生所有排列複雜度:

  1. 初始化: 設定🎜>
  2. 初始化: 設定🎜>
  3. 初始化:
  4. 設定🎜>初始化:
  5. 設定🎜>
  6. 初始化: 設定🎜>
  7. 初始化: 設定🎜>
  8. 初始化:
  9. 設定🎜>初始化:
  10. 設定🎜>

初始化:

設= 0。
def permute(arr, i=0):
    if i == len(arr) - 1:
        print(arr)
        return

    for j in range(i, len(arr)):
        arr[i], arr[j] = arr[j], arr[i]
        permute(arr, i + 1)
        arr[i], arr[j] = arr[j], arr[i]

迭代數組:

當i 小於數組長度時:

  1. 交換: 將索引i 處的元素與每個交換數組中剩餘元素的值。
  2. 遞歸: 遞歸呼叫演算法,以 i 1 為新的 i 值。
  3. 交換回來:遞歸呼叫後,將元素交換回原來的狀態
  4. 增加 i: 將 i 加 1。
  5. Python 實作
  6. Jarvis March 演算法
  7. 對於具有重複元素的數組,Jarvis March 演算法
  8. 對於具有重複元素的數組,Jarvis March 演算法是一種更有效率的演算法方法:
  9. 排序:
依升序對數組進行排序。

def permute_repeated(arr):
    ind = [0] * len(arr)
    for i in range(len(arr)):
        ind[i] = i

    while True:
        yield [arr[i] for i in ind]

        for i in range(len(arr) - 2, -1, -1):
            if ind[i] < ind[i + 1]:
                break

        if i == -1:
            return

        for j in range(len(arr) - 1, -1, -1):
            if arr[j] > arr[i]:
                ind[i], ind[j] = ind[j], ind[i]
                break

        ind[i + 1:] = sorted(ind[i + 1:])
當: 未完成時: 找出主元:找出元素小於其的最大索引後繼者。 找出相鄰: 找出排序部分中大於樞軸索引處的元素的最後一個元素。 交換:交換樞軸和相鄰索引處的元素。 反轉:反轉從樞軸索引到排序部分末端的元素。 檢查完成:檢查陣列是否依降序排序。如果是,則退出循環。 Python 實作

以上是如何產生數組的所有排列,包括具有重複元素的排列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn