我们可以在O(n)时间内在未排序的数组中找到没有散列映射的数组模式

时间:2012-12-02 19:31:16

标签: arrays algorithm mode

我们可以在O(n)时间内找到数组的模式,而不使用额外的O(n)空格,也不能使用哈希。而且数据没有排序?

3 个答案:

答案 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也可能很小。无论如何,即使不切实际,这也能正确回答你的问题。