猜猜看,STL中min_element()的赋值语句的执行次数与区间大小的关系?

陈硕 2001-12-19 12:00:46
SGI STL中min_element()的源代码:
template <class _ForwardIter>
_ForwardIter min_element(_ForwardIter __first, _ForwardIter __last) {
if (__first == __last) return __first;
_ForwardIter __result = __first;
while (++__first != __last)
if (*__first < *__result)
__result = __first; //<<<<****>>>>
return __result;
}
请问其中标有<<<<****>>>>的那个语句的执行次数与区间[__last, __first)的大小之间的近似关系?
...全文
165 12 打赏 收藏 举报
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
陈硕 2001-12-20
^_^,结帐。
  • 打赏
  • 举报
回复
kingofark 2001-12-20
井底蛙kingofark看得如痴如醉——使劲学习呀!
  • 打赏
  • 举报
回复
gigix 2001-12-19
O(n)
  • 打赏
  • 举报
回复
qqchen79 2001-12-19
其实都没错,gigix说的是算法的最坏情况下的复杂度,而Solstice说的是平均复杂度。
好比quicksort算法,平均复杂度是O(n*log(n)),但最坏情况下是O(n*n)。
所以说quicksort快速,是说平均情况下的,最坏情况下也和冒泡差不多。:)
  • 打赏
  • 举报
回复
babysloth 2001-12-19
呵呵,准确地说应该是ln(n)+c-1(n充分大),其中c为欧拉常数,忘了是多少了,大概0.577216吧。这个好算点。
  • 打赏
  • 举报
回复
陈硕 2001-12-19
嗯,差不多ln(N)。
  • 打赏
  • 举报
回复
babysloth 2001-12-19
大约是ln(N)
  • 打赏
  • 举报
回复
陈硕 2001-12-19
哈哈,我也拿书说话。More Programming Pearls 一书,183页【Column 1的习题解答】:
引用Knuth的《Fundamental Algorithms》【就是TAOCP第一卷】Section 1.2.10
在平均情况下,区间大小为N时,赋值语句执行
1/2 + 1/3 + ... + 1/N
次。

1/2 + 1/3 + ... + 1/10000 = 8.7875
大大出乎意料吧,今天现学现卖,见笑了。
  • 打赏
  • 举报
回复
陈硕 2001-12-19
cber:
设n = last - first;
operator<确实执行了(n - 1)次,但那个赋值语句与n不是线性关系。
我写了一个测试程序,看了结果你会大吃一惊的。

#include <iostream>
#include <cstdlib>

using std::cout;
int cnt = 0;

template <class _ForwardIter>
_ForwardIter my_min_element(_ForwardIter __first, _ForwardIter __last) {
if (__first == __last) return __first;
_ForwardIter __result = __first;
while (++__first != __last)
if (*__first < *__result) {
__result = __first;
cnt++; //count for assignments
}
return __result;
}

int main()
{
const int length = 10000; //n == 10000
int arr[length];
srand(time(NULL));

for (int k = 0; k < 100; k++) { //取100次平均
for (int i = 0; i < length; ++i) {
arr[i] = rand();
}
my_min_element(arr, arr + length);
}
cout << cnt / 100.0 << '\n'; //看看n==10000时,平均每次min_element所执行的赋值的次数
}
//平均每次调用min_element只有不到9次赋值,为何?
  • 打赏
  • 举报
回复
kingofark 2001-12-19
真个好贴!我学习!
  • 打赏
  • 举报
回复
cber 2001-12-19
max((last – first) – 1, 0)次的operator<调用(嘿嘿,偷懒从我的STL翻译中翻出来的,在第149页——原文)
至于赋值的实际调用次数,和这个区间的有序情况有关,不过gigix的说法应该没有错,它的次数应该是和n成线形比例的(n = last-first)。按照概率来说(假设对于每个元素都有相同的概率),它的次数应该为n/2
  • 打赏
  • 举报
回复
陈硕 2001-12-19
不对,要是这么简单,我就不拿出来考大家了。
  • 打赏
  • 举报
回复
发帖
C语言
加入

6.6w+

社区成员

C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
申请成为版主
帖子事件
创建了帖子
2001-12-19 12:00
社区公告
暂无公告