Kon*_*lph 308
这个问题并不像看起来那么愚蠢.至少在理论上,当我们采用Big O符号的数学定义时,诸如O(1/n)之类的东西是完全合理的:
现在你可以很容易地用g(x)代替1/x ......显然上面的定义仍然适用于某些f.
为了估计渐近运行时增长,这是不太可行的......随着输入的增长,有意义的算法不能更快.当然,您可以构建一个任意算法来实现这一点,例如:
def get_faster(list):
how_long = (1 / len(list)) * 100000
sleep(how_long)
Run Code Online (Sandbox Code Playgroud)
显然,这个函数在输入大小增加时花费的时间更少......至少在某些限制之前,由硬件强制执行(数字的精确度,sleep
可以等待的最短时间,处理参数的时间等):这个限制将是一个因此,上面的函数仍然具有运行时O(1).
但是,是实际上真实世界的算法在运行时可以减少(至少部分地)输入大小增加时.请注意,这些算法不会表现出低于O(1)的运行时行为.他们仍然很有趣.例如,采用Horspool的非常简单的文本搜索算法.这里,随着搜索模式的长度增加,预期的运行时间将减少(但是,草堆的长度将再次增加运行时间).
Tob*_*ias 134
是.
只有一种算法具有运行时O(1/n),即"空"算法.
对于算法为O(1/n)意味着它以比由单个指令组成的算法更少的步骤渐近地执行.如果它对所有n> n0执行的步骤少于一步,那么对于那些n,它必须完全没有指令.由于检查'if n> n0'至少花费1条指令,因此它必须不包含所有n的指令.
总结:唯一的算法是O(1/n)是空算法,由无指令组成.
sha*_*oth 24
那是不可能的.Big-O的定义不仅仅是不平等:
A(n) = O(B(n))
<=>
exists constants C and n0, C > 0, n0 > 0 such that
for all n > n0, A(n) <= C * B(n)
Run Code Online (Sandbox Code Playgroud)
所以B(n)实际上是最大值,因此如果它随着n增加而减小,则估计不会改变.
Adr*_*ian 23
sharptooth是正确的,O(1)是最好的表现.但是,它并不意味着快速解决方案,只是一个固定的时间解决方案.
一个有趣的变体,也许真正建议的是,随着人口的增长,哪些问题变得更容易.我可以想到1,虽然是做作和诙谐的回答:
一组中的任何两个人都有同一个生日?当n超过365时,返回true.虽然小于365,但这是O(n ln n).也许不是一个很好的答案,因为问题不会慢慢变得容易,但只要在n> 365时变为O(1).
nop*_*ole 15
从我之前学习的大O符号开始,即使你需要1步(比如检查一个变量,做一个赋值),那就是O(1).
注意,O(1)与O(6)相同,因为"常数"无关紧要.这就是我们说O(n)与O(3n)相同的原因.
因此,如果您甚至需要一步,那就是O(1)......并且因为您的程序至少需要1步,所以算法的最小值可以是O(1).除非我们不这样做,否则它是O(0),我想?如果我们做任何事情,那么它是O(1),这是它可以达到的最小值.
(如果我们选择不这样做,那么它可能成为一个禅或道问题......在编程领域,O(1)仍然是最小的).
或者这个怎么样:
程序员:老板,我在O(1)时间找到了办法!
老板:没必要,我们今天早上破产了.
程序员:哦,那么,它变成O(0).
不,这是不可能的:
由于n在1/n中倾向于无穷大,我们最终实现1 /(inf),实际上是0.
因此,问题的大哦类别是具有大量n的O(0),但是具有低n的接近恒定时间.这是不明智的,因为唯一可以在比常数更快的时间内完成的事情是:
void nothing() {};
甚至这是有争议的!
只要你执行一个命令,你至少在O(1),所以不,我们不能有一个大哦级O(1/N)的!
怎么没有运行该功能(NOOP)?或使用固定值.这算数了吗?
我经常使用O(1/n)来描述随着输入变大而变小的概率 - 例如,在log2(n)翻转时公平硬币出现的概率是O(1/n).
小智 6
O(1)仅表示"恒定时间".
当您将一个早期退出添加到循环[1]时,您(以大O表示法)将O(1)算法转换为O(n),但使其更快.
诀窍通常是恒定时间算法是最好的,线性比指数更好,但对于少量的n,指数算法实际上可能更快.
1:假设此示例的静态列表长度
我相信量子算法可以通过叠加"一次"进行多次计算......
我怀疑这是一个有用的答案.
小智 5
对于那些阅读此问题并希望了解对话内容的人来说,这可能有所帮助:
| |constant |logarithmic |linear| N-log-N |quadratic| cubic | exponential |
| n | O(1) | O(log n) | O(n) |O(n log n)| O(n^2) | O(n^3) | O(2^n) |
| 1 | 1 | 1 | 1| 1| 1| 1 | 2 |
| 2 | 1 | 1 | 2| 2| 4| 8 | 4 |
| 4 | 1 | 2 | 4| 8| 16| 64 | 16 |
| 8 | 1 | 3 | 8| 24| 64| 512 | 256 |
| 16 | 1 | 4 | 16| 64| 256| 4,096 | 65536 |
| 32 | 1 | 5 | 32| 160| 1,024| 32,768 | 4,294,967,296 |
| 64 | 1 | 6 | 64| 384| 4,069| 262,144 | 1.8 x 10^19 |
Run Code Online (Sandbox Code Playgroud)