我刚刚在Cormen的算法书中读到,大O和大欧米茄不遵循三分法属性。这意味着对于f(n)
和g(n)
两个函数,可能是f(n) = O(g(n))
和f(n) = Omega(g(n))
都不成立。在示例中,他们认为如果函数是n^(1+sin n)
而不是可能。
虽然它是正确的,但在现实世界算法中,可能会有sin n
之类的运行时间。因为随着输入大小的增加,它有时会减少。有没有人知道任何这样的算法,或者可以提供一个小代码片段来做到这一点。
感谢您的答案,所以在这种情况下假设给定一个大小为n的问题P,如果它不能通过任何已知算法在O(f(n))时间内求解,那么下限是正确的P是欧米茄(f(n))。
答案 0 :(得分:15)
当搜索 的字符串变得更长时,Boyer-Moore字符串搜索算法变得更快。当然,限制因素通常是在中搜索的字符串的长度。
答案 1 :(得分:5)
随着条款与变量的比率增加,随机生成的3CNF条款的SAT平均运行时间最终会下降。直觉是当相对于变量数量有很多条款时,公式更可能“明显地”不可满足;也就是说,典型的SAT求解算法(比穷举搜索更好的一步或两步,但足够简单以涵盖本科逻辑课程)很快就会出现矛盾并停止。
当然,这些是对“随机”3CNF公式的一些概念的实验观察。我不确定人们已经证明了这一点。
答案 2 :(得分:3)
使用任何反函数。
f(x) -> 1 / x
f(x) -> 1 / x²
f(x) -> 1 / log(x)
随着输入x
的增长,结果值将变小。将较小的值与算法中较少数量的步骤相关联是相当简单的。只需在循环中使用计数器即可移向该数字。
这是一个简单的算法。
function(x) {
step = 0.001
y = 1 / x;
for (i = 0; i < y; i += step) { /* do something awesome here */ }
}
答案 3 :(得分:2)
我难以设想一个有意义的问题,降低复杂性。 “有意义”的问题需要阅读或触摸其所有输入的部分内容。除非输入以非常低效的方式编码,否则处理它应该花费越来越多的时间。
但是,它可能会朝着不变的方向增加。