ホームページ >Java >&#&チュートリアル >繰り返し要素を含む配列のすべての順列を生成するにはどうすればよいですか?
個別の要素の配列が与えられた場合、目的は、配列要素の考えられるすべての順列をリストすることです。
次のアルゴリズムは、O(N!) 時間ですべての順列を生成します。複雑さ:
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]
要素が繰り返される配列の場合、Jarvis March アルゴリズムはより優れたものです。効率的なアプローチ:
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:])
以上が繰り返し要素を含む配列のすべての順列を生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。