从给定数字中找到独特元素的最快方法

时间:2011-04-25 19:20:44

标签: algorithm optimization xor

我有n个号码。 n< = 1000000.每个数字都是正整数且小于10 ^ 9.

确定一次只会出现一个数字,休息时间会发生两次甚至多次。

我知道的最短解决方案是所有数字的XOR的结果。我想知道

  • 标准XOR解决方案的复杂程度如何。
  • 我们如何优化解决方案。

3 个答案:

答案 0 :(得分:3)

对所有数字进行异或将具有O(n)复杂度,因为您只需要访问每个元素一次。

考虑到您的要求,我想不出有任何方法可以进一步优化这一点。 XOR是一种非常便宜的操作,问题的本质要求您至少访问一次每个元素:否则,您无法知道哪个值是唯一的。

答案 1 :(得分:1)

XOR算法是正确的算法,也是最快的算法。缓慢的部分是您阅读输入的方式。

例如,C中的scanf比使用getchar(甚至更好getchar_unlocked)自己编号算法的速度要慢。关于你提到的SPOJ问题,我通过做出这个改变,从1.35s到0.14s有了改进。我确信在网站上获得最佳时间的剩余0.04只是因为比我的代码更好的低级别IO。

答案 2 :(得分:0)

你可以去散列。原始解决方案是使用唯一编号作为哈希表的键。如果可以,那么您可以使用散列算法。一个简单的例子是使用数字作为数组中的索引。现在,空间太大了(我的意思太多了),但可以进一步优化。