【數據結構 - 時間復雜度和空間復雜度】

文章目錄

  • <center>時間復雜度和空間復雜度
    • 算法的復雜度
      • 時間復雜度
        • 大O的漸進表示法
          • 常見時間復雜度計算舉例
      • 空間復雜度
        • 實例

時間復雜度和空間復雜度

算法的復雜度

??算法在編寫成可執行程序后,運行時需要耗費時間資源和空間(內存)資源 。因此衡量一個算法的好壞,一般是從時間和空間兩個維度來衡量的,即時間復雜度和空間復雜度。
??時間復雜度主要衡量一個算法的運行快慢,而空間復雜度主要衡量一個算法運行所需要的額外空間。在計算機發展的早期,計算機的存儲容量很小。所以對空間復雜度很是在乎。但是經過計算機行業的迅速發展,計算機的存儲容量已經達到了很高的程度。所以我們如今已經不需要再特別關注一個算法的空間復雜度。

時間復雜度

??時間復雜度的定義:在計算機科學中,算法的時間復雜度是一個函數,它定量描述了該算法的運行時間。一個算法執行所耗費的時間,從理論上說,是不能算出來的,只有你把你的程序放在機器上跑起來,才能知道。但是我們需要每個算法都上機測試嗎?是可以都上機測試,但是這很麻煩,所以才有了時間復雜度這個分析方式。一個算法所花費的時間與其中語句的執行次數成正比例,算法中的基本操作的執行次數,為算法的時間復雜度

大O的漸進表示法

?? 大O符號(Big O notation):是用于描述函數漸進行為的數學符號
推導大O階方法:

  1. 用常數1取代運行時間中的所有加法常數。
  2. 在修改后的運行次數函數中,只保留最高階項。
  3. 如果最高階項存在且不是1,則去除與這個項目相乘的常數。得到的結果就是大O階。
常見時間復雜度計算舉例
// 計算Func2的時間復雜度?
void Func2(int N)
{int count = 0;for (int k = 0; k < 2 * N ; ++ k){++count;}int M = 10;while (M--){++count;}printf("%d\n", count);
}// 計算Func3的時間復雜度?
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;}printf("%d\n", count);
}// 計算Func4的時間復雜度?
void Func4(int N)
{int count = 0;for (int k = 0; k < 100; ++ k){++count;}printf("%d\n", count);
}
  1. 實例1基本操作執行了2N+10次,通過推導大O階方法知道,時間復雜度為 O(N)
  2. 實例2基本操作執行了M+N次,有兩個未知數M和N,時間復雜度為 O(N+M)
  3. 實例3基本操作執行了10次,通過推導大O階方法,時間復雜度為 O(1)

空間復雜度

??空間復雜度也是一個數學表達式,是對一個算法在運行過程中臨時占用存儲空間大小的量度 。
空間復雜度不是程序占用了多少bytes的空間,因為這個也沒太大意義,所以空間復雜度算的是變量的個數。空間復雜度計算規則基本跟實踐復雜度類似,也使用大O漸進表示法。
注意:函數運行時所需要的棧空間(存儲參數、局部變量、一些寄存器信息等)在編譯期間已經確定好了,因此空間復雜度主要通過函數在運行時候顯式申請的額外空間來確定。

實例
// 計算BubbleSort的空間復雜度?
void BubbleSort(int* a, int n)
{assert(a);for (size_t end = n; end > 0; --end){int exchange = 0;for (size_t i = 1; i < end; ++i){if (a[i-1] > a[i]){Swap(&a[i-1], &a[i]);exchange = 1;}}if (exchange == 0)break;}
}// 計算Fibonacci的空間復雜度?
// 返回斐波那契數列的前n項
long long* Fibonacci(size_t n)
{if(n==0)return NULL;long long * fibArray = (long long *)malloc((n+1) * sizeof(long long));fibArray[0] = 0;fibArray[1] = 1;for (int i = 2; i <= n ; ++i){fibArray[i] = fibArray[i - 1] + fibArray [i - 2];}return fibArray;
}// 計算階乘遞歸Fac的空間復雜度?
long long Fac(size_t N)
{if(N == 0)return 1;return Fac(N-1)*N;
}
  1. 實例1使用了常數個額外空間,所以空間復雜度為 O(1)
  2. 實例2動態開辟了N個空間,空間復雜度為 O(N)
  3. 實例3遞歸調用了N次,開辟了N個棧幀,每個棧幀使用了常數個空間。空間復雜度為O(N)

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

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

相關文章

[leetcode]longest-arithmetic-subsequence-of-given-difference. 最長定差子序列

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int longestSubsequence(vector<int> &arr, int difference) {int ans 0;unordered_map<int, int> dp;for (int v: arr) {dp[v] dp[v - difference] 1;ans max(ans, dp[v]);}return ans…

Qt源碼分析:窗體繪制與響應

作為一套開源跨平臺的UI代碼庫&#xff0c;窗體繪制與響應自然是最為基本的功能。在前面的博文中&#xff0c;已就Qt中的元對象系統(反射機制)、事件循環等基礎內容進行了分析&#xff0c;并捎帶闡述了窗體響應相關的內容。因此&#xff0c;本文著重分析Qt中窗體繪制相關的內容…

ECharts 快速入門

文章目錄 1. 引入 ECharts2. 初始化 ECharts 實例3. 配置圖表選項4. 使用配置項生成圖表5. 最常用的幾種圖形5.1 柱狀圖&#xff08;Bar Chart&#xff09;5.2 折線圖&#xff08;Line Chart&#xff09;5.3 餅圖&#xff08;Pie Chart&#xff09;5.4 散點圖&#xff08;Scatt…

如何完成域名解析驗證

一&#xff1a;什么是DNS解析&#xff1a; DNS解析是互聯網上將人類可讀的域名&#xff08;如www.example.com&#xff09;轉換為計算機可識別的IP地址&#xff08;如192.0.2.1&#xff09;的過程&#xff0c;大致遵循以下步驟&#xff1a; 查詢本地緩存&#xff1a;當用戶嘗…

Linux內核 -- 多線程之完成量completion的使用

Linux Kernel Completion 使用指南 在Linux內核編程中&#xff0c;completion是一個用于進程同步的機制&#xff0c;常用于等待某個事件的完成。它提供了一種簡單的方式&#xff0c;讓一個線程等待另一個線程完成某項任務。 基本使用方法 初始化 completion結構需要在使用之…

順序串算法庫構建

學習賀利堅老師順序串算法庫 數據結構之自建算法庫——順序串_創建順序串s1,創建順序串s2-CSDN博客 本人詳細解析博客 串的概念及操作_串的基本操作-CSDN博客 版本更新日志 V1.0: 在賀利堅老師算法庫指導下, 結合本人詳細解析博客思路基礎上,進行測試, 加入異常彈出信息 v1.0補…

已解決java.awt.geom.NoninvertibleTransformException:在Java2D中無法逆轉的轉換的正確解決方法,親測有效!!!

已解決java.awt.geom.NoninvertibleTransformException&#xff1a;在Java2D中無法逆轉的轉換的正確解決方法&#xff0c;親測有效&#xff01;&#xff01;&#xff01; 目錄 問題分析 出現問題的場景 報錯原因 解決思路 解決方法 1. 檢查縮放因子 修改后的縮放變換 …

關鍵路徑——C語言(理論)

關鍵路徑&#xff0c;是項目網絡中從起始事件到終止事件的最長路徑&#xff0c;決定了項目的最短完成時間。 關鍵路徑中的任務沒有任何可調整的余地&#xff0c;如果任何一個任務被延遲&#xff0c;整個項目的完成時間也會被延遲。 假設我們現在有一個圖&#xff1a;把圖的邊…

node編譯打包Error: error:0308010C:digital envelope routines::unsupported

問題描述&#xff1a; 報錯&#xff1a;Error: error:0308010C:digital envelope routines::unsupported 報錯原因&#xff1a; 主要是因為 nodeJs V17 版本發布了 OpenSSL3.0 對算法和秘鑰大小增加了更為嚴格的限制&#xff0c;nodeJs v17 之前版本沒影響&#xff0…

【CH32V305FBP6】USBD HS 虛擬串口分析

文章目錄 前言分析端點 0USBHS_UIS_TOKEN_OUT 端點 2USBHS_UIS_TOKEN_OUTUSBHS_UIS_TOKEN_IN 前言 虛擬串口&#xff0c;端口 3 單向上報&#xff0c;端口 2 雙向收發。 分析 端點 0 USBHS_UIS_TOKEN_OUT 設置串口參數&#xff1a; 判斷 USBHS_SetupReqCode CDC_SET_LIN…

玩轉HarmonyOS NEXT之配置文件篇

配置文件概述 本文以Stage模型為例&#xff0c;詳細介紹了HarmonyOS NEXT應用的各種配置文件&#xff0c;這些配置文件會向編譯工具、操作系統和應用市場提供應用的基本信息。 在基于Stage模型開發的應用項目代碼下&#xff0c;都存在一個app.json5的配置文件、以及一個或者多…

從零開始實現大語言模型(一):概述

1. 前言 大家好&#xff0c;我是何睿智。我現在在做大語言模型相關工作&#xff0c;我用業余時間寫一個專欄&#xff0c;給大家講講如何從零開始實現大語言模型。 從零開始實現大語言模型是了解其原理及領域大語言模型實現路徑的最好方法&#xff0c;沒有之一。已有研究證明&…

《昇思25天學習打卡營第07天|函數式自動微分》

函數式自動微分 環境配置 # 實驗環境已經預裝了mindspore2.2.14&#xff0c;如需更換mindspore版本&#xff0c;可更改下面mindspore的版本號 !pip uninstall mindspore -y !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore2.2.14 import numpy as np imp…

Windows10錄屏,教你3個方法,簡單快速錄屏

“我的電腦系統是Windows10的系統&#xff0c;今晚要進行線上開會&#xff0c;但我實在有事沒辦法參加會議&#xff0c;想把會議的內容錄制下來方便我后續觀看。但卻找不到電腦錄屏功能在哪里打開&#xff1f;求助一下&#xff0c;誰能幫幫我&#xff1f;” 在數字化時代&…

mysql 命令 —— 查看表信息(show table status)

查詢表信息&#xff0c;如整個表的數據量大小、表的索引占用空間大小等 1、查詢某個庫下面的所有表信息&#xff1a; SHOW TABLE STATUS FROM your_database_name;2、查詢指定的表信息&#xff1a; SHOW TABLE STATUS LIKE your_table_name;如&#xff1a;Data_length 顯示表…

閑聊 .NET Standard

前言 有時候&#xff0c;我們從 Nuget 下載第三方包時&#xff0c;會看到這些包的依賴除了要求 .NET FrameWork、.NET Core 等的版本之外&#xff0c;還會要求 .NET Standard 的版本&#xff0c;比如這樣&#xff1a; 這個神秘的 .NET Standard 是什么呢&#xff1f; .NET St…

【算法】字母異位詞分組

題目&#xff1a;字母異位詞分組 給你一個字符串數組&#xff0c;請你將 字母異位詞 組合在一起。可以按任意順序返回結果列表。 字母異位詞 是由重新排列源單詞的所有字母得到的一個新單詞。 示例 1: 輸入: strs [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] …

從零開始搭建spring boot多模塊項目

一、搭建父級模塊 1、打開idea,選擇file–new–project 2、選擇Spring Initializr,選擇相關java版本,點擊“Next” 3、填寫父級模塊信息 選擇/填寫group、artifact、type、language、packaging(后面需要修改)、java version(后面需要修改成和第2步中版本一致)。點擊“…

【0300】Postgres內核動態哈希表實現機制(1)

相關文章&#xff1a; 【0299】Postgres內核之哈希表&#xff08;Hash Tables&#xff09; 0 概述 在【0299】Postgres內核之哈希表&#xff08;Hash Tables&#xff09;一文中&#xff0c;講解了哈希表的作用、實現、優缺點等特性。本文開始&#xff0c;將詳細分析Postgres內…

MySQL之應用層優化(三)

應用層優化 應用層緩存 2.本地共享內存緩存 這種緩存一般是中等大小(幾個GB)&#xff0c;快速&#xff0c;難以在多臺機器間同步。它們對小型的半靜態位數據比較合適。例如每個州的城市列表&#xff0c;分片數據存儲的分區函數(映射表)&#xff0c;或者使用存活時間(TTL)策略…