降低数组中最大重复元素的复杂性

时间:2016-03-29 14:00:16

标签: arrays algorithm time-complexity

我在考试前得到了一份练习清单,但他们没有评分为什么我没有将它们标记为作业。

该算法采用数组

鉴于此算法:

         Algo-X(A)
                i=1 
                j=1  
                m=0 
                c=0
                while i ≤ |A|
                    if A[i] == A[j]
                        c=c+1 
                    j=j+1
                    if j > |A|
                        if c > m
                           m=c 
                        c=0
                        i=i+1
                        j=i 
                return m

问题1:分析Algo-X的复杂性。

问题2:编写一个与Algo-X完全相同的算法,但严格要求更好 渐近时间复杂度。

现在,这个时间复杂度是O(n ^ 2)对吗?

算法本身从我理解的搜索数组内部并返回数组内最大重复数的数字。

如何降低复杂性?

我不能假设存在N / 2次的数字。

谢谢你们

2 个答案:

答案 0 :(得分:2)

这个问题很容易在线性时间和线性空间中解决 - 例如。通过使用哈希表。这是一个伪代码:

HashTable<Integer, Integer> H = new HashTable<Integer,Integer>();
int res = 0;
for (int i = 0; i < A.length; ++i) {
    if (H.contains(A[i])) { H[A[i]] = 1; }
    else { H[A[i]] += 1; res = Math.max(H[A[i]], res); }
}

return res

它也可以在O(n log n)时间内解决(如果O(n)中的数字足够相似,甚至在A时间内也可以通过排序然后扫描数组来O(1)空间解决

sort(A)
i = j = 0;
res = 0;
while i < |A| do
    j = i+1
    while j < |A| && A[i] == A[j] do
        j = j+1
    done
    res = max(res, j-i+1)
    i = j
done
// Separately handle the case when |A|=1
if |A| = 1 then
    res  = 1
end
return res

更好的是,如果A中元素的最大差异为|A|,则可以使用counting sort(或其他integer sorting algorithm在线性时间内对A进行排序}})。然后算法以线性时间运行。

答案 1 :(得分:2)

  

现在,这个时间复杂度是O(n ^ 2)对吗?

是的,你是对的。对于从ji的每个|A|i将遍历从1|A|的所有元素。

Σ i = 1 .. | A | Σ j = i .. | A | (j)= O(| A | 2 )= O(n 2 )。

  

如何降低复杂性?

您可以先对初始数组进行排序。然后所有相等的数字将顺序发生。你只需寻找最长的相等元素组。

sort(A)
m = 1
c = 1
i = 2
while i ≤ |A|
    if A[i] == A[i - 1]
        c = c + 1
    else 
        c = 1
    if c > m
        m = c
    i = i + 1

时间复杂度为O(n * log(n))用于排序,O(n)用于处理排序数组。总时间复杂度为O(n * log(n))。