時間復雜度空間復雜度

我們編過不少代碼,起初學習的時候我們習慣性的認為,只要代碼能正確的運行就ok啦~很少考慮代碼的優化帶來的好處。今天說一下影響代碼性能的兩個重要指標--時間復雜度&空間復雜度。

時間復雜度:就是函數(指數學中的函數),具體執行的操作次數。通常用漸進表達式O()來表示。

空間復雜度:對象的個數。占用的空間。

算法分析一般分為三類:最壞情況、平均情況、最好情況。

算法分析要保持大局觀,忽略掉常數,關注增長最快的表達式。

我們通常見到的算法的時間復雜度有:

斐波那契數列 (遞歸:O(2^N)非遞歸:O(N)

冒泡:O(N^2)

選擇:O(N^2)

插入:O(N^2)

這里,主要舉兩個例子加以說明:

例子1:斐波那契數列


這就是著名的斐波那契數列啦。

下面講講斐波那契數列的兩種算法,并剖析時間復雜度。

(1)遞歸算法

<span style="font-size:18px;">#include<iostream>
using namespace std;
#include<assert.h>unsigned long long Fib(long long n)
{assert(n >= 0);return n < 2 ? 1 : Fib(n-1)+Fib(n-2);
}
int main()
{cout<<Fib(5)<<endl;return 0;
}</span>
斐波那契數列的遞歸算法:由于每一步計算都調用兩次遞歸,即Fib(n-1)= Fib(n-2)+ Fib(n-3) = Fib(n-3)+Fib(n-4)+Fib(n-4)+Fib(n-5)=... ?這樣下來,就相當于二叉樹,所以其時間復雜度為O(2^N),空間復雜度為O(N)。

(2)非遞歸算法

#include<iostream>
using namespace std;
unsigned long long Fib(long long n)
{long long s0 = 0;long long s1 = 1;long long s = 0;for(int i = 0; i < n;i++){s1 = s0+s1;s0 = s1-s0;	}return s1;
}int main()
{cout<<Fib(5)<<endl;return 0;
}
非遞歸算法只是在for循環里邊數值的相互轉換,其時間復雜度為O(N),空間復雜度為O(N)。

例子2:二分查找算法

二分查找的基本思想是將n個元素分成大致相等的兩部分,a[n/2]與data做比較,如果data=a[n/2],則找到data,算法中止;如果data<a[n/2],則只要在數組a的左半部分繼續搜索data,如果data>a[n/2],則只要在數組a的右半部搜索data.

(1)非遞歸算法

int BinaryFind(int arr[],int size,int data)
{int left = 0;int right = size-1;while(left <= right)        //區間[]{int mid = left-(left-right)/2;if(arr[mid] > data){right = mid-1;}else if(arr[mid] < data){left = mid+1;}else{return mid;}}
<span style="white-space:pre">	</span>return -1;
}
int main()
{int arr[] = {1,3,5,7,9};int size = sizeof(arr)/sizeof(arr[0]);cout<<BinaryFind(arr,size,5)<<endl;return 0;
}

說起二分查找的非遞歸算法,我們還有另外一種實現。(要特別注意)

int BinaryFind(int arr[],int size,int data)
{int left = 0;int right = size;          //區間[)while(left < right){int mid = left-(left-right)/2;if(arr[mid] > data){right = mid;}else if(arr[mid] < data){left = mid+1;}else{return mid;}}
<span style="white-space:pre">	</span>return -1;
}
int main()
{int arr[] = {1,3,5,7,9};int size = sizeof(arr)/sizeof(arr[0]);cout<<BinaryFind(arr,size,5)<<endl;return 0;
}
while循環循環的次數就是時間復雜度,即時間復雜度為O(LgN),空間復雜度為O(N)。

(2)遞歸算法

int BinaryFind_R(int arr[],int data,int left,int right)
{if(left <= right)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>int mid = left-(left-right)/2;
<span style="white-space:pre">		</span>if(arr[mid] > data)
<span style="white-space:pre">			</span>BinaryFind_R(arr,data,left,mid-1);
<span style="white-space:pre">		</span>else if(arr[mid] < data)
<span style="white-space:pre">			</span>BinaryFind_R(arr,data,mid+1,right);
<span style="white-space:pre">		</span>else
<span style="white-space:pre">			</span>return mid;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>else
<span style="white-space:pre">		</span>return -1;
}
int main()
{int arr[] = {1,3,5,7,9};int size = sizeof(arr)/sizeof(arr[0]);int left = 0;int right = size - 1;cout<<BinaryFind_R(arr,6,left,right)<<endl;return 0;
}
遞歸時間復雜度為O(LgN)。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/382847.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/382847.shtml
英文地址,請注明出處:http://en.pswp.cn/news/382847.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言 函數遞歸例題解析

1.接受一個整形值&#xff08;無符號&#xff09;&#xff0c;把它轉換為 字符并打印它模擬實現strlen()函數。3.求n的階乘4.斐波那契數列總結 1.接受一個整形值&#xff08;無符號&#xff09;&#xff0c;把它轉換為 字符并打印它 void fun(int x) {if (x > 9){fun(x/10)…

xpath 簡單用法小記

1 xpath定位 沒有某個屬性的元素 例如定位沒有class屬性的td tds tr.xpath(.//td[not(class)])

剖析printf函數

printf是什么&#xff0c;對于起初學習c語言的同學來說肯定都特別的疑惑。在這里&#xff0c;解答一下&#xff1a;它是一個函數。既然是一個函數的話&#xff0c;想必肯定有返回值和參數吧。那么它的返回值和參數是什么呢&#xff1f; 1、看一下這個例子&#xff0c;可能更好…

大端小端詳解

文章目錄為什么有大端小端&#xff1f;大端&#xff1a;低位放在高地址&#xff0c;高位放在低地址小端&#xff1a;低位放在低地址&#xff0c;高位放在高地址面試考點&#xff1a;代碼代碼2一道面試題為什么有大端小端&#xff1f; 大端&#xff1a;低位放在高地址&#xff0…

xpath 簡單小記

1 定位沒有class屬性的td元素 tds tr.xpath(.//td[not(class)])

詳解volatile關鍵字

volatile字面意思&#xff1a;易變的。在計算機里&#xff0c;是防止優化的意思&#xff0c;然而是怎么防止優化的呢&#xff1f;待我一一道來哦。 先看這樣一個例子&#xff1a; <span style"font-size:18px;">#include<iostream> using namespace std…

C語言 有符號字符型輸出 面試題

1.第一題 int main() {int a 128;printf("%u\n", a);system("pause"); } 輸出結果 128 #include <stdio.h> #include <stdlib.h>int main() {char a 128;printf("%u\n", a);system("pause"); } 輸出結果 42949671…

正則表達式提取括號里面的值

轉自 https://blog.csdn.net/jiahaowanhao/article/details/80795148

有趣的鏈表相關題型

鏈表&#xff1a;也是線性表的一種。形象的來說&#xff1a; 就像火車的一個個車廂一樣&#xff0c;一個個的鏈起來的。它有一個特點&#xff1a;它的頭沒有前驅&#xff0c;尾沒有后繼。 為什么會引入鏈表這個概念呢&#xff1f;之前我們知道的順序表&#xff0c;是用數組的形…

簡陋版C語言仿真通訊錄

文件cotact.c #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include "contact.h" /*初始化*/ void InitContact(pContact pc) {pc->count 0;memset(pc->data, 0, sizeof(pc->data)); }/*增加數據*/ void AddCon…

pip3 便捷安裝包

將虛擬環境下 的包列舉出來 并保存到文件夾 pip3 freeze > requirments.txt 一次性安裝文件里面所列舉的所有的包 pip3 install -r requirments.txt

有趣的約瑟夫環問題

大家有沒有聽過約瑟夫環這個問題呢&#xff1f;我們先來看看它是一個什么樣的問題~ 約瑟夫環&#xff08;Josephus&#xff09;問題是由古羅馬的史學家約瑟夫&#xff08;Flavius Josephus&#xff09;提出的。該問題的說法不一&#xff0c;傳說他參加并記錄了公元66—70年猶太…

C語言模擬實現標準庫函數之qsort() 2

C語言模擬實現標準庫函數之qsort() <1> https://blog.csdn.net/csdn_kou/article/details/80158194 排序數字 int int_cmp(const void *elem1, const void *elem2) { return *(int *)elem1 - *(int *)elem2; }int main() { int arr[] { 9,8,7,6,5,4,3,2,1 }; int siz…

node.js windows下安裝與配置

轉自 https://www.cnblogs.com/liuqiyun/p/8133904.html

一系列鏈表題

1、鏈表的倒序輸出&#xff1a;(輸出4&#xff0c;3&#xff0c;2&#xff0c;1)在這里&#xff0c;可以使用遞歸的方式&#xff1a; <span style"font-size:18px;">void Reverse(pNode pHead) {if(pHead){Reverse(pHead->next);cout<<pHead->data…

簡陋版C語言仿真通訊錄之動態內存開辟版本

簡陋版C語言仿真通訊錄 https://blog.csdn.net/csdn_kou/article/details/80287640 簡陋版C語言仿真通訊錄之動態內存開辟版本 給Contact結構體增加一個容量&#xff0c;來表示什么時候增容 #define MAX_NAME 20 typedef struct PeoInfo {char name[MAX_NAME];int age;char …

node.js 代碼修改 自動識別重啟工具

npm install supervisor -g supervisor xx.js 代替 node xx.js 能實現自動重啟服務&#xff0c;識別代碼更新

C語言轉移表之加減乘除無限進化版

主干程序初級版本進階版本版本進化 主干程序 輸入程序解析程序 /*解析字符串 有空格把空格分開 比如輸入&#xff1a;add 1 2 解析后&#xff1a;add12*/ void do_parse(char *buf) {int state 0;int i 0;int argc 0;char *argv[8] {0};for (i 0; buf[i]; i){if (state …

node.js 筆記1 模塊方面

url 模塊 parse 解析url 可以用來獲取查詢參數 xx.js exports.xx xx 另一個文件引用 require(’./xx.js); 獲取的句柄 相當于 xx.js 中的 exports xx.js module.exports xx 這樣被人引用 相當于就是直接拿到了 xx 當require xx 的時候&#xff0c; 如果xx不在當前文件夾 &…

c++之指針引用

指針&#xff1a;指向一塊內存地址的標識。 引用&#xff1a;給已經定義的變量起的別名。 格式&#xff1a; 類型 &引用變量名 已定義的變量名&#xff08;引用變量名和已定義的變量名可以看成是同一個實體&#xff0c;一個改變&#xff0c;另一個也隨之改變&#xff0…