实证解
可以执行和分析许多不同阵列大小的模拟,每个阵列具有多个试验:
#include
#include
#include
#define UPTO 10000
#define TRIALS 100
using namespace std;
int arr[UPTO];
int main(void){
ofstream outfile ("tabsep.txt");
for(int i = 1; i < UPTO; i++){
int sum = 0;
for(int iter = 0; iter < TRIALS; iter++){
for(int j = 0; j < i; j++){
arr[j] = rand();
}
int max = arr[0];
int times_changed = 0;
for(int j = 0; j < i; j++){
if (arr[j] > max){
max = arr[j];
times_changed++;
}
}
sum += times_changed;
}
int avg = sum/TRIALS;
outfile << i << "\t" << avg << "\n";
cout << "\r" << i;
}
outfile.close();
cout << endl;
return 0;
}
当我绘制这些结果时,复杂性似乎是对数的:
我认为可以安全地得出时间复杂度为O(log n)的结论.
理论解决方案
>假设数字在0 … n范围内>你有一个暂定的最大值m>下一个最大值将是m 1 … n范围内的随机数,其平均值为(m n)/ 2>这意味着每次找到新的最大值时,您将可能的最大值范围除以2>重复除法相当于对数>因此,找到新的最大值的次数是O(log n)