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

Java 數(shù)據(jù)結(jié)構(gòu)之時間復(fù)雜度與空間復(fù)雜度詳解

 更新時間:2021年11月05日 14:45:10   作者:Lockey-s  
算法復(fù)雜度分為時間復(fù)雜度和空間復(fù)雜度。其作用: 時間復(fù)雜度是度量算法執(zhí)行的時間長短;而空間復(fù)雜度是度量算法所需存儲空間的大小

算法效率

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

時間復(fù)雜度

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

計算程序運行的時間不能拿簡單的時間來計算,因為不同處理器處理數(shù)據(jù)的能力是不一樣的。所以只算一個大概的次數(shù)就行了,儼然就是算法中的基本操作的執(zhí)行次數(shù)。用大O的漸進(jìn)法來表示

例:計算 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取代運行時間中的所有加法常數(shù)。
2、在修改后的運行次數(shù)函數(shù)中,只保留最高階項。
3、如果最高階項存在且不是1,則去除與這個項目相乘的常數(shù)。得到的結(jié)果就是大O階。

所以使用大 O 的漸進(jìn)法表示之后,func1 的時間復(fù)雜度就是:O(N^2)

算法情況

因為當(dāng)我們用算法計算的時候,會有最好情況和最壞情況和平均情況。我們常說的時間復(fù)雜度在 O(N) 這里的時間復(fù)雜度就是最壞情況。
最好情況就是最小的運行次數(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) 因為根據(jù)時間復(fù)雜度的計算方法,去除常數(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);
}

這里的時間復(fù)雜度是 O(M+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);
}

這個的時間復(fù)雜度是 O(1) 因為循環(huán)里面是常數(shù),所以根據(jù)大 O 漸進(jìn)法,結(jié)果就是 O(1)

計算冒泡排序的時間復(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;
            }
        }
    }
}

因為冒泡排序的特殊性,可能一次就排好了,也可能得一直排到最后,所以就有了最好情況和最壞情況。

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

計算二分查找的時間復(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;
}

因為二分查找是一半一半的找,所以每次查找之后都會把查找范圍減半,比如說在一個 1 - 8 的有序數(shù)組里面查找 8 也就是查找最壞情況。圖示如下:

在這里插入圖片描述

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

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

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

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

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

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

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

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

在這里插入圖片描述

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

在這里插入圖片描述

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

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

空間復(fù)雜度

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

計算冒泡排序的空間復(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;
            }
        }
    }
}

因為冒泡排序的變量并沒有變化,使用的是額外空間是常數(shù),所以空間復(fù)雜度是 O(1) 。

計算斐波那契數(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;
}

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

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

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

因為是遞歸,每次遞歸都會開辟棧幀,每個棧幀占用常數(shù)個空間,所以空間復(fù)雜度就是 O(N) 。

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

相關(guān)文章

  • SpringBoot中@PathVariable、@RequestParam和@RequestBody的區(qū)別和使用詳解

    SpringBoot中@PathVariable、@RequestParam和@RequestBody的區(qū)別和使用詳解

    這篇文章主要介紹了SpringBoot中@PathVariable、@RequestParam和@RequestBody的區(qū)別和使用詳解,@PathVariable 映射 URL 綁定的占位符,通過@RequestMapping注解中的{}占位符來標(biāo)識URL中的變量部分,需要的朋友可以參考下
    2024-01-01
  • 學(xué)習(xí)非阻塞的同步機(jī)制CAS

    學(xué)習(xí)非阻塞的同步機(jī)制CAS

    現(xiàn)代的處理器都包含對并發(fā)的支持,其中最通用的方法就是比較并交換(compare and swap),簡稱CAS。下面我們來一起學(xué)習(xí)一下吧
    2019-05-05
  • 教你如何用Java根據(jù)日期生成流水號

    教你如何用Java根據(jù)日期生成流水號

    這篇文章主要介紹了教你如何用Java根據(jù)日期生成流水號,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • 幾個好用Maven鏡像倉庫地址(小結(jié))

    幾個好用Maven鏡像倉庫地址(小結(jié))

    這篇文章主要介紹了幾個好用Maven鏡像倉庫地址(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 零基礎(chǔ)寫Java知乎爬蟲之準(zhǔn)備工作

    零基礎(chǔ)寫Java知乎爬蟲之準(zhǔn)備工作

    上個系列我們從易到難介紹了如何使用python編寫爬蟲,小伙伴們反響挺大,這個系列我們來研究下使用Java編寫知乎爬蟲,小伙伴們可以對比這看下。
    2014-11-11
  • springboot?vue項目管理后端實現(xiàn)接口新增

    springboot?vue項目管理后端實現(xiàn)接口新增

    這篇文章主要為大家介紹了springboot?vue項目管理后端實現(xiàn)接口新增,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • springboot常用語法庫的基本語法

    springboot常用語法庫的基本語法

    FreeMarker 是一款?模板引擎: 即一種基于模板和要改變的數(shù)據(jù), 并用來生成輸出文本(HTML網(wǎng)頁,電子郵件,配置文件,源代碼等)的通用工具,這篇文章主要介紹了springboot常用語法庫的基本語法,需要的朋友可以參考下
    2022-12-12
  • Java常用數(shù)據(jù)流全面大梳理

    Java常用數(shù)據(jù)流全面大梳理

    計算機(jī)程序中,獲取數(shù)據(jù)的方式有多種,比如:程序中直接給出、鍵盤輸入、從數(shù)據(jù)文件中讀取、從數(shù)據(jù)庫中讀取、通過網(wǎng)絡(luò)讀取等。為了更有效地進(jìn)行數(shù)據(jù)的輸入/輸出操作,Java將各種數(shù)據(jù)源的數(shù)據(jù),抽象為“數(shù)據(jù)流”,及stream
    2021-10-10
  • 一篇文章帶你從java字節(jié)碼層理解i++和++i

    一篇文章帶你從java字節(jié)碼層理解i++和++i

    這篇文章帶你從java字節(jié)碼層理解i++和++i,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-09-09
  • Java中的關(guān)鍵字_動力節(jié)點Java學(xué)院整理

    Java中的關(guān)鍵字_動力節(jié)點Java學(xué)院整理

    關(guān)鍵字也稱為保留字,是指Java語言中規(guī)定了特定含義的標(biāo)示符。對于保留字,用戶只能按照系統(tǒng)規(guī)定的方式使用,不能自行定義
    2017-04-04

最新評論

北票市| 武夷山市| 洪湖市| 波密县| 监利县| 平湖市| 北海市| 都江堰市| 桐柏县| 镇巴县| 康马县| 永丰县| 育儿| 建瓯市| 丘北县| 华阴市| 卫辉市| 龙门县| 精河县| 额尔古纳市| 静乐县| 西乌珠穆沁旗| 镇原县| 日喀则市| 秦安县| 伊宁县| 英山县| 汉寿县| 隆回县| 内黄县| 二手房| 昭平县| 孟州市| 大庆市| 宜川县| 铁力市| 普宁市| 双城市| 龙门县| 景泰县| 绵竹市|