您好,登錄后才能下訂單哦!
這篇文章主要講解了“C語言數(shù)據(jù)結(jié)構(gòu)之算法的時(shí)間復(fù)雜度實(shí)例分析”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“C語言數(shù)據(jù)結(jié)構(gòu)之算法的時(shí)間復(fù)雜度實(shí)例分析”吧!
算法在編寫成可執(zhí)行程序后,運(yùn)行時(shí)需要耗費(fèi)時(shí)間資源和空間(內(nèi)存)資源 。因此衡量一個(gè)算法的好壞,一般是從時(shí)間和空間兩個(gè)維度來衡量的,即時(shí)間復(fù)雜度和空間復(fù)雜度。
時(shí)間復(fù)雜度主要衡量一個(gè)算法的運(yùn)行快慢,而空間復(fù)雜度主要衡量一個(gè)算法運(yùn)行所需要的額外空間。在計(jì)算機(jī)發(fā)展的早期,計(jì)算機(jī)的存儲容量很小。所以對空間復(fù)雜度很是在乎。但是經(jīng)過計(jì)算機(jī)行業(yè)的迅速發(fā)展,計(jì)算機(jī)的存儲容量已經(jīng)達(dá)到了很高的程度。所以我們?nèi)缃褚呀?jīng)不需要再特別關(guān)注一個(gè)算法的空間復(fù)雜度。(本篇文章主要討論時(shí)間復(fù)雜度)
時(shí)間復(fù)雜度的定義:在計(jì)算機(jī)科學(xué)中,算法的時(shí)間復(fù)雜度是一個(gè)函數(shù),它定量描述了該算法的運(yùn)行時(shí)間。一個(gè)算法執(zhí)行所耗費(fèi)的時(shí)間,從理論上說,是不能算出來的,只有你把你的程序放在機(jī)器上跑起來,才能知道。但是我們需要每個(gè)算法都上機(jī)測試嗎?是可以都上機(jī)測試,但是這很麻煩,所以才有了時(shí)間復(fù)雜度這個(gè)分析方式。一個(gè)算法所花費(fèi)的時(shí)間與其中語句的執(zhí)行次數(shù)成正比例,算法中的基本操作的執(zhí)行次數(shù),為算法的時(shí)間復(fù)雜度。
舉例:
請計(jì)算一下Func1中++count語句總共執(zhí)行了多少次?
void Func1(int N) { int count = 0; for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { ++count; } } for (int k = 0; k < 2 * N; ++k) { ++count; } int M = 10; while (M--) { ++count; } printf("%d\n", count); }
時(shí)間復(fù)雜度函數(shù):F(N)=N*N+2*N+10
實(shí)際中我們計(jì)算時(shí)間復(fù)雜度時(shí),我們其實(shí)并不一定要計(jì)算精確的執(zhí)行次數(shù),而只需要大概執(zhí)行次數(shù),那么這里我們使用大O的漸進(jìn)表示法。
大O符號(Big O notation):是用于描述函數(shù)漸進(jìn)行為的數(shù)學(xué)符號
1、用1來代替常數(shù),F(N)函數(shù)只有常數(shù) O(1)
2、在運(yùn)行次數(shù)中,只保留最高階。 F(N)=N^3+N^2 --> O(N^3)
3、最高項(xiàng)系數(shù)化為1。F(N) = 2*N --> O(N)
注:復(fù)雜度不固定時(shí),時(shí)間復(fù)雜度看的是最壞的情況(悲觀的估算)
例如:在一個(gè)長度為N數(shù)組中搜索一個(gè)數(shù)據(jù)x
最好情況:1次找到
最壞情況:N次找到
平均情況:N/2次找到
在實(shí)際中一般情況關(guān)注的是算法的最壞運(yùn)行情況,所以數(shù)組中搜索數(shù)據(jù)時(shí)間復(fù)雜度為O(N)
void BubbleSort(int* a, int n) { assert(a); for (size_t end = n; end > 0; --end) { int exchange = 0; for (size_t i = 1; i < end; ++i) { if (a[i - 1] > a[i]) { Swap(&a[i - 1], &a[i]); exchange = 1; } } if (exchange == 0) break; } }
經(jīng)分析的:F(N)= O(N^2)
//左閉右開 int BinarySearch(int* a, int n, int x) { assert(a); int begin = 0; int end = n ; while (begin < end) { int mid = begin + ((end - begin) >> 1); if (a[mid] < x) begin = mid + 1; else if (a[mid] > x) end = mid; else return mid; } return -1; } //左閉右閉 int BinarySearch(int* a, int n, int x) { assert(a); int begin = 0; int end = n-1; while (begin <= end) { int mid = begin + ((end - begin) >> 1); if (a[mid] < x) begin = mid + 1; else if (a[mid] > x) end = mid-1; else return mid; } return -1; }
假設(shè)找了x次:
1*2*2*2*2......*2 = N
2^x = N
x = log2 N
最壞:O(log2 N) 簡寫成 log(N)
1、每次函數(shù)調(diào)用是O(1),那么就要看他的遞歸次數(shù)。
2、每次函數(shù)調(diào)用不是O(n),那么就看他的遞歸調(diào)用中次數(shù)的累加。
long long Fac(size_t N) { if (0 == N) return 1; return Fac(N - 1) * N; }
F(N) = O(N)
long long Fib(size_t N) { if (N < 3) return 1; return Fib(N - 1) + Fib(N - 2); }
通過計(jì)算分析發(fā)現(xiàn)基本操作遞歸了2^N次,時(shí)間復(fù)雜度為O(2^N)。
感謝各位的閱讀,以上就是“C語言數(shù)據(jù)結(jié)構(gòu)之算法的時(shí)間復(fù)雜度實(shí)例分析”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對C語言數(shù)據(jù)結(jié)構(gòu)之算法的時(shí)間復(fù)雜度實(shí)例分析這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。