猜猜看,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)的大小之间的近似关系?
...全文
183 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
陈硕 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
  • 打赏
  • 举报
回复
不对,要是这么简单,我就不拿出来考大家了。

69,371

社区成员

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

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