はすべて順列14個の控えめな値のリストのを反復処理されます。
一般的に、慎重なもののリストのすべての順列を訪問するには、リストの各要素を参照します。各要素について、元のリストの他の要素をすべて含む新しいリストを作成します。 のすべての順列をリストに追加し、それぞれに要素を追加すると、その特定の要素で始まる元のリストのすべての順列が得られます。あなたがすべての要素を完了したら、あなたは完了です。
リスト内の1つの要素を含むリストのすべての順列を見つけることは、もちろん単純な作業です。どのようなことがないことは、再帰的に私は、上記の操作を行っている
function forEachPermutation(list, operation) {
function pluckElement(list, index) {
var e = list[index];
var l = [];
for (var i = 0; i < list.length; ++i)
if (i !== index) l.push(list[i]);
return { element: e, remainder: l };
}
function permute(partial, remainder) {
if (remainder.length === 0)
operation(partial);
else {
for (var i = 0; i < remainder.length; ++i) {
var plucked = pluckElement(remainder, i);
partial.push(plucked.element);
permute(partial, plucked.remainder);
partial.length--;
}
}
}
permute([], list);
}
:
したがって、私たちが持っていることは、このようなものです。 "pluckElement"関数はリストから要素を返し、はそのリストのを返します。 "permute"関数は、元のリストの完全な順列に渡された操作を実行するか(残ったリストが空であることに気づいたとき)、またはそれが渡されたリストの各要素を使って再帰的に自身を呼び出します。
は、その機能を使用するには、あなただけのこの操作を行うと思います。
forEachPermutation([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], check);
編集 —を使用すると、元のリストから値のみ一定数を摘採したい場合は、上記に持っています変更される;ちょっと待って。
OK - 14個の要素のリストを渡したいが、14個の別個のリスト(たとえば7個)ごとに "operation"関数が呼び出されるようにするには、次のように関数を変更することができます。外側の "forEachPermutation"関数は、追加の "len"パラメータを取り、必要な文字列の長さを指示します。次に、 "permute"関数は、空の剰余をチェックするのではなく、 "partial.length"がそのターゲット長であるかどうかをチェックします。
function forEachPermutation(list, len, operation) {
function pluckElement(list, index) {
var e = list[index];
var l = [];
for (var i = 0; i < list.length; ++i)
if (i !== index) l.push(list[i]);
return { element: e, remainder: l };
}
function permute(partial, remainder) {
if (partial.length === len)
operation(partial);
else {
for (var i = 0; i < remainder.length; ++i) {
var plucked = pluckElement(remainder, i);
partial.push(plucked.element);
permute(partial, plucked.remainder);
partial.length--;
}
}
}
permute([], list);
}
と「操作」機能は、それぞれ1を処理した後、何らかの理由であなたが保存順列にしたい場合は、我々はその後、別の編集 —
forEachPermutation([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], 7, check);
とそれを呼びたいです使用されている部分配列が上書きされるという事実を考慮する必要があります。 「操作」への呼び出しを変更することができます:「操作」の各呼び出しは、使用するその非常に自身の配列を取得するように、「部分的」配列のコピーを作成します
if (partial.length === len)
operation(partial.slice(0));
を。もちろん、それはプロセスを遅くします。
何らかの理由で私はB +ツリーを考えています。 http://en.wikipedia.org/wiki/B%2B_treeでも、私にどのように質問していません。私はちょうど "パイプ"と "ファンアウト/ファンイン"処理を覚えています – mplungjan
検証結果(例えばIDに基づいて)をどこかに保存することは可能ですか?可能であれば、一度チェックしてその組み合わせが有効かどうかを確認することができます。 –