我们可以在O(n)
时间内找到数组的模式,而不使用额外的O(n)
空格,也不能使用哈希。而且数据没有排序?
答案 0 :(得分:1)
问题并不容易Element distinctness problem 1 - 所以基本上没有额外的空间 - 问题的复杂性最多是Theta(nlogn)
(因为它可以在{{ {1}} - 情况不明确。)
基本上 - 如果你不能为哈希表使用额外的空间,最好是排序和迭代,即Theta(nlogn)
。
(1)给定一个在Theta(nlogn)
中运行的算法A来解决这个问题,很容易看出一个人可以运行A,然后通过额外的迭代验证结果元素重复多次,以解决O(f(n))
中的元素清晰度问题。
答案 1 :(得分:1)
在适当的情况下,是的。例如,如果您的数据适合基数排序,那么您可以在线性时间内仅使用恒定的额外空间进行排序,然后通过排序数据进行线性扫描以找到模式。
如果您的数据需要基于比较的排序,那么我非常确定O(N log N)与您在一般情况下可以做的一样。
答案 2 :(得分:0)
只计算频率。这不是O(n)
空格,而是O(k)
,其中k是范围内不同值的数量。这实际上是恒定的空间。
时间显然是线性O(n)
//init
counts = array[k]
for i = 0 to k
counts[i] = 0
maxCnt = 0
maxVal = vals[0]
for val in vals
counts[val]++
if (counts[val] > maxCnt)
maxCnt = counts[val]
maxVal = val
这里的主要问题是,虽然k可能是常数,但也可能非常巨大。但是,k也可能很小。无论如何,即使不切实际,这也能正确回答你的问题。