免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: kf701
打印 上一主题 下一主题

一组数中找max或min的最快方法是什么? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-04-09 11:37 |只看该作者
我只是想说明,n个item的最佳复杂度不一定就是O(n)
在特殊情况下可能有更好的方法

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
12 [报告]
发表于 2007-04-09 11:47 |只看该作者
原帖由 deadlylight 于 2007-4-9 11:37 发表
我只是想说明,n个item的最佳复杂度不一定就是O(n)
在特殊情况下可能有更好的方法

一般讨论算法,说时间复杂度,
空间复杂度,都是指的普遍情况。
当然分析时,也会分别指出最好情况下,
最坏情况下,平均情况下等会是多少。
因为每个学过数据结构和算法的人都知道,
在特殊情况下,那些指标当然可能为常量。
这样讨论还有什么意思呢。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
13 [报告]
发表于 2007-04-09 12:00 |只看该作者
原帖由 deadlylight 于 2007-4-9 10:53 发表
排序太慢了
不知道有没有比O(n)更快的方法

没有

论坛徽章:
0
14 [报告]
发表于 2007-04-09 12:15 |只看该作者
如果只是找最大或者最小,就没啥好讨论的;如果找前N大或者N小倒还可以讨论下下

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
15 [报告]
发表于 2007-04-09 12:24 |只看该作者
原帖由 tyc611 于 2007-4-9 12:15 发表
如果只是找最大或者最小,就没啥好讨论的;如果找前N大或者N小倒还可以讨论下下

找第k大的数存在o(n)算法(与k无关,n为数组长度)

[ 本帖最后由 cjaizss 于 2007-4-9 13:10 编辑 ]

论坛徽章:
0
16 [报告]
发表于 2007-04-09 12:34 |只看该作者
原帖由 deadlylight 于 2007-4-9 10:53 发表
排序太慢了
不知道有没有比O(n)更快的方法


这个不需要排序,但是也不可能比O(n)快

  1. void maxmin(int a[], int n){
  2.   int i,max,min;

  3.   max=a[0];
  4.   min=a[0];
  5.   for (i=1;i<n;++i){
  6.     if (a[i]>max)
  7.       max = a[i];
  8.     else if(a[i]<min)
  9.       min = a[i];
  10.   }
  11. }
复制代码


最坏的情况是a中的元素递减排序,这时要比较的次数为2(n-1);
最好的情况是a中的元素递增排序,这时要比较的次数为(n-1);

所以平均比较次数为:
    (2(n-1)+(n-1))/2 = 3n/2-3/2<=3n/2
这应该是对无序数组查找最大最小值的最好方法了,该算法的平均比较次数不多于3n/2;

论坛徽章:
1
天秤座
日期:2014-04-27 07:42:20
17 [报告]
发表于 2007-04-09 12:49 |只看该作者
找大小和找相同不同,在没有完全处理这个数组前,你不能确定已处理的数里是否已出现最大值和最小值。所以4楼的解决办法就是最简单的了。其复杂度恒等于O(n)

[ 本帖最后由 A.com 于 2007-4-9 12:51 编辑 ]

论坛徽章:
0
18 [报告]
发表于 2007-04-09 13:00 |只看该作者
原帖由 zwylinux 于 4/9/07 12:34 发表


这个不需要排序,但是也不可能比O(n)快

  1. void maxmin(int a[], int n){
  2.   int i,max,min;

  3.   max=a[0];
  4.   min=a[0];
  5.   for (i=1;i<n;++i){
  6.     if (a[i]>max)
  7.       max = a[i];
  8.     e ...
复制代码


你这样还得假设输入的分布

实际上是存在最坏情况下比较次数是 3 * (n + 1) / 2 的算法.

把序列两两分组, 比如当前组 a[ i] 和 a[ i + 1],
先比较他们俩的大小, 然后只用小的去更新min, 大的去更新max.
这样就保证对每组只有3次比较,
考虑上n是奇数的情况, 最坏就 3 * (n + 1) / 2 次了

评分

参与人数 1可用积分 +1 收起 理由
win_hate + 1

查看全部评分

论坛徽章:
0
19 [报告]
发表于 2007-04-09 13:02 |只看该作者
原帖由 A.com 于 4/9/07 12:49 发表
找大小和找相同不同,在没有完全处理这个数组前,你不能确定已处理的数里是否已出现最大值和最小值。所以4楼的解决办法就是最简单的了。其复杂度恒等于O(n)


无语... 怎么O(n)内排序?

论坛徽章:
0
20 [报告]
发表于 2007-04-09 13:14 |只看该作者
原帖由 ArXoR 于 2007-4-9 13:00 发表


你这样还得假设输入的分布

实际上是存在最坏情况下比较次数是 3 * (n + 1) / 2 的算法.

把序列两两分组, 比如当前组 a[ i] 和 a[ i + 1],
先比较他们俩的大小, 然后只用小的去更新min, 大的去更新max. ...


这个算法没有假设输入分布啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP