标题:[代码贴]在一个数组中寻找最大值和最小值所需要进行比较的次数
只看楼主
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:705
专家分:2043
注 册:2010-11-11
得分:0 
我贴出这个代码,实际上是因为最近的一个项目中类似的导致了一个性能问题,引导大家在这方面思考一下。并非想得到一个什么结论或是细究某些细节。
2017-07-14 00:48
lmlm1001
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:4
帖 子:107
专家分:550
注 册:2015-3-1
得分:0 
按照你的算法
当 n = 2 时,比对次数是1
实际是2, min一次 max一次
times是1
2017-07-14 01:03
lmlm1001
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:4
帖 子:107
专家分:550
注 册:2015-3-1
得分:0 
另外 我认为你for循环中一个循环是固定的6次比对
而且参数似乎有问题

[此贴子已经被作者于2017-7-14 01:13编辑过]

2017-07-14 01:11
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:705
专家分:2043
注 册:2010-11-11
得分:0 
以下是引用lmlm1001在2017-7-14 01:03:16的发言:

按照你的算法
当 n = 2 时,比对次数是1
实际是2, min一次 max一次
times是1

我在之前的某层楼说过,不要探究一些不必要的细节。当你知道两个数谁是较小的之后,还会在比较一次来判断谁是较大的数吗?
2017-07-14 08:03
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:705
专家分:2043
注 册:2010-11-11
得分:0 
以下是引用lmlm1001在2017-7-14 01:11:06的发言:

另外 我认为你for循环中一个循环是固定的6次比对
而且参数似乎有问题

不知道你说的这个for循环到底指的是哪一个?还是那句话,不是主要问题,没必要探究细节。
2017-07-14 08:08
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:705
专家分:2043
注 册:2010-11-11
得分:0 
#define GetMinAndMax(a, b, minimum, maximum, times) \
({ \
    unsigned int arg1 = (a); \
    unsigned int arg2 = (b); \
    unsigned int temp; \

    (minimum) = arg1; \
    (maximum) = arg2; \
    if((minimum) > (maximum)) \
    { \
        temp = (minimum); \
        (minimum) = (maximum); \
        (maximum) = temp; \
    } \
    (times)++; \
    printf("time %3d: Compared %3d and %3d\n", times, arg1, arg2); \
})

[此贴子已经被作者于2017-7-14 08:19编辑过]

2017-07-14 08:11
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:705
专家分:2043
注 册:2010-11-11
得分:0 
我知道,26楼的代码(没校验正确性)才能让你觉得算法看起来像是比较了1次而非两次。但两种代码在算法上其实是等效的。算法是一种逻辑上的实现,而代码是物理上的实现。两者本质是一样的,但你不能说算法实现和物理实现就不一样。
这就如同有个人问你吃饭吗?你可以回答“吃。”,你也可以回答“嗯,正好我有些饿了,我顺便吃了吧。”你不能说这两种回答是不同的意思吧?
当讲求算法是,是不需要(或者说不应该)讲求细节的,因为算法是代码的本质,代码是算法的体现,两者是互相统一的。
2017-07-14 08:17
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
得分:0 
还是来说一下吧~同样的元素不同的排列得出来的结果不同吧~
感觉上面说的两种方法不就是把数据顺序倒过来么~这样没啥可比性吧~

[此贴子已经被作者于2017-7-14 11:59编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-07-14 11:51



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-479368-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.212160 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved