最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java時(shí)間復(fù)雜度、空間復(fù)雜度的深入詳解

 更新時(shí)間:2021年11月05日 14:28:54   作者:Lockey-s  
對于一個(gè)算法,其時(shí)間復(fù)雜度和空間復(fù)雜度往往是相互影響的,當(dāng)追求一個(gè)較好的時(shí)間復(fù)雜度時(shí),可能會使空間復(fù)雜度的性能變差,即可能導(dǎo)致占用較多的存儲空間,這篇文章主要給大家介紹了關(guān)于Java時(shí)間復(fù)雜度、空間復(fù)雜度的相關(guān)資料,需要的朋友可以參考下

算法效率

在使用當(dāng)中,算法效率分為兩種,一是時(shí)間效率(時(shí)間復(fù)雜度),二是空間效率(空間復(fù)雜度)。時(shí)間復(fù)雜度是指程序運(yùn)行的速度??臻g復(fù)雜度是指一個(gè)算法所需要的額外的空間。

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

什么是時(shí)間復(fù)雜度

計(jì)算程序運(yùn)行的時(shí)間不能拿簡單的時(shí)間來計(jì)算,因?yàn)椴煌幚砥魈幚頂?shù)據(jù)的能力是不一樣的。所以只算一個(gè)大概的次數(shù)就行了,儼然就是算法中的基本操作的執(zhí)行次數(shù)。用大O的漸進(jìn)法來表示

例:計(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);
}

func1 的基本執(zhí)行次數(shù)是:F(N) = N^2 + 2*N + 10

推導(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ù)雜度就是:O(N^2)

算法情況

因?yàn)楫?dāng)我們用算法計(jì)算的時(shí)候,會有最好情況和最壞情況和平均情況。我們常說的時(shí)間復(fù)雜度在 O(N) 這里的時(shí)間復(fù)雜度就是最壞情況。

最好情況就是最小的運(yùn)行次數(shù)。

舉例一:

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);
}

這里的結(jié)果是 O(N) 因?yàn)楦鶕?jù)時(shí)間復(fù)雜度的計(jì)算方法,去除常數(shù),所以 2*N 就是 N 。M 是 10 也可以忽略掉。

舉例二:

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);
}

這里的時(shí)間復(fù)雜度是 O(M+N) 因?yàn)?M 和 N 的值是未知的,所以是 O(M+N)

舉例三:

void func4(int N) {
    int count = 0;
    for (int k = 0; k < 100; k++) {
        count++;
    }
    System.out.println(count);
}

這個(gè)的時(shí)間復(fù)雜度是 O(1) 因?yàn)檠h(huán)里面是常數(shù),所以根據(jù)大 O 漸進(jìn)法,結(jié)果就是 O(1)

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

public static void bubbleSort(int[] arr){
    for (int i = 0; i < arr.length; i++) {
        for (int j = 0; j < arr.length - 1 - i; j++) {
            if(arr[j] > arr[j+1]){
                int tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }
    }
}

因?yàn)槊芭菖判虻奶厥庑?,可能一次就排好了,也可能得一直排到最后,所以就有了最好情況和最壞情況。

最好情況:就是比較一次,就是 O(N)

最壞情況:一直排到最后,就是 O(N^2)

計(jì)算二分查找的時(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;
        else
            return mid;
    }
    return -1;
}

因?yàn)槎植檎沂且话胍话氲恼?,所以每次查找之后都會把查找范圍減半,比如說在一個(gè) 1 - 8 的有序數(shù)組里面查找 8 也就是查找最壞情況。圖示如下:

如圖,在數(shù)組當(dāng)中完成二分查找需要 log2n - 1 次也就是時(shí)間復(fù)雜度是 log2n (就是 log 以 2 為底 n 的對數(shù))

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

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

計(jì)算遞歸的時(shí)間復(fù)雜度:遞歸的次數(shù) * 每次遞歸執(zhí)行的次數(shù)。

所以這次遞歸的時(shí)候,基本操作遞歸了 N 次,所以時(shí)間復(fù)雜度就是 O(N)

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

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

假設(shè) N 是 5 我們來展開求

如圖:每次計(jì)算都會計(jì)算下一層,但是每次都是一邊少,一邊多。所以就可以直接按照每邊一樣來計(jì)算。如下圖:

所以就有公式可以計(jì)算出每次計(jì)算的次數(shù),就是:2 ^ (n - 1) ,所以計(jì)算的結(jié)果就是:2^\0 + 2^1 + 2^2 + 2^3……2^(n-1) = 2^n+1 所以按照大 O 漸進(jìn)法來算,結(jié)果就是:2^n 。

所以斐波那契數(shù)列的時(shí)間復(fù)雜度就是:2^n 。

空間復(fù)雜度

空間復(fù)雜度衡量的是一個(gè)算法在運(yùn)行過程當(dāng)中占用的額外存儲空間的大小,因?yàn)闆]必要按照字節(jié)來算,而是算變量的個(gè)數(shù)。也是用大 O 漸進(jìn)法表示。

計(jì)算冒泡排序的空間復(fù)雜度

public static void bubbleSort(int[] arr){
    for (int i = 0; i < arr.length; i++) {
        for (int j = 0; j < arr.length - 1 - i; j++) {
            if(arr[j] > arr[j+1]){
                int tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }
    }
}

因?yàn)槊芭菖判虻淖兞坎]有變化,使用的是額外空間是常數(shù),所以空間復(fù)雜度是 O(1) 。

計(jì)算斐波那契數(shù)列的空間復(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;
}

因?yàn)檫@里的斐波那契數(shù)列開辟了 n 個(gè)額外空間,所以空間復(fù)雜度為 O(n) 。

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

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

因?yàn)槭沁f歸,每次遞歸都會開辟棧幀,每個(gè)棧幀占用常數(shù)個(gè)空間,所以空間復(fù)雜度就是 O(N) 。

總結(jié)

到此這篇關(guān)于Java時(shí)間復(fù)雜度、空間復(fù)雜度的文章就介紹到這了,更多相關(guān)Java時(shí)間復(fù)雜度、空間復(fù)雜度內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot 添加本地 jar 文件的操作步驟

    SpringBoot 添加本地 jar 文件的操作步驟

    在平時(shí)我們做項(xiàng)目中,需要用到j(luò)ar包文件,有時(shí)候是不能從maven遠(yuǎn)程倉庫拉取的,這時(shí)候就得考慮用到j(luò)ar文件安裝到本地maven庫中,再添加依賴,今天小編分步驟給大家介紹下SpringBoot 添加本地 jar 文件的流程,一起看看吧
    2021-09-09
  • Java經(jīng)典排序算法之歸并排序詳解

    Java經(jīng)典排序算法之歸并排序詳解

    這篇文章主要為大家詳細(xì)介紹了Java經(jīng)典排序算法之歸并排序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • springmvc如何進(jìn)行異常處理

    springmvc如何進(jìn)行異常處理

    這篇文章主要介紹了springmvc如何進(jìn)行異常處理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 淺析Java Mail無法解析帶分號的收件人列表的問題

    淺析Java Mail無法解析帶分號的收件人列表的問題

    JAVA MAIL嚴(yán)格按照RFC 822規(guī)范進(jìn)行操作,沒有對分號做處理。大多數(shù)郵件服務(wù)器都是嚴(yán)格遵循RFC 822規(guī)范的
    2013-08-08
  • hibernate存取json數(shù)據(jù)的代碼分析

    hibernate存取json數(shù)據(jù)的代碼分析

    這篇文章主要介紹了hibernate存取json數(shù)據(jù)的代碼分析,需要的朋友可以參考下
    2017-09-09
  • SpringBoot中定位切點(diǎn)的兩種常用方法

    SpringBoot中定位切點(diǎn)的兩種常用方法

    有時(shí)候,我們使用AOP來進(jìn)行放的增強(qiáng),編寫切面類的時(shí)候,需要定位在哪個(gè)方法上試用該切面進(jìn)行增強(qiáng),本片文章主要講解兩種在SpringBoot中定位切點(diǎn)的方法,感興趣的可以了解一下
    2021-06-06
  • Java實(shí)現(xiàn)多文件壓縮打包的方法

    Java實(shí)現(xiàn)多文件壓縮打包的方法

    這篇文章主要介紹了Java實(shí)現(xiàn)多文件壓縮打包的方法,結(jié)合實(shí)例形式分析了java實(shí)現(xiàn)zip文件壓縮與解壓縮相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • 詳解Idea SpringBoot搭建SpringCloud的準(zhǔn)備工作(推薦)

    詳解Idea SpringBoot搭建SpringCloud的準(zhǔn)備工作(推薦)

    這篇文章主要介紹了Idea SpringBoot搭建SpringCloud的準(zhǔn)備工作(推薦),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • java隨機(jī)抽取指定范圍內(nèi)不重復(fù)的n個(gè)數(shù)

    java隨機(jī)抽取指定范圍內(nèi)不重復(fù)的n個(gè)數(shù)

    這篇文章主要為大家詳細(xì)介紹了java隨機(jī)抽取指定范圍內(nèi)不重復(fù)的n個(gè)數(shù),感興趣的小伙伴們可以參考一下
    2016-02-02
  • java格式化時(shí)間示例

    java格式化時(shí)間示例

    這篇文章主要介紹了java格式化時(shí)間示例,需要的朋友可以參考下
    2014-04-04

最新評論

贵定县| 宁波市| 常州市| 丰顺县| 江城| 库伦旗| 灌云县| 兴隆县| 正镶白旗| 长治市| 三原县| 祁东县| 荔浦县| 海口市| 台州市| 平乡县| 正宁县| 苗栗市| 蕉岭县| 射阳县| 南投市| 淅川县| 东台市| 瑞丽市| 靖安县| 永寿县| 敦化市| 阿克苏市| 南澳县| 五家渠市| 长兴县| 凤山县| 紫云| 兴国县| 肃南| 平潭县| 隆德县| 磐石市| 政和县| 比如县| 大埔区|