Algorithm 运行时间:使用选择排序查找k个最小元素

Algorithm 运行时间:使用选择排序查找k个最小元素,algorithm,code-analysis,Algorithm,Code Analysis,我想答案是kn?但是当我试着画这棵树时,它看起来像 所以我一定是在更详细的分析中做错了什么?首先,你的工作列表有长度k+2,而它应该有长度k。我猜你的意思是从n到n-(k-1)=n-k+1 现在,如果你想对连续的数字求和,最简单的方法就是记住(或推导)公式 1 + 2 + ... + a = a(a+1)/2 用这个算出你想要的总数是 n(n+1)/2 - (n-k)(n-k+1)/2 = nk + (k-k^2)/2 正如你正确发现的。现在,想想大O。由于n>k,我们知道nk>k^2,所

我想答案是
kn
?但是当我试着画这棵树时,它看起来像


所以我一定是在更详细的分析中做错了什么?

首先,你的工作列表有长度
k+2
,而它应该有长度
k
。我猜你的意思是从
n
n-(k-1)=n-k+1

现在,如果你想对连续的数字求和,最简单的方法就是记住(或推导)公式

1 + 2 + ... + a = a(a+1)/2
用这个算出你想要的总数是

n(n+1)/2 - (n-k)(n-k+1)/2 = nk + (k-k^2)/2

正如你正确发现的。现在,想想大O。由于
n>k
,我们知道
nk>k^2
,所以后一个术语实际上是一个较低的术语,整个事情是
O(nk)

首先,你的工作列表有长度
k+2
,而它应该有长度
k
。我猜你的意思是从
n
n-(k-1)=n-k+1

现在,如果你想对连续的数字求和,最简单的方法就是记住(或推导)公式

1 + 2 + ... + a = a(a+1)/2
用这个算出你想要的总数是

n(n+1)/2 - (n-k)(n-k+1)/2 = nk + (k-k^2)/2
正如你正确发现的。现在,想想大O。因为
n>k
,我们知道
nk>k^2
,所以后一个术语实际上是一个较低的术语,整个事情就是
O(nk)