求无序数组中的最小K个数,用划分的方法,时间复杂度为什么是O(n)

hope2reality 2015-08-12 08:20:01
见《剑指offer》167页。

void GetLeastNumbers(int* input, int n, int* output, int k)
{
if (input == NULL || output == NULL || k > n || n <= 0 || k <= 0)
return;
int start = 0;
int end = n - 1;
int index = Partition(input, n, start, end);
while (index != k - 1)
{
if (index > k - 1)
{
end = index - 1;
index = Partition(input, n, start, end);
}
else
{
start = index + 1;
index = Partition(input, n, start, end);
}
}
for (int i = 0; i < k; ++i)
output[i] = input[i];
}

时间复杂度为什么是O(n) ?
...全文
783 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ri_aje 2015-08-13
  • 打赏
  • 举报
回复
因为每次递归只进入一边,所以复杂度是 O(n).
hope2reality 2015-08-13
  • 打赏
  • 举报
回复
引用 3 楼 ri_aje 的回复:
因为每次递归只进入一边,所以复杂度是 O(n).
恩,是这个道理。在回复别人的时候突然想通了,快排是必须要向下递归的,而上面这个并不需要递归,而是类似折半。 1+1/2+1/4+1/8+...<2 ,o(2n)=o(n),所以时间复杂度是o(n)。 欧了。谢谢大神!
hope2reality 2015-08-13
  • 打赏
  • 举报
回复
引用 5 楼 fly_dragon_fly 的回复:
象是select 算法, 记忆中应该是期望时间是O(n), 有兴趣翻一下 CLRS顺序统计量那章,上面有证明
这是快排中的划分方法。快排必须递归到logn层,而求最小k个数可能只需要划分几次就找到index了。
hope2reality 2015-08-13
  • 打赏
  • 举报
回复
引用 1 楼 Evankaka 的回复:
这个是使用计数排序的吧?不过,用堆来做个人感觉更常见上些
不是计数排序,是用了快排中的划分方法。堆方法适合处理海量数据,性能确实比较好,时间复杂度为o(nlogk)。我现在想知道为什么划分这种方法时间复杂度是o(n) ?
fly_dragon_fly 2015-08-13
  • 打赏
  • 举报
回复
象是select 算法, 记忆中应该是期望时间是O(n), 有兴趣翻一下 CLRS顺序统计量那章,上面有证明
hope2reality 2015-08-13
  • 打赏
  • 举报
回复
引用 2 楼 GKatHere 的回复:
假设 Partition(input, n, start, end); 为 index++; 那么 for(int index = 0; index < k; index++) ;的时间复杂度为多少?
每次 Partition都要扫描一次数组,按照你这种说法时间复杂度就是o(nk)了
fly_dragon_fly 2015-08-13
  • 打赏
  • 举报
回复
引用 7 楼 gk405128494 的回复:
[quote=引用 5 楼 fly_dragon_fly 的回复:] 象是select 算法, 记忆中应该是期望时间是O(n), 有兴趣翻一下 CLRS顺序统计量那章,上面有证明
这是快排中的划分方法。快排必须递归到logn层,而求最小k个数可能只需要划分几次就找到index了。[/quote]part具有随机性,不可能完成折半,也就只有期望时间,
GKatHere 2015-08-12
  • 打赏
  • 举报
回复
假设 Partition(input, n, start, end); 为 index++; 那么 for(int index = 0; index < k; index++) ;的时间复杂度为多少?
Evankaka 2015-08-12
  • 打赏
  • 举报
回复
这个是使用计数排序的吧?不过,用堆来做个人感觉更常见上些

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧