我在考试前得到了一份练习清单,但他们没有评分为什么我没有将它们标记为作业。
该算法采用数组
鉴于此算法:
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次的数字。
谢谢你们
答案 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)对吗?
是的,你是对的。对于从j
到i
的每个|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))。