私は24の一般化バージョンを解決するプログラムを書いた(興味がある人はlink)。つまり、n
の数値が与えられた場合、ターゲット番号を計算するようにバイナリ演算を実行する方法があります。次の字句の「置換」アルゴリズム
は、これを行うために、私は'v'
値のためのプレースホルダであると'o'
を操作するためのプレースホルダである'v'
又は'o'
、のいずれかからなるchar配列として可能な表現を見ました。 n
の値がある場合、操作はn-1
である必要があります。
どのようにプログラムが現在動作しているのかは、{'o','o',...,'v',v'...}
のすべての順列を辞書順にチェックし、接頭辞の式が有効かどうかを調べます。たとえば、ときn = 4
、以下の式が有効であると考えています
{‘o’, ‘v’, ‘o’, ‘v’, ‘o’, ‘v’, ‘v’}
次の式
{‘o’,’o’,’o’,’v’,’v’,’v’,’v’}
が有効ではありません。
{‘v’,’o’,’v’,’o’,’o’,’v’,’v’}
{‘o’,’o’,’v’,’v’,’v’,’o’,’v’}
私の質問はありませんです効率的なアルゴリズムが存在します何らかの並べ替えで有効な次の順列?目的は、式がすべての置換に対して有効かどうかを確認する必要をなくすことです。
さらに、このようなアルゴリズムが存在する場合、有効な順列をk
で計算する時間が存在しますか?私はこれまで
私は、唯一0<=i<2n-1
(サブアレーがi
から始まる各A[i:2n-1)
ため
number of operations < number of values
かの場合は、長さ2n-1
のプレフィックス表現A
が有効であると考えられるという仮説を立ててい何
終了時(非包含的)で2n-1
)
さらに、tha正確に(1/n)C(2n-2,n-1)
の有効な順列があり、C(n,k)
がn choose k
であることを意味します。
問題はNP-Completeの匂いがします。唯一のバイナリ演算が加算である場合、これは部分集合和問題と同じです。おそらく、ブランチとバインドされたアプローチの1つが該当します。最悪の場合、おそらく多項式時間の解を決定することはできません。 – AndyG
[指定された文字列の次の大きい順列を見つけるアルゴリズム]の可能な複製(http://stackoverflow.com/questions/1622532/algorithm-to-find-next-greater-permutation-of-a-given-string) – Pikalek
'{'o'、 'o'、 'v'、 'v'、 'v'、 'v'}'は有効な中置式ですか?接頭辞の表記を意味しますか? – AndyG