欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java 關于時間復雜度和空間復雜度的深度刨析

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

1.算法效率

算法效率

算法效率分析分為兩種:第一種是時間效率,第二種是空間效率。時間效率被稱為時間復雜度,而空間效率被稱作空間復雜度。

時間復雜度主要衡量的是一個算法的運行速度,而空間復雜度主要衡量一個算法所需要的額外空間

如今我們更關注的是時間復雜度,而對空間復雜度已不再關注。

2.時間復雜度

2.1時間復雜度的概念

時間復雜度的定義:在計算機科學中,算法的時間復雜度是一個函數(shù),它定量描述了該算法的運行時間。

一個算法所花費的時間與其中語句的執(zhí)行次數(shù)成正比例,因此算法中的基本操作的執(zhí)行次數(shù),為算法的時間復雜度

2.2大O的漸進表示法

請看如下代碼:

// 請計算一下func1基本操作執(zhí)行了多少次?
void func1(int N){
   int count = 0;
   for (int i = 0; i < N ; i++) {
       for (int j = 0; j < N ; j++) {//N^2次
           count++;
       }
   }
   for (int k = 0; k < 2 * N ; k++) {//2N次
       count++;
   }
   int M = 10;
   while ((M--) > 0){//10次
       count++;
   }
    System.out.println(count);
}

F(N) = N^2 + 2N + 10
Func1 執(zhí)行的基本操作次數(shù) :
N = 10 , F(N) = 130
N = 100 , F(N) = 10210
N = 1000 , F(N) = 1002010

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

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

推導大O階方法:

  • 用常數(shù)1取代運行時間中的所有加法常數(shù)。
  • 在修改后的運行次數(shù)函數(shù)中,只保留最高階項。
  • 如果最高階項存在且不是1,則去除與這個項目相乘的常數(shù)。得到的結果就是大O階。

使用大O的漸進表示法以后,F(xiàn)unc1的時間復雜度為 O(N^2)

另外有些算法的時間復雜度存在最好、平均和最壞情況:
最壞情況:任意輸入規(guī)模的最大運行次數(shù)(上限)
平均情況:任意輸入規(guī)模的期望運行次數(shù)
最好情況:任意輸入規(guī)模的最小運行次數(shù)

在實際中一般情況關注的是算法的最壞運行情況,所以數(shù)組中搜索數(shù)據(jù)時間復雜度為O(N)

2.3常見時間復雜度計算

2.3.1常用的時間復雜度量級

時間復雜度

2.3.2常見示例舉例

2.3.1.1計算 bubbleSort 的時間復雜度

// 計算bubbleSort的時間復雜度?
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;
       }
   }
}

2.3.1.2計算 binarySearch 的時間復雜度

// 計算binarySearch的時間復雜度?
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; }

2.3.1.3計算階乘遞歸 factorial 的時間復雜度

// 計算階乘遞歸factorial的時間復雜度?
long factorial(int N) {
    return N < 2 ? N : factorial(N-1) * N;
}

2.3.1.4計算斐波那契遞歸 fibonacci 的時間復雜度

// 計算斐波那契遞歸fibonacci的時間復雜度?
int fibonacci(int N){
    return N < 2 ? N : fibonacci(N-1)+fibonacci(N-2);
}

2.3.2示例答案及分析

2.3.2.1 bubbleSort 的時間復雜度

實例4基本操作執(zhí)行最好N次,最壞執(zhí)行了(N*(N-1))/2次,通過推導大O階方法+時間復雜度一般看最壞,時間復雜度為 O(N^2)

2.3.2.2 binarySearch 的時間復雜度

實例5基本操作執(zhí)行最好1次,最壞O(logN)次,時間復雜度為 O(logN) ps:logN在算法分析中表示是底數(shù)為2,對數(shù)為N。有些地方會寫成lgN。(建議通過折半查找的方式講解logN是怎么計算出來的)(因為二分查找每次排除掉一半的不適合值,一次二分剩下:n/2/2=4)

2.3.2.3 階乘遞歸 factorial 的時間復雜度

遞歸的時間復雜度=遞歸的次數(shù)*每次遞歸的次數(shù)

實例6通過計算分析發(fā)現(xiàn)基本操作遞歸了N次,時間復雜度為O(N)

2.3.2.4 斐波那契遞歸 fibonacci 的時間復雜度

實例7通過計算分析發(fā)現(xiàn)基本操作遞歸了2^N次 ,時間復雜度為 O(2^N)

3.空間復雜度

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

示例1:計算 bubbleSort 的空間復雜度?

// 計算bubbleSort的空間復雜度?
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;
     }
 }
}

實例1使用了常數(shù)個額外空間,所以空間復雜度為 O(1)
示例2:

// 計算fibonacci的空間復雜度?
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;
}

實例2動態(tài)開辟了N個空間,空間復雜度為 O(N)
示例3:

// 計算階乘遞歸Factorial的時間復雜度?
long factorial(int N) {
    return N < 2 ? N : factorial(N-1)*N;
}

實例3遞歸調用了N次,開辟了N個棧幀,每個棧幀使用常數(shù)的空間,空間復雜度為 O(N)

以上就是Java 關于時間復雜度和空間復雜度的深度刨析的詳細內(nèi)容,更多關于Java 時間復雜度和空間復雜度的資料請關注腳本之家其它相關文章!

相關文章

  • 公司一般使用的分布式RPC框架及其原理面試

    公司一般使用的分布式RPC框架及其原理面試

    這篇文章主要為大家介紹了公司一般使用的分布式RPC框架及其原理的面試問題解答,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-03-03
  • MybatisPlus查詢條件為空字符串或null問題及解決

    MybatisPlus查詢條件為空字符串或null問題及解決

    這篇文章主要介紹了MybatisPlus查詢條件為空字符串或null問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Mybatis注解開發(fā)單表、多表操作的實現(xiàn)代碼

    Mybatis注解開發(fā)單表、多表操作的實現(xiàn)代碼

    這篇文章主要介紹了Mybatis高級:Mybatis注解開發(fā)單表操作,Mybatis注解開發(fā)多表操作,構建sql語句,綜合案例學生管理系統(tǒng)使用接口注解方式優(yōu)化,需要的朋友可以參考下
    2021-02-02
  • Java通過CMD方式讀取注冊表任意鍵值對代碼實踐

    Java通過CMD方式讀取注冊表任意鍵值對代碼實踐

    這篇文章主要介紹了Java通過CMD方式讀取注冊表任意鍵值對代碼實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,,需要的朋友可以參考下
    2019-06-06
  • 詳解Java的Hibernate框架中的Interceptor和Collection

    詳解Java的Hibernate框架中的Interceptor和Collection

    這篇文章主要介紹了Java的Hibernate框架中的Interceptor和Collection,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2016-01-01
  • java實現(xiàn)快速排序的方法

    java實現(xiàn)快速排序的方法

    這篇文章主要介紹了java實現(xiàn)快速排序的方法,涉及java排序的相關操作技巧,需要的朋友可以參考下
    2015-05-05
  • 詳解SpringBoot通用配置文件(不定時更新)

    詳解SpringBoot通用配置文件(不定時更新)

    這篇文章主要介紹了SpringBoot通用配置文件詳解(不定時更新),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • 基于JAVA中Jersey處理Http協(xié)議中的Multipart的詳解

    基于JAVA中Jersey處理Http協(xié)議中的Multipart的詳解

    之前在基于C#開發(fā)彩信用最原始的StringBuilder拼接字符串方式處理過Multipart?,F(xiàn)在在做一個項目的時候,由于之前的技術路線都是使用Jersey處理Http這塊,為了保持技術路線一致,研究了一下如何使用Jersey處理Http協(xié)議中的Multipart
    2013-05-05
  • 解析Spring?漏洞及其修復方案

    解析Spring?漏洞及其修復方案

    官宣了最近網(wǎng)傳的Spring漏洞。攻擊者利用該漏洞,可在未授權的情況下遠程執(zhí)行命令,今天通過本文給大家普及下漏洞分析影響范圍及解決方案,感興趣的朋友跟隨小編一起看看吧
    2022-04-04
  • 一起來學習JAVA的運算符

    一起來學習JAVA的運算符

    這篇文章主要為大家詳細介紹了JAVA的運算符,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03

最新評論