https://www.jb51.net/article/39291.htm
JavaScriptの完全な配列を実現するアルゴリズムの6種類
アルゴリズム:エクスチェンジ(再帰)
<HTMLのxmlns = "http://www.w3.org/1999/xhtml">
<HEAD>
<META HTTP-当量= "タイプ-コンテンツ"コンテンツ= "テキスト/ HTML;のcharset = UTF-8" />
<タイトル>全順列(再帰スワップ) - Mengliaoソフトウェア</ TITLE>
</ HEAD>
<BODY>
<P> /> <br全順列(再帰スワップ)
Mengliaoソフトウェアメーカー-ボースンネットワーク株式会社の<br />
2011年5月24日</ P>
<スクリプトタイプ=「テキスト/ JavaScriptを」>
/ *
完全な配列(再帰的に交換)アルゴリズム
をそれぞれ1、さまざまな要素を配置する第1の位置、
2、完全なアラインメントの残りの位置(再帰的);
3、唯一の再帰エクスポート完全な配列要素。
* /
私は、ARR(スワップ機能、
ARR [I] = ARR [J];
ARR [J] = TEMP;
}
}
VARのCOUNT = 0;
機能表示(ARR){
のdocument.write( "P <サブ>" COUNT + ++ +「</サブ> "+ + ARR" <brの/>「);
}
関数パーマ(ARR){
(関数fn(N){// n番目の位置選択された要素
のための(VAR I = N; iは <arr.length; iは++){
スワップ(ARR、I、N-);
(。。のn + 1 <-arr.length 1)すると//完全な配列要素は、アレイ内に残存していると判断された1つのより大きい
FN(N + 1); // Nから+完全な配列添字
他の
表示(ARR); //結果のセット表示
スワップ(ARR、I、N-);
}
})(0);
}
パーマ([ "E1"、 "E2"、 "E3"、 "E4"])。
</スクリプト>
</ BODY>
</ HTML>
アルゴリズムII:リンク(再帰)
/ * 完全な配列(再帰リンク)アルゴリズム 入力源アレイを設定する1は、配列され、得られた配列は、検索結果(空の配列に初期化)のために記憶される; (2、それぞれが個別光源アレイ素子結果アレイに連結された新しい配列の生成オブジェクト); 3、元の配列要素から除去がリンクされている(新しい配列オブジェクトを生成する); 4、新しいソース・アレイと結果アレイ光源アレイが空になるまで再帰的に呼び出されるパラメータは、2ステップとして、Aの、出力装置。 * / VarのCOUNT = 0;
機能表示(ARR){
のdocument.write( "P <サブ>" + ++カウント+ "</サブ>: "+ ARR +" <brの/>");
}
関数パーマ(ARR){
(関数fn(ソース、結果){
IF(source.length == 0)
;表示(結果)
他
iはsource.lengthを<; I ++)は(VAR I = 0
、FN(ソース。スライス(0、I).concat(source.slice(I + 1))、result.concat(ソース[I]));
})(ARR、[])。
}
パーマ([ "E1"、 "E2"、 "E3"、 "E4"])。
</スクリプト>
</ BODY>
</ HTML>
アルゴリズム3:バック(再帰的に)
<HTMLのxmlns = "http://www.w3.org/1999/xhtml">
<HEAD>
<META HTTP-当量= "タイプ-コンテンツ"コンテンツ= "テキスト/ HTML;のcharset = UTF-8" />
<タイトル>全順列(再帰的なバックトラック) - Mengliaoソフトウェア</ TITLE>
</ HEAD>
<BODY>
<P>全順列/> <br(再帰バックトラック)
Mengliaoソフトウェアメーカー-ボースンネットワーク株式会社の<br />
2012年3月29日</ P>
<スクリプトタイプ=「テキスト/ JavaScriptを」>
/ *
完全な配列(再帰的なバックトラック)アルゴリズムである
、すなわち、位置が配置変換素子の成功が配置された後に整列され、アレイに設立位置;
2、確立再帰関数は、n番目の位置を検索する;
3、8つのクイーン問題に対するn番目の検索位置と同様。
* /
VarのCOUNT = 0;
document.write( "P <サブ>" COUNT + ++ + "</サブ>:" + + ARR "<brの/>");
}
関数シーク(インデックス、N-){
IF(N> = 0)/前/最初の位置に戻るが、すなわち、配列内のすべての位置が見つかったか否かを判断する
(インデックス[N] <index.length場合 {// - 1) 次がある任意の位置
/;指数[n]が++ /次の場所を選択
する場合((関数(){//匿名関数は、位置が選択されたか否かを判断
するための(VARのI = 0、I <N - 、I ++)
IF(インデックス[I] ==インデックス[N-】 )trueを返す; //選択は
falseを返す; //選択されていない
})())
の//再発見位置;シーク(インデックス、N-)を返す
それ以外の
真のリターン; //見つけ
}
他{//いいえ現在位置あるいは、再帰後戻り
指数[n]を= -1; //現在の位置をキャンセル
- ((インデックスを求め、N場合 // 1)) 上の位置を探し続ける
(指数、Nを求めるリターン); //の再検索現在位置
他は
偽に戻り、もはや//任意の位置
}
さもなければ
偽を返す;
}
関数パーマ(ARR){
VAR指数は=新しい新しいアレイ(arr.length);
(VAR I = 0、I <index.length; I ++)は
、インデックス[I] = -1; ++ 0された後に-1 //は、すべての位置を初期化
私はindex.lengthを< - 1;(I = 0)Iは++
、(インデックスシーク私は); // N-1位の前に最初の探索は
ながら(シーク(インデックスは、index.length - 1)){// 、n番目の位置を探し続ける、すなわち、全ての位置に配置された検索します
TEMP = VAR [];
のための(I = 0;私はindex.lengthを<; Iは++)//は、要素の位置変換
temp.push(ARR [インデックスを[I]);
表示(TEMP);
}
}
パーマを( [ "E1"、 "E2"、 "E3"、 "E4"]);
</ SCRIPT>
</ BODY>
</ HTML>
アルゴリズム4:バック(非再帰的)
<HTMLのxmlns = "http://www.w3.org/1999/xhtml">
<HEAD>
<META HTTP-当量= "タイプ-コンテンツ"コンテンツ= "テキスト/ HTML;のcharset = UTF-8" />
<タイトル>全順列(非再帰的なこのバックトラック) - Mengliaoソフトウェア</ TITLE>
</ HEAD>
<BODY>
<P>
/> <br全順列(非再帰的なこのバックトラック)
Mengliaoソフトウェアメーカー-ボースンネットワーク株式会社の/> <br
2012年3月29日</ P>
<スクリプトタイプ=「テキスト/ JavaScriptを」>
/ *
完全な配列(非再帰的バックトラック)アルゴリズムである
、すなわち、位置が配置され、構成要素の配置が正常に変換し、アレイで確立位置配列;
2、8つのクイーン問題に対するn番目の検索位置と同様。
* /
VarのCOUNT = 0;
document.write( "P <サブ>" COUNT + ++ + "</サブ>:" + + ARR "<brの/>");
}
関数シーク(インデックス、N-){
VAR = falseにフラグに、M = N- ;フラグに位置//検索が記憶されて見つかったフラグ配列、mで
行い{
指数[N-] ++;
IF(インデックス[N-] == index.length)//もはや使用可能位置
指標[N--] = 1; //現在の位置、フォールバック位置リセット
!他IF((関数(){
I <N-; I ++)(VARのI = 0の
IF(インデックス[I] ==インデックス[N-を真の])のリターン;
偽に戻る;
})())//この位置が選択されていない
(m個の== n)が検索の//現在位置が終了した場合
= trueにフラグに、
他の
N ++;
(!フラグ&& N> = 0)}ながら
復帰フラグ。
}
関数パーマ(ARR){
VAR指数=新しいアレイ(arr.length)。
(; iはindex.lengthを<I ++がVAR I = 0)のための
インデックス[I] = -1。
(; iはindex.length < - 1; i = 0 iが++)のためには
(インデックス、I)シーク。
一方、(シーク(インデックス、index.length - 1)){
VARのTEMP = [];
用(i = 0; iはindex.lengthを<; iは++)
temp.push([インデックス[I] ARR)。
ショー(TEMP)。
}
}
パーマ([ "E1"、 "E2"、 "E3"、 "E4"])。
</ SCRIPT>
</ HTML>
アルゴリズム5:ソート(非再帰的)
<HTMLのxmlns = "http://www.w3.org/1999/xhtml">
<HEAD>
<META HTTP-当量= "タイプ-コンテンツ"コンテンツ= "テキスト/ HTML;のcharset = UTF-8" />
<タイトル>全順列(非再帰的なこの種) - Mengliaoソフトウェア</ TITLE>
</ HEAD>
<BODY>
<P>
/> <br全順列(非再帰的なこの種)
ボースンネットワーク株式会社の- Mengliaoソフトウェアメーカー/> <br
2012年3月30日</ P>
<スクリプトタイプ=「テキスト/ JavaScriptを」>
/ *
完全な配列(非再帰的評価のため)アルゴリズムである
、すなわち、位置が配置変換素子の成功後に整列され、アレイに設立位置配置、
次のように配置された2、算術完璧:
完全な順列のしようP 1〜N(位置番号):P = P1、P2 ... PN = P1、P2 ... PJ-1、PJ、PJ + 1 ... PK-1、 PK、PK + 1 ... PN
| {PI <PI + 1 I J}(1)配列の終わりから始め、最初の数字の右の位置を見つけるために、すなわち、= MAX、インデックスj(第一の部分から計算J)より小さい
PJの右側に(2)位置番号のインデックスkでPJより大きいすべての最小の位置番号を見つける位置番号、すなわち、K =最大{I | PI> PJ}
kのように位置番号PJは右、右から左にインクリメントされますPJ最大インデックス位置の数よりも大きい全ての粒子
(3)とPJ PK交換
(4)次に、+ 1 PJ ... PK-1、 PK、PK + 1 ... PN Pを得るための配置を反転「= P1、P2 。。。PJ 1 ...、PJ、PK ... PN + 1、PK、PK-1 + 1 ... PJ
(5)のP「に配置されて、次の置換p
例:
24310は、4に位置番号0であります次のように次のステップでは、配置されたシーク順列、:
(1)2よりも小さい第一のデジタル権利数を見つけるために右から左に配置されている;
(2)2よりも大きい番号の後に番号を識別;最小3の数
(3)交換機2及び3は、34210を得た;
(4)全ての2元数(現在3)バック反転、すなわち30124を得るために4210を反転し;
(5)24310で得られましたこれは30124に配置されています。
* /
Varのカウント= 0;
機能表示(ARR){
document.write( "P <サブ>" COUNT + ++ + "</サブ>:" + + ARR "<brの/>が");
}
スワップ機能(ARR、I、J){
VARのARRのT = [I ];
ARR [I] = ARR [J];
ARR [J] = T;
}
関数ソート(インデックス){
(VARのindex.length用J = - 2; J> = 0 &&指数[J]>インデックス[J 1 +]; J)
; //配列の端からこのサイクル開始位置は、最初の右の位置を見つけるために左、すなわちJ未満である
場合はfalseに(J <0)リターン; //すべての配置完了した
ため(VAR index.length = K - 1;指数[K] <インデックス[J]; K--)
; //位置jを見つけるために、アレイ内の位置の現在のサイクルの終わりから始まる、すなわち、K、最小位置よりも大きい
スワップ(インデックス、J、K);
(J = J + 1、K = index.length - 1;。。J <K、J ++、 K--)
スワップ(指数、J、K); //この反転周期J + 1の全ての位置の端に
trueを返します。
}
関数パーマ(ARR){
VAR指数=新しいアレイ(arr.length)。
(; iはindex.lengthを<I ++がVAR I = 0)のための
インデックス[I] = I。
{行う
VARのTEMP = [];
用(i = 0; iはindex.lengthを<; iは++)
temp.push([インデックス[I] ARR)。
ショー(TEMP)。
}一方(ソート(インデックス))。
}
パーマ([ "E1"、 "E2"、 "E3"、 "E4"])。
</スクリプト>
</ BODY>
</ HTML>
アルゴリズム6:MOD(非再帰的)
<HTMLのxmlns = "http://www.w3.org/1999/xhtml">
<HEAD>
<META HTTP-当量= "タイプ-コンテンツ"コンテンツ= "テキスト/ HTML;のcharset = UTF-8" />
<タイトル>全順列(非再帰このモジュロ) - Mengliaoソフトウェア</ TITLE>
</ HEAD>
<BODY>
/> <br <P>全順列(非再帰的にこの剰余)
Mengliaoソフトウェアメーカー-ボースンネットワーク株式会社の/> <br
2012年3月29日</ P>
<スクリプトタイプ=「テキスト/ JavaScriptを」>
/ *
完全な配列は、(モジュロ非再帰的)アルゴリズムである
要素1の数は、全体のストレージアレイの結果の結果を初期化するように構成され、元の配列等しい;
2、n個の要素の完全な配列、すなわち総数計算; N!
> 0は任意の整数サイクル= nの始まりであるから、3。! 回、1だけインクリメントされるたびに、インデックスと呼ばれる、
4、最下位1ビットのバイナリ表現を求めて、[0] ARR最初の要素を取って、それは1 Wのインデックスモジュラス値を見つけることであり、最初の要素(ARR [0 ])を挿入した結果の位置、及び反復インデックスのインデックスW \ 1。
挿入された結果の位置、およびインデックスW 5、すなわちwの係数インデックス値を見つけることであり、最下位ビットのバイナリ表現を求めて、[1] ARR第二の要素を取って2である、第二の要素([1] ARR)反復インデックス\ 2、
図6、挿入された結果の3番目の要素([2] ARR)の指数係数値W 3を求めて、3つの最下位ビットの16進表現、すなわちため、[2]最初の3つの要素のARRを取ります; W位置、及び反復インデックスのインデックス\ 3。
7、......。
最後の要素が[arr.length-1]、今回決定された配置ARR取られるまで8;
9、インデックスサイクルが完了し、全ての得られました配置。
例:
エレメント4見つける【は、「A」、「B」 、「C」、「D」] 完全な配列のは、任意の利用可能な4サイクル= 24、の合計は>サイクルが各蓄積の0 =整数指数を開始しました!終了インデックス+完了後輪23まで1、;
仮説指数= 13(または* 3 13 + 24、13 + 24、13 + 2 * 24 ...)、これが得られ、四つの要素の合計ので、そう反復4置換プロセスである:
第1の反復、13/1、市販= 13、= 0余り、第一要素は[「」]を得るために、0番目の位置(即ち、添字0)に挿入されるように、
2反復、13/2、市販= 6、余り= 1、第1の位置に第二の要素(すなわち、添え字1)は、[ "A"、 "B"を得た ];
第3の反復を、6第三の要素は、0番目の位置に挿入されるよう= 2/3、サプライヤー、余り= 0(すなわち、添え字0)、[ "C"、 "A"を与えるために 、 "B"を];
4反復2 / 4、市販= 0、2 =残り、
VARカウント= 0;
機能表示(ARR){
のdocument.write( "P <サブ>" + ++カウント+ "</サブ>:" + ARR + "<brの/>");
}
関数パーマ(ARR){
VAR結果=新しいアレイ(arr.length)。
VAR FAC = 1;
(; I <= arr.length; VAR I = 2 iが++)のための
FAC * = I;
用(インデックス= 0、インデックス<FAC;インデックス++){
VAR tは=インデックス;
用(i = 1; iが<= arr.length; iは++){
W VAR = Tの%I;
ため(J = - 1、J> W; j--)
結果[J] = [Jを- 1]を生じます。
結果= [W] ARR [I - 1]。
トン=数学。
}
(結果)を示します。
}
}
パーマ([ "E1"、 "E2"、 "E3"、 "E4"])。
</スクリプト>
</ BODY>
</ HTML>
上記のアルゴリズムのいくつかは、それが要素の様々なタイプに対応することができるので、例えば、など、バックトラックソート、配置された6つの位置であり、必ずしも数字や文字などの要素を配置する必要がありません。
ます。https://www.cnblogs.com/leftJS/p/11073294.htmlで再現