确定时间和空间中的特定数字(最坏的情况)


10

假定A[1..n]是整数,则对于所有1 \ le k \ le n均为0 \ le A [k] \ le m,并且每个出现除A [1 \ l点缀n]中的特定数字以外的数字是奇数。尝试查找出现为偶数的数字。0A[k]m1knA[1..n]

有一个Θ(nlogn)算法:我们将A [1 \ ldotd n]排序A[1..n]B[1..n],然后将B[1..n]分解成许多块,其元素值为相同,因此我们可以计算每个元素的出现。

我想找到最坏的情况O(n) -时间和O(n) -空间算法。

假设m=Ω(n1+ϵ)ϵ>0,那么基数排序是不可接受的。 二进制按位运算是可接受的,例如A[1]xorA[2]


Aryabhata在下面的回答表明一般情况不好,但是也许您还有其他限制?一个简单(但很大)的限制是强制数组中的所有条目的大小均为O(n)。这将给出一个非常简单的线性算法。
路加·马蒂森

1
@LukeMathieson:我删除了这个答案,因为我尚不相信所引用的论文可以进行任何修改,此外,OP似乎只对统一成本RAM模型感兴趣。
Aryabhata 2012年

@Aryabhata:呵呵,那答案就不存在了!出于有趣,也许对弗兰克(Frank)有用,您认为修改论文中的结果是什么问题?快速浏览表明它适用,但是我显然没有读懂它。
路加·马西森

@LukeMathieson:在当前问题中其他元素需要出现奇数次的事实。从那以后,我也略过了证明……
Aryabhata 2012年

如果您对理论结果或实际解决方案感兴趣,将非常有意思。从理论上讲,我的第一个快速响应是,您可以对整数列表进行排序的速度比快。Han有一种确定性算法,可以在时间中运行。对于随机算法,甚至可以得到更好的结果,例如Han和Thorup发现了预期时间算法。但是,我认为您的问题不需要排序。O(nlogn)O(loglogn)O(nloglogn)
A.Schulz

Answers:


2

这是一个简单算法的想法;仅计算所有事件!

  1. 查找。-时间m=maxAΘ(n)
  2. “分配”数组。-时间 ¹C[0..m]O(1)
  3. 每当您发现时,就对迭代并将加1 。如果为,则将添加到线性列表。-时间AC[x]A[_]=xC[x]0xLΘ(n)
  4. 遍历并找到具有的元素。-时间。LxeC[xe]O(n)
  5. 返回。xe

总而言之,这为您提供了一个线性时间算法,该算法可能会使用(就分配而言)大量内存。请注意,在这里,独立于能够在恒定时间内随机访问至关重要。Cm

用这种方法在空间上附加一个更加困难。我不知道任何提供时间查找的字典数据结构。您可以使用哈希表,这里的实现具有预期的查找时间(为表的大小,为存储元素的数量),因此您可以随心所欲地获得线性空间,这是期望的。如果所有值都映射到相同的哈希值,那么您就搞砸了。O(n)O(1)O(1+k/n) nkA


  1. 在RAM上,这是隐式完成的。我们需要的只是开始位置,也许是结束位置。

0

一个几乎平凡的解决方案(使用空间)是使用哈希映射。回想一下,哈希映射已摊销了运行时来添加和查找元素。Θ(n)O(1)

因此,我们可以使用以下算法:

  1. 分配一个散列图。遍历。对于每个元素,增加出现的次数,即。HAiAH(i)++

  2. 遍历哈希映射的键集,并检查哪个键的出现次数均匀。

现在,这是一个简单的算法,实际上并没有使用任何大技巧,但有时即使足够也可以。如果没有,您可能想要指定您施加的空间限制。


我仍然想知道,是否存在使用多项式空间的非随机时间算法。特别是,是否有任何理论证据证​​明找到唯一的偶数项比找到唯一的奇数项难?O(n)
A.Schulz

@ A.Schulz我认为这是使用哈希表的预期时间算法。我记得有人告诉我一个算法(或者对于某些特殊情况,例如,奇数= 1和偶数= 2)可能带有堆栈,但是我不记得了。O(n)O(n)
Yai0Phah

并非每个哈希表实现都具有此属性。通常,查找不是,甚至没有摊销(afaik)。实际上,先前的讨论并未产生任何具有恒定时间查找的实现。你可以说得更详细点吗?O(1)
拉斐尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.