对于作业,我必须从理论上分析两种算法(排序)的复杂性以进行比较。然后我将实施它们并尝试凭经验确认效率。
鉴于此,我分析了两种算法并且我知道效率等级,但是我在识别基本操作时遇到了问题。有一个暗示我们在选择基本操作时应该小心,因为它应该适用于这两种算法。我的问题是我真的不知道为什么我应该为这两种算法采用相同的基本操作。
伪代码
Algo1:
//sorts given array A[0..n-1]
for i=0 to n-2
min <- i
for j <- i+1 to n-1
if A[j] < A[min] min <- j
swap A[i] and A[min]
效率:Theta(n ^ 2)
ALGO2:
//sorts given array with limited range (u,l)
for j = 0 to u-l D[j] = 0
for i = 0 to n-1
D[A[i]-l] = D[A[i]-l]+1
for j=1 to u-l D[j] = D[j-1]+D[j]
for i=n-1 to 0
j = A[i]-l
S[D[j]-1] = A[i]
D[j] = D[j]-1
return S
效率Levitin - &gt; Theta(n),Johnsonbaugh - &gt; Theta(n + m)m:数组中可区分的整数
所以我的理解是我选择最常出现的操作作为基本操作,当我为每种算法选择不同的基本操作时,我不明白为什么会有差异。最后它无关紧要,因为它无论如何都会导致相同的效率等级,但可能对实证分析很重要(比较不同输入尺寸所需的基本操作次数)?
我现在打算做的是选择作为基本操作,在Algo1中执行5次,在Algo 2中执行6次(当然取决于循环)。这种方法有不利之处吗?
答案 0 :(得分:1)
“基本操作”的典型选择是查看比较次数或交换次数。
考虑一个具有内存层次结构的系统,其中“热”项目在缓存中,“冷”项目导致L2-miss后跟RAM引用,或者导致磁盘I / O.然后,缓存命中成本可能基本为零,基本操作归结为缓存未命中的成本,从而导致时间复杂度的新表达。
按顺序排列的列表排序more often than you might think。稳定排序可能比不稳定排序更加缓存友好。如果很容易推断排序的比较顺序如何与缓存驱逐进行交互,那么可以对其预期的运行时间进行良好的大O描述。
编辑:“阅读A []的元素”似乎是一个公平的操作。 Fancier分析将查看有多少“A []”操作的“缓存未命中”。