JavaScriptの全配列の六種類のアルゴリズムは具体的に実現します.
13492 ワード
全部並べられているのは時間の複雑さです.O(n!)のアルゴリズムは先日学生に講義しました.この問題を考えて帰ってきてまとめました.7つのアルゴリズムで解決できます.その中でダイナミックサイクルはトレースアルゴリズムに似ています.すべてのアルゴリズムはJavaScriptを使って作成され、直接実行できます.
アルゴリズム1:交換(再帰)
アルゴリズム1:交換(再帰)
Full Permutation(Recursive Swap) - Mengliao Software
Full Permutation(Recursive Swap)
Mengliao Software Studio - Bosun Network Co., Ltd.
2011.05.24
<br>/*
<br> ( )
<br>1、 ;
<br>2、 ( );
<br>3、 。
<br>*/
<br>function swap(arr,i,j) {
<br> if(i!=j) {
<br> var temp=arr[i];
<br> arr[i]=arr[j];
<br> arr[j]=temp;
<br> }
<br>}
<br>var count=0;
<br>function show(arr) {
<br> document.write("P<sub>"+ ++count+"</sub>: "+arr+"<br />");
<br>}
<br>function perm(arr) {
<br> (function fn(n) { // n
<br> for(var i=n;i<arr.length;i++) {
<br> swap(arr,i,n);
<br> if(n+1<arr.length-1) // 1
<br> fn(n+1); // n+1
<br> else
<br> show(arr); //
<br> swap(arr,i,n);
<br> }
<br> })(0);
<br>}
<br>perm(["e1","e2","e3","e4"]);
<br>
アルゴリズム2:リンク(再帰)
Full Permutation(Recursive Link) - Mengliao Software
Full Permutation(Recursive Link)
Mengliao Software Studio - Bosun Network Co., Ltd.
2012.03.29
<br>/*
<br> ( )
<br>1、 , ( );
<br>2、 ( );
<br>3、 ( );
<br>4、 2、3, , 。
<br>*/
<br>var count=0;
<br>function show(arr) {
<br> document.write("P<sub>"+ ++count+"</sub>: "+arr+"<br />");
<br>}
<br>function perm(arr) {
<br> (function fn(source, result) {
<br> if (source.length == 0)
<br> show(result);
<br> else
<br> for (var i = 0; i < source.length; i++)
<br> fn(source.slice(0, i).concat(source.slice(i + 1)), result.concat(source[i]));
<br> })(arr, []);
<br>}
<br>perm(["e1", "e2", "e3", "e4"]);
<br>
アルゴリズム3:トレース(再帰)
Full Permutation(Recursive Backtrack) - Mengliao Software
Full Permutation(Recursive Backtrack)
Mengliao Software Studio - Bosun Network Co., Ltd.
2012.03.29
<br>/*
<br> ( )
<br>1、 , , ;
<br>2、 , n ;
<br>3、 n 。
<br>*/
<br>var count = 0;
<br>function show(arr) {
<br> document.write("P<sub>" + ++count + "</sub>: " + arr + "<br />");
<br>}
<br>function seek(index, n) {
<br> if (n >= 0) // ,
<br> if (index[n] < index.length - 1) { //
<br> index[n]++; //
<br> if ((function () { //
<br> for (var i = 0; i < n; i++)
<br> if (index[i] == index[n]) return true; //
<br> return false; //
<br> })())
<br> return seek(index, n); //
<br> else
<br> return true; //
<br> }
<br> else { // ,
<br> index[n] = -1; //
<br> if (seek(index, n - 1)) //
<br> return seek(index, n); //
<br> else
<br> return false; //
<br> }
<br> else
<br> return false;
<br>}
<br>function perm(arr) {
<br> var index = new Array(arr.length);
<br> for (var i = 0; i < index.length; i++)
<br> index[i] = -1; // -1, ++ 0
<br> for (i = 0; i < index.length - 1; i++)
<br> seek(index, i); // n-1
<br> while (seek(index, index.length - 1)) { // n ,
<br> var temp = [];
<br> for (i = 0; i < index.length; i++) //
<br> temp.push(arr[index[i]]);
<br> show(temp);
<br> }
<br>}
<br>perm(["e1", "e2", "e3", "e4"]);
<br>
アルゴリズム四:遡る(再帰ではない)
Full Permutation(Non-recursive Backtrack) - Mengliao Software
Full Permutation(Non-recursive Backtrack)
Mengliao Software Studio - Bosun Network Co., Ltd.
2012.03.29
<br>/*
<br> ( )
<br>1、 , , ;
<br>2、 n 。
<br>*/
<br>var count = 0;
<br>function show(arr) {
<br> document.write("P<sub>" + ++count + "</sub>: " + arr + "<br />");
<br>}
<br>function seek(index, n) {
<br> var flag = false, m = n; //flag ,m
<br> do {
<br> index[n]++;
<br> if (index[n] == index.length) //
<br> index[n--] = -1; // ,
<br> else if (!(function () {
<br> for (var i = 0; i < n; i++)
<br> if (index[i] == index[n]) return true;
<br> return false;
<br> })()) //
<br> if (m == n) //
<br> flag = true;
<br> else
<br> n++;
<br> } while (!flag && n >= 0)
<br> return flag;
<br>}
<br>function perm(arr) {
<br> var index = new Array(arr.length);
<br> for (var i = 0; i < index.length; i++)
<br> index[i] = -1;
<br> for (i = 0; i < index.length - 1; i++)
<br> seek(index, i);
<br> while (seek(index, index.length - 1)) {
<br> var temp = [];
<br> for (i = 0; i < index.length; i++)
<br> temp.push(arr[index[i]]);
<br> show(temp);
<br> }
<br>}
<br>perm(["e1", "e2", "e3", "e4"]);
<br>
アルゴリズム5:並べ替え(再帰的でない)
Full Permutation(Non-recursive Sort) - Mengliao Software
Full Permutation(Non-recursive Sort)
Mengliao Software Studio - Bosun Network Co., Ltd.
2012.03.30
<br>/*
<br> ( )
<br>1、 , , ;
<br>2、 :
<br> P 1~n( ) :p = p1,p2...pn = p1,p2...pj-1,pj,pj+1...pk-1,pk,pk+1...pn
<br>(1) , j(j ), j = max{i | pi < pi+1}
<br>(2) pj , pj k, k = max{i | pi > pj}
<br> pj , k pj
<br>(3) pj pk
<br>(4) pj+1...pk-1,pk,pk+1...pn p' = p1,p2...pj-1,pj,pn...pk+1,pk,pk-1...pj+1
<br>(5)p' p
<br>
<br> :
<br>24310 0~4 , :
<br>(1) 2;
<br>(2) 2 3;
<br>(3) 2 3 34210;
<br>(4) 2( 3) , 4210, 30124;
<br>(5) 24310 30124。
<br>*/
<br>var count = 0;
<br>function show(arr) {
<br> document.write("P<sub>" + ++count + "</sub>: " + arr + "<br />");
<br>}
<br>function swap(arr, i, j) {
<br> var t = arr[i];
<br> arr[i] = arr[j];
<br> arr[j] = t;
<br>
<br>}
<br>function sort(index) {
<br> for (var j = index.length - 2; j >= 0 && index[j] > index[j + 1]; j--)
<br> ; // , , j
<br> if (j < 0) return false; //
<br> for (var k = index.length - 1; index[k] < index[j]; k--)
<br> ; // , j , k
<br> swap(index, j, k);
<br> for (j = j + 1, k = index.length - 1; j < k; j++, k--)
<br> swap(index, j, k); // j+1
<br> return true;
<br>}
<br>function perm(arr) {
<br> var index = new Array(arr.length);
<br> for (var i = 0; i < index.length; i++)
<br> index[i] = i;
<br> do {
<br> var temp = [];
<br> for (i = 0; i < index.length; i++)
<br> temp.push(arr[index[i]]);
<br> show(temp);
<br> } while (sort(index));
<br>}
<br>perm(["e1", "e2", "e3", "e4"]);
<br>
アルゴリズム6:モデルを求める(再帰ではない)
Full Permutation(Non-recursive Modulo) - Mengliao Software
Full Permutation(Non-recursive Modulo)
Mengliao Software Studio - Bosun Network Co., Ltd.
2012.03.29
<br>/*
<br> ( )
<br>1、 result, ;
<br>2、 n , n!;
<br>3、 >=0 n! , 1, index;
<br>4、 1 arr[0], 1 , index 1 w, 1 (arr[0]) result w , index index\1;
<br>5、 2 arr[1], 2 , index 2 w, 2 (arr[1]) result w , index index\2;
<br>6、 3 arr[2], 3 , index 3 w, 3 (arr[2]) result w , index index\3;
<br>7、……
<br>8、 arr[arr.length-1], ;
<br>9、 index , 。
<br>
<br> :
<br> 4 ["a", "b", "c", "d"] , 4!=24 , >=0 index , 1, index+23 ;
<br> index=13( 13+24,13+2*24,13+3*24…), 4 , 4 , :
<br> 1 ,13/1, =13, =0, 1 0 ( 0), ["a"];
<br> 2 ,13/2, =6, =1, 2 1 ( 1), ["a", "b"];
<br> 3 ,6/3, =2, =0, 3 0 ( 0), ["c", "a", "b"];
<br> 4 ,2/4, =0, =2, 4 2 ( 2), ["c", "a", "d", "b"];
<br>*/
<br>var count = 0;
<br>function show(arr) {
<br> document.write("P<sub>" + ++count + "</sub>: " + arr + "<br />");
<br>}
<br>function perm(arr) {
<br> var result = new Array(arr.length);
<br> var fac = 1;
<br> for (var i = 2; i <= arr.length; i++)
<br> fac *= i;
<br> for (index = 0; index < fac; index++) {
<br> var t = index;
<br> for (i = 1; i <= arr.length; i++) {
<br> var w = t % i;
<br> for (j = i - 1; j > w; j--)
<br> result[j] = result[j - 1];
<br> result[w] = arr[i - 1];
<br> t = Math.floor(t / i);
<br> }
<br> show(result);
<br> }
<br>}
<br>perm(["e1", "e2", "e3", "e4"]);
<br>
上の6つのアルゴリズムのいくつかは位置を並べています.例えば、遡り、並べ替えなど、様々な種類の要素に適応することができます.配列される要素を要求するのではなく、数字やアルファベットなどです.