【发布时间】:2011-10-05 10:30:06
【问题描述】:
这个问题的灵感来自我昨天正在研究的一个答案。
假设我们有 N 个输入,其评估结果为真或假, 确定这些输入中的 X 是否是最有效的方法是什么 真的?
注意事项:
- 输入不在数组中,因此如果将它们转换为数组,请考虑任何间接费用。
- “最有效”是指最佳平均情况(尽管我也希望看到最佳和最差情况的统计数据)。
这是我昨天遇到的两种方法。
1) 将变量视为电路的布尔输入,并使用 K-map 减少它们
起初我认为这将是最有效的方法,因为它遵循电路逻辑,但我肯定有其他想法。随着输入数量的增加,比较的数量呈指数增长
2 inputs:
1 of 2: if(1 OR 2)
2 of 2: if(1 AND 2)
3 inputs:
1 of 3: if(1 OR 2 OR 3)
2 of 3: if((1 AND 2) OR (1 AND 3) OR (2 AND 3))
3 of 3: if(1 AND 2 AND 3)
4 inputs:
1 of 4: if(1 OR 2 OR 3 OR 4)
2 of 4: if((1 AND 2) OR (1 AND 3) OR (1 AND 4) OR (2 AND 3) OR (2 AND 4) OR (3 AND 4))
3 of 4: if((1 AND 2 AND 3) OR (1 AND 2 AND 4) OR (1 AND 3 AND 4) OR (2 AND 3 AND 4))
4 of 4: if(1 AND 2 AND 3 AND 4)
... etc. ...
最好的情况很好(O(1)),但最坏的情况远比......
2) 计数器和顺序 if 语句
这总是在O(n) 时间执行,这没关系,但我希望有更好的最佳情况。
counter = 0
if(input 1)
counter++
if(input 2)
counter++
if(input 3)
counter++
... etc. ...
if(counter >= X)
// true
还有什么比这两种方法更有效的解决方案?
【问题讨论】:
-
如果有人感兴趣的话,启发这个问题的问题:stackoverflow.com/q/6687557/385913
-
“输入不在数组中,因此如果将它们转换为数组,请考虑任何间接成本。” 那么......它们是什么形式的?当然,它们并不都是命名变量。如果它们是只能一个一个访问的I/O端口,那可能比其他任何东西都更昂贵,并且计数是唯一的方法。如果它们被打包在一个变量中,就会出现一个选项世界。
-
在启发我发帖的问题中,它们都被命名为变量,但我希望看到使用包含位的变量的答案。
-
[计算 32 位整数中设置位数的最佳算法?][1]。 [1]:stackoverflow.com/questions/109023/…
-
问题是最好的情况
omega(n)。证明:每个解决方案都是omega(X),因为X是O(n),所以没有解决方案比最佳情况omega(n)更快。因此平均运行时间为omega(n)。我们得出结论,简单的计数器解决方案是最优的。
标签: algorithm language-agnostic performance