高手请进,从n个数中取m个数,什么样的算法时间复杂度最小(不关心空间复杂度)??

THE3EYE 2009-04-02 10:32:12
第一种情况,从n个数中取m个数
第一个周期
第一次从n个数中取出最大的;
第二次从n-1个数中取出第二大的;
……
直到取出m个为止

第二个周期,n个数全部随机变化,
第一次从n个数中取出最大的;
第二次从n-1个数中取出第二大的;
……
直到取出m个为止

……

依次这么循环,什么样的算法时间复杂度最小(不关心空间复杂度)??

第二种情况,从n个数中取m个数

在第一种情况的基础上,每个周期只要取出了m个最大的数就行,不管顺序(即不管第一次取出的是不是最大的数)
...全文
789 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
spirit_sheng 2009-04-05
  • 打赏
  • 举报
回复
严格来说, 应当是O(n*m)
yezeguo 2009-04-05
  • 打赏
  • 举报
回复
关注中,感觉没什么技术含量
THE3EYE 2009-04-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dlyme 的回复:]
在n个数中取第m大元素,有O(n)线性时间的办法。
这样我们可以:
1)先找出第m大的元素,以此为基准找出最大的前m个数——需要O(n);
2)将这m个数排序,然后依次输出——需要O(m*logm)
这样第一种情况只需要O(n+m*logm)的复杂度;第二种只需要实现1),更是O(n)就可以了。
[/Quote]

1)先找出第m大的元素,这怎么找呢?不止O(n)吧
  • 打赏
  • 举报
回复
在n个数中取第m大元素,有O(n)线性时间的办法。
这样我们可以:
1)先找出第m大的元素,以此为基准找出最大的前m个数——需要O(n);
2)将这m个数排序,然后依次输出——需要O(m*logm)
这样第一种情况只需要O(n+m*logm)的复杂度;第二种只需要实现1),更是O(n)就可以了。
qq675927952 2009-04-02
  • 打赏
  • 举报
回复
可以用优先队列,效率应该挺高的
绿色夹克衫 2009-04-02
  • 打赏
  • 举报
回复
前段时间讨论的比较多,确实有O(n)的办法,LZ搜索一下nth element。
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 THE3EYE 的回复:]
1)先找出第m大的元素,这怎么找呢?不止O(n)吧
[/Quote]
这个当然可以O(n)~
具体办法你去搜索“线性时间 第k大元素”,最好是去翻翻教材(《算法导论》关于这个问题有很好的论述)
主要是用一些中位数比较的办法来保证最坏情况下划分也能够比较“均衡”

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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