変数を代入することによる一意の出力の数


9

次のような一連の数式があるとします。

bacb
bcab
cbba
abbc

すべての数式で各変数が「0」または「1」に置き換えられたときに取得できる一意の結果の数を見つけるアルゴリズムを提供します。

変数と項(k!)^2を含む式があります。の面であなたの漸近を表現します。2k-1k^2k

最速のアルゴリズムが優先されます。引き分けの場合、漸近的なメモリ使用量の少ないソリューションが優先されます。それでも同点の場合は、最初の投稿が優先されます。


上記の例では、変数を代入することで次の結果を取得できます。

1110, 0110, 1001, 0100, 1000, 0000, 0010, 1101, 1111, 0001, 1011, 0111

正解は12です。とりわけ1010、上記の数式では計算できません。

私はそれぞれのソリューションを、3つのテストケースを作った23012076および1446672


明確化:質問のkは何ですか?それは単なる抽象的な定数ですか?
isaacg 2015

@isaacgはい。これは、たとえば、数式の数が少ないが大きい場合に、より高速なソリューション間の結びつきを防ぐためです。
orlp 2015

したがって、各文字ab ...ある変数?そして、私たちは常に不均一な数の変数しか持っていませんか?変数のシーケンスの長さと、与えられた式の数は関係ありませんか?
flawr

@flawr変数の数、項の数、式の数の間の正確な関係が質問に示されています。
orlp 2015

「できる」は、最大 $(k!)^ 2 $を獲得できることを意味しますかの式または存在し、正確に $(K!)^ 2つの$の式を?それ以外に、それらの仕様を持つアルゴリズムのアプリケーションはありますか?仕様がかなり恣意的であるように思われるので、私はただ尋ねています。
flawr

回答:


2

Mathematica、O(k ^ 2(k!)^ 2)時間

Length[Union@@(Fold[Flatten[{StringReplace[#,#2->"0"],StringReplace[#,#2->"1"]}]&,#,Union[Characters[#]]]&/@#)]&

うまくいけば、時間の複雑さを正しく計算できました。入力は、などの数式のリストです{"bacb","bcab","cbba","abbc"}。私のマシンのすべてのテストケースで30秒未満で実行されますが、絶対的な時間を気にしているのは誰ですか?

説明:

  • 最初&に、最後のatは#、最初の引数を参照し#2たり、2番目の引数であったりするなど、純粋な関数にします。
  • Length[*..*] その中に含まれているリストの長さを取ります。
  • Union@@(*..*)含まれているリストを受け取り、それをの引数として提供Unionします。これにより、任意の引数の一意の要素のリストが返されます。
  • *..*&/@#純粋な機能を取り、それはので、式のリストの上にマッピングし{a,b,c}なり{f[a],f[b],f[c]}。ネストされた純粋な関数で#nは、最も内側の引数を指すことに注意してください。
  • Fold[*..*&,#,*..*]アキュムレータ関数、開始値、リストを取り、を返しますf[f[...[f[starting value,l_1],l_2],...],l_n]
  • Union[Characters[#]] 現在の数式のすべての文字を受け取り、すべての一意の要素を取得して、変数を提供します。
  • Flatten[*..*]引数を平坦化するので、に{{{a},b},{{c,{d}}}}なり{a,b,c,d}ます。
  • {*..*,*..*}は、上記を使用して2つの結果を組み合わせる方法Flattenです。
  • StringReplace[#,#2->"0/1"]以前の結果を取得し、現在の変数を0またはで置き換えて返します1

なぜあなたkはあなたの時間の変数として使用していますか?それでも、階乗の時間!ふew!
theonlygusti 2015

opは言った:「あなたの漸近線をの観点から表現してくださいk。」また、GeneralUtilities`Benchmark使用する方法ごとにaを実行する必要がありました。
LegionMammal978 2015

アルゴリズムのわかりやすい英語の説明を追加しますか?私はMathematicaに慣れていないので、あなたのソリューションを検証できません。
orlp 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.