日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

时间复杂度以及空间复杂度(大O的渐进表示法)

發(fā)布時(shí)間:2023/12/14 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 时间复杂度以及空间复杂度(大O的渐进表示法) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

1.算法效率

2.時(shí)間復(fù)雜度

2.1 時(shí)間復(fù)雜度的概念

2.2 大O的漸進(jìn)表示法

3.空間復(fù)雜度


1.算法效率

算法效率分析分為兩種:第一種是時(shí)間效率,第二種是空間效率。

時(shí)間效率被稱為時(shí)間復(fù)雜度,而空間效率被稱作空間復(fù)雜度。時(shí)間復(fù)雜度主要衡量的是一個(gè)算法的運(yùn)行速度,而空間復(fù)雜度主要衡量一個(gè)算法所需要的額外空間,在計(jì)算機(jī)發(fā)展的早期,計(jì)算機(jī)的存儲(chǔ)容量很小。所以對空間復(fù)雜度很是在乎。但是經(jīng)過計(jì)算機(jī)行業(yè)的迅速發(fā)展,計(jì)算機(jī)的存儲(chǔ)容量已經(jīng)達(dá)到了很高的程度。所以我們?nèi)缃褚呀?jīng)不需要再特別關(guān)注一個(gè)算法的空間復(fù)雜度。

2.時(shí)間復(fù)雜度

2.1 時(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ù)雜度。

2.2 大O的漸進(jìn)表示法

算法的時(shí)間復(fù)雜度通常用大O符號表述,定義為T[n] = O(f(n))。稱函數(shù)T(n)以f(n)為界或者稱T(n)受限于f(n)。 如果一個(gè)問題的規(guī)模是n,解這一問題的某一算法所需要的時(shí)間為T(n)。T(n)稱為這一算法的“時(shí)間復(fù)雜度”。當(dāng)輸入量n逐漸加大時(shí),時(shí)間復(fù)雜度的極限情形稱為算法的“漸近時(shí)間復(fù)雜度”。

請計(jì)算一下func1基本操作執(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--) > 0) {count++;}System.out.println(count); }

對于第一個(gè)for循環(huán),是一個(gè)嵌套的for循環(huán),簡單計(jì)算可得執(zhí)行了次,第二個(gè)for循環(huán)共執(zhí)行了次,while循環(huán)執(zhí)行了10次。

即func1執(zhí)行的基本操作數(shù):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

實(shí)際中我們計(jì)算時(shí)間復(fù)雜度時(shí),我們其實(shí)并不一定要計(jì)算精確的執(zhí)行次數(shù),而只需要大概執(zhí)行次數(shù),那么這里我們使用大O的漸進(jìn)表示法。

大O符號(Big O notation):是用于描述函數(shù)漸進(jìn)行為的數(shù)學(xué)符號。

推導(dǎo)大O階方法:

1、用常數(shù)1取代運(yùn)行時(shí)間中的所有加法常數(shù)。

??

2、在修改后的運(yùn)行次數(shù)函數(shù)中,只保留最高階項(xiàng)。

3、如果最高階項(xiàng)存在且不是1,則去除與這個(gè)項(xiàng)目相乘的常數(shù)。得到的結(jié)果就是大O階。 使用大O的漸進(jìn)表示法以后,Func1的時(shí)間復(fù)雜度為:

過上面我們會(huì)發(fā)現(xiàn)大O的漸進(jìn)表示法去掉了那些對結(jié)果影響不大的項(xiàng),簡潔明了的表示出了執(zhí)行次數(shù)。

另外有些算法的時(shí)間復(fù)雜度存在最好、平均和最壞情況

最壞情況:任意輸入規(guī)模的最大運(yùn)行次數(shù)(上界)

平均情況:任意輸入規(guī)模的期望運(yùn)行次數(shù)

最好情況:任意輸入規(guī)模的最小運(yùn)行次數(shù)(下界)

例如:在一個(gè)長度為N數(shù)組中搜索一個(gè)數(shù)據(jù)x

最好情況:1次找到

最壞情況:N次找到

平均情況:N/2次找到

注意:平時(shí)所說的時(shí)間復(fù)雜度,都是在說,最壞情況。

例如:

// 計(jì)算func2的時(shí)間復(fù)雜度? void func2(int N) {int count = 0;for (int k = 0; k < 2 * N ; k++) {count++;}int M = 10;while ((M--) > 0) {count++;}System.out.println(count); }

第一個(gè)for循環(huán)執(zhí)行2N次,while循環(huán)執(zhí)行10次,則

大O階算法:

// 計(jì)算func3的時(shí)間復(fù)雜度? void func3(int N, int M) {int count = 0;for (int k = 0; k < M; k++) {count++;}for (int k = 0; k < N ; k++) {count++;}System.out.println(count); }

易知,大O階算法:

計(jì)算bubbleSort(冒泡排序)的時(shí)間復(fù)雜度?

void bubbleSort(int[] array) {for (int end = array.length; end > 0; end--) {boolean sorted = true;for (int i = 1; i < end; i++) {if (array[i - 1] > array[i]) {Swap(array, i - 1, i);sorted = false;}}if (sorted == true) {break;}} }

冒泡排序基本操作執(zhí)行最好N次,最壞執(zhí)行了(N*(N-1))/2次,通過推導(dǎo)大O階方法+時(shí)間復(fù)雜度一般看最壞, 時(shí)間復(fù)雜度為 :

計(jì)算binarySearch(二分查找)的時(shí)間復(fù)雜度?

int binarySearch(int[] array, int value) {int begin = 0;int end = array.length - 1;while (begin <= end) {int mid = begin + ((end-begin) / 2);if (array[mid] < value)begin = mid + 1;else if (array[mid] > value)end = mid - 1;elsereturn mid;}return -1; }

binarySearch(二分查找)基本操作執(zhí)行最好1次,最壞O(log(2)N)次,時(shí)間復(fù)雜度為:

計(jì)算遞歸fibonacci(斐波那契)的時(shí)間復(fù)雜度?

int fibonacci(int N) {return N < 2 ? N : fibonacci(N-1)+fibonacci(N-2); }

遞歸的時(shí)間復(fù)雜度 = 遞歸的次數(shù) * 每次遞歸執(zhí)行的次數(shù)

fibonacci(斐波那契)通過計(jì)算分析發(fā)現(xiàn)基本操作遞歸了2^N次,時(shí)間復(fù)雜度為:

?


3.空間復(fù)雜度

空間復(fù)雜度是對一個(gè)算法在運(yùn)行過程中臨時(shí)占用存儲(chǔ)空間大小的量度 ??臻g復(fù)雜度不是程序占用了多少bytes 的空間,因?yàn)檫@個(gè)也沒太大意義,所以空間復(fù)雜度算的是變量的個(gè)數(shù)??臻g復(fù)雜度計(jì)算規(guī)則基本跟實(shí)踐復(fù)雜度 類似,也使用大O漸進(jìn)表示法

計(jì)算fibonacci(斐波那契)的空間復(fù)雜度?

int[] fibonacci(int n) {long[] fibArray = new long[n + 1];fibArray[0] = 0;fibArray[1] = 1;for (int i = 2; i <= n ; i++) {fibArray[i] = fibArray[i - 1] + fibArray [i - 2];}return fibArray; }

fibonacci(斐波那契)動(dòng)態(tài)開辟了N個(gè)空間,空間復(fù)雜度為:

計(jì)算階乘遞歸Factorial的時(shí)間復(fù)雜度?

long factorial(int N) {return N < 2 ? N : factorial(N-1)*N; }

階乘遞歸Factorial調(diào)用了N次,開辟了N個(gè)棧幀,每個(gè)棧幀使用了常數(shù)個(gè)空間??臻g復(fù)雜度為:

總結(jié)

以上是生活随笔為你收集整理的时间复杂度以及空间复杂度(大O的渐进表示法)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。