《數據結構教程》(第5版)上機實驗題1--實驗題2:
目的:
理解常見算法時間函數的增長趨勢
對以下函數用c++程序運行觀察其變化:
<< "log2(n): << " √n: << " n: << " n*log2(n): << " n*n: << " n^3: << " 2^n: << " n!:
1、從值的變化角度分析:
s-code:
#include<iostream> #include<cmath> using namespace std; double factorial(double n) { double result = 1; while(n) { result *= n--; } return result; } int main() { int n = 1, i; cin >> i; while(i >= n) { cout << "log2(n):" << log2(n) << " √n:" << sqrt(n) << " n:" << n << " n*log2(n):" << n*log2(n) << " n*n:" << n*n << " n^3:" << n*n*n << " 2^n:" << exp2(n) << " n!:" << factorial(n) << endl; n++; } return 0; }
result of test:
2、從消耗的時間的角度分析:
介紹一個計時函數:
#include<ctime> clock_t start, end; start = clock(); >>>//測試部分 end = clock(); cout <<(end - start)*1.0/CLOCKS_PER_SEC; //單位是秒
s-code:
#include<iostream> #include<cmath> #include<ctime> #include<string> using namespace std; double factorial(double n) //求階乘 { double result = 1; while(n) { result *= n--; } return result; } double testTime(double n) //測試從0~n的消耗的時間 { clock_t start, end; start = clock(); for(double i = 0; i <= n;i++); end = clock(); return (end - start)*1.0/CLOCKS_PER_SEC; } void tPrint(string str, double n) //output { cout << "Start test " << str << ":" << endl; cout << "...\n" << "End,time is :" << testTime(n) << "s\n---------------------\n"; } int main() { double n; cin >> n; tPrint("log2(n)",log2(n)); tPrint("√n",sqrt(n)); tPrint("n",n); tPrint("n^2",n*n); tPrint("n^3",n*n*n); tPrint("2^n",exp2(2)); tPrint("n!",factorial(n)); return 0; }
result:
這里測試了 10 11 12 13 5000 五組數據顯然當n越大時所消耗的時間的變化率差距就越大
注意:
這里的測試數據可能會由機器的性能不同產生差距,這時候就是檢驗機器性能的時候到了哈哈哈哈哈哈。。。。。
其實分析函數的變化用極限就一目了然了,用程序就是為了感受下等待的痛苦,哈哈。。。。。。