是否可以在恒定时间O(1)
计算数字中的不同数字?
假设n=1519
输出应为3
,因为有3
个不同的数字(1,5,9)
。
我已经在O(N)
时间内完成了,但有人知道如何在O(1)
时间找到它吗?
答案 0 :(得分:6)
我认为N
是n
的位数。如果n
的大小不受限制,则在O(1)时间内无法完成 。
考虑数字n=11111...111
,数字为2万亿。如果我将其中一个数字从1
切换到2
,则无法以某种方式查看每个数字。因此,处理具有2万亿个数字的数字必须至少采用2万亿次运算(大约),并且通常,具有N
个数字的数字必须采用({1}}个N
运算的顺序至少
然而,对于几乎所有数字,简单的O(N)
算法很快就会完成,因为只要你得到10个不同的数字就可以停止。几乎所有足够长度的数字都将具有全部10位数:例如在查看前100个数字后,没有以答案“10”结束的概率约为0.00027,而在前1000个数字之后,概率约为1.7e-45。但不幸的是,有一些奇怪的事情导致了最坏的情况O(N)
。
答案 1 :(得分:2)
在看到有人真的对这个问题发表了严肃的回答之后,我宁愿在这里重复我自己的作弊,这是@SimonNickerson所描述答案的一个特例:
O(1)是不可能的,除非你在基数2上,因为这样,0以外的每个数字都有1和0,因此我的“解决方案”不仅适用于整数......
修改强>
2 ^ k - 1怎么样?这不是全1吗?
讨厌鬼!真的......我应该知道,当事情看起来如此简单时,它就会以某种方式存在缺陷......如果我覆盖了所有0个案例,我也应该覆盖所有1个案例。
幸运的是,这种情况可以非常快速地进行测试(如果加法和按位AND被认为是O(1)操作):如果x是要测试的数字,则用这种方式计算:y=(x+1) AND x
。如果是y=0
,那么x=2^k - 1
。因为这是唯一需要通过添加来翻转所有位的情况。当然,这有点存在缺陷,因为比特长度超过总线宽度,按位运算符不再是O(1),而是O(N)。
同时,我认为它可以降低到O(logN),将数字分成总线宽度大小的块,并将相邻的数据进行AND运算,重复直到只留下一个:如果有的话在测试的数量中没有0,最后一个也将满1秒......
EDIT2 :我错了......这仍 O(N)。