替代变量的唯一输出数


9

给定一组这样的公式:

bacb
bcab
cbba
abbc

给出一种算法,该算法可以找到在每个公式中用每个变量替换“ 0”或“ 1”时可获得的唯一结果的数量。

(k!)^2公式,每个公式都有2k-1变量和k^2术语。用表示你的渐近性k

最快的算法获胜。如果出现平局,则使用渐近内存使用率较低的解决方案为准。如果那仍然是平局,则第一帖获胜。


对于上述示例,通过替换变量可以获得以下结果:

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

因此正确的答案是12。除其他外,1010不能使用上述公式得出。

我做了三个试验的情况下,与相应的解决方案,230120761446672


澄清:问题中的k是什么?只是一些抽象常数吗?
isaacg 2015年

@isaacg是的。例如,这是为了防止对于较小但较大的公式而言更快的解决方案之间的联系。
orlp 2015年

那么,每个字母a,,b...是一个变量吗?而且我们总是只有数量不均匀的变量吗?变量序列有多长时间以及给出多少个公式都没关系吗?
瑕疵的

@flawr在问题中给出了变量数,项数和公式数之间的确切关系。
orlp 2015年

是否'可以'的意思是,你可以得到高达 $(K!)^ 2个$ 公式还是有确切 $(K!)^ 2 $公式?除此之外,您是否对具有这些规范的算法有任何应用?我只是问,因为规格似乎很随意。
瑕疵

Answers:


2

Mathematica,O(k ^ 2(k!)^ 2)时间

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

希望我能正确计算时间复杂度。输入是公式列表,例如{"bacb","bcab","cbba","abbc"}。我的机器上的每个测试用例都可以在30秒内运行,但是谁在乎绝对时间呢?

说明:

  • 首先&,通过#引用第一个参数,#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}
  • {*..*,*..*}只是使用上述方法将两个结果组合在一起的一种简单方法Flatten
  • StringReplace[#,#2->"0/1"]取得先前的结果,并将其返回,并用0或替换当前变量1

为什么k在您的时间将其用作变量?尽管如此,析因时间!!
theonlygusti 2015年

操作者说:“用表示您的渐近性k。” 另外,我必须为使用GeneralUtilities`Benchmark的每种方法都做一个。
LegionMammal978

想要为您的算法添加一个简单的英语描述吗?我不熟悉Mathematica,所以无法验证您的解决方案。
orlp 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.