不同的数字计数

时间:2013-03-12 13:16:03

标签: algorithm count distinct digit

是否可以在恒定时间O(1)计算数字中的不同数字?

假设n=1519输出应为3,因为有3个不同的数字(1,5,9)

我已经在O(N)时间内完成了,但有人知道如何在O(1)时间找到它吗?

2 个答案:

答案 0 :(得分:6)

我认为Nn的位数。如果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)。