01-數據結構概述和時間空間復雜度

數據結構概述和時間空間復雜度

1. 什么是數據結構

數據結構(Data Structure)是計算機存儲、組織數據的方式,指相互之間存在一種或多種特定關系的數據元素的集合。

2. 什么是算法

算法(Algorithm)就是定義良好的計算過程,他取一個或一組值最為輸入,并產生一個或一組值作為輸出。簡單來說就是一系列的計算步驟,用來將輸入的數據轉化成輸出結果。

3. 算法效率

算法在編寫成可執行程序后,運行需要耗費時間資源和空間資源。因此衡量一個算法的好壞一般是從時間和空間兩個維度來衡量的,即時間復雜度和空間復雜度。

時間復雜度主要衡量一個算法的快慢,而空間復雜度主要衡量一個算法運行所需要的額外空間。在計算機發展的早期,計算機的存儲容量很小。所以對空間復雜度很是在乎。但是經計算機行業的迅速發展,計算機存儲容量已經到達了很高的程度。所以我們如今不太需要太過于關注一個算法的空間復雜度(但是大的離譜的情況還是要注意一下的)。

4. 時間復雜度

4.1 時間復雜度的概念

時間復雜度的定義:在計算機科學中,算法的時間復雜度是一個函數,它定量描述了該算法運行起來的時間。一個算法執行所耗費的時間,從理論上來說,是算不出來的,因為每次計算的時間都與計算機的性能和輸入的數據的復雜程度有關。所以為了分析算法耗費的時間,就有了時間復雜度這個分析方式。一個算法所消耗的時間與其中的語句執行次數成正比,算法中的基本操作的執行次數,為算法的時間復雜度

即:找到某條基本語句與問題規模N之間的數學表達式,就是算出了該算法的時間復雜度。

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--){++count;}printf("%d\n", count);
}

我們可以計算上面代碼中Func1執行的基本操作次數: F ( N ) = N 2 + 2 ? N + 10 F(N)=N^2+2*N+10 F(N)=N2+2?N+10

  • N = 10 F(N) = 130
  • N = 100 F(N) = 10210
  • N = 1000 F(N) = 1002010

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

4.2 大O的漸進表示法

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

推導大O階方法:

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

上面的 F ( N ) = N 2 + 2 ? N + 10 F(N)=N^2+2*N+10 F(N)=N2+2?N+10使用大O階漸進表示法以后就是: O ( N 2 ) O(N^2) O(N2)

另外,一個算法的時間復雜度可能存在最好、平均、最壞三種情況:

  • 最壞情況:任意輸入規模的最大運行次數(上界)。
  • 平均情況:任意輸入規模的期望運行次數。
  • 最好情況:任意輸入規模的最小運行次數(下界)。

在實際中一般情況關注的是算法的最壞運行情況。

5. 空間復雜度

空間復雜度和時間復雜度類似,也是一個數學表達式,是對一個算法在運行過程中臨時占用存儲空間大小的量度

空間復雜度不是程序占用了多少比特的空間,而是變量的個數,空間復雜度的計算規則和時間復雜度類似,也使用大O漸進表示法

函數運行時所需要的棧空間(存儲參數、局部變量、一些寄存器信息等)在編譯期間已經確定好了,因此空間復雜度主要通過函數在運行時候顯式申請的額外空間來確定。

6. 常見的復雜度對比

復雜度表達式大O漸進表示法數量級
5201314 5201314 5201314 O ( 1 ) O(1) O(1)常數階
3 N + 4 3N+4 3N+4 O ( N ) O(N) O(N)線性階
3 N 2 + 4 N + 5 3N^2+4N+5 3N2+4N+5 O ( N 2 ) O(N^2) O(N2)平方階
3 l o g 2 N + 4 3log_2N+4 3log2?N+4 O ( l o g N ) O(logN) O(logN)對數階
2 N + 3 l o g 2 N + 14 2N+3log_2N+14 2N+3log2?N+14 O ( N l o g N ) O(NlogN) O(NlogN)NlogN階
N 3 + 2 N 2 + 6 N^3+2N^2+6 N3+2N2+6 O ( N 3 ) O(N^3) O(N3)立方階
2 n 2^n 2n O ( 2 N ) O(2^N) O(2N)指數階

在這里插入圖片描述

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

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

相關文章

大數據架構選型全景指南:核心架構對比與實戰案例 解析

目錄 大數據架構選型全景指南&#xff1a;核心架構對比與實戰案例解析1. 主流架構全景概覽1.1 核心架構類型1.2 關鍵選型維度 2. 架構對比與選型矩陣2.1 主流架構對比表2.2 選型決策樹 3. 案例分析與實現案例1&#xff1a;電商實時推薦系統&#xff08;Lambda架構&#xff09;案…

(51單片機)LCD顯示紅外遙控相關數字(Delay延時函數)(LCD1602教程)(Int0和Timer0外部中斷教程)(IR紅外遙控模塊教程)

前言&#xff1a; 本次Timer0模塊改裝了一下&#xff0c;注意&#xff01;&#xff01;&#xff01;今天只是簡單的實現一下&#xff0c;明天用次功能顯示遙控密碼鎖 演示視頻&#xff1a; 在審核 源代碼&#xff1a; 如上圖將9個文放在Keli5 中即可&#xff0c;然后燒錄在…

網絡實驗-防火墻雙機熱備份

實驗目的 了解防火墻雙機熱備份配置&#xff0c;提供部署防火墻可靠性。 網絡拓撲 左側為trust域&#xff0c;右側為untrust域。防火墻之間配置雙機熱備份。 配置內容 master VRRP 由于防火墻是基于會話表匹配回程流量&#xff0c;流量去向和回程必須通過同一個防火墻。…

【2025最新】VSCode Cline插件配置教程:免費使用Claude 3.7提升編程效率

 ?2025年最新VSCode Cline插件安裝配置教程&#xff0c;詳解多種免費使用Claude 3.7的方法&#xff0c;集成DeepSeek-R1與5大實用功能&#xff0c;專業編程效率提升指南。 Cline是VSCode中功能最強大的AI編程助手插件之一&#xff0c;它能與Claude、OpenAI等多種大模型無縫集…

考研英一真題學習筆記 2018年

2018 年全國碩士研究生招生考試 英語 &#xff08;科目代碼&#xff1a;201&#xff09; Section Ⅰ Use of English Directions: Read the following text. Choose the best word(s) for each numbered blank and mark A, B, C or D on the ANSWER SHEET. (10 points) Trust i…

華碩服務器-品類介紹

目錄 一、核心產品線解析 1. 機架式服務器 2. 塔式服務器 3. 高密度計算服務器 二、關鍵技術與模組配置 1. 主板與管理模塊 2. 電源與散熱 3. 存儲與網絡 三、應用場景與行業解決方案 1. 人工智能與高性能計算 2. 云計算與虛擬化 3. 邊緣計算與工業物聯網 一、核心…

硅基計劃2.0 學習總結 貳

一、程序邏輯控制&#xff08;順序、選擇&循環&#xff09; 順序結構就不多介紹了&#xff0c;就是各個語句按照先后順序進行執行 &#xff08;1&#xff09;選擇結構 三大選擇類型&#xff1a;if、if-else、if-else if-else以及懸浮else的問題 基本已經在之前在C語言文章…

RabbitMQ最新入門教程

文章目錄 RabbitMQ最新入門教程1.什么是消息隊列2.為什么使用消息隊列3.消息隊列協議4.安裝Erlang5.安裝RabbitMQ6.RabbitMQ核心模塊7.RabbitMQ六大模式7.1 簡單模式7.2 工作模式7.3 發布訂閱模式7.4 路由模式7.5 主題模式7.6 RPC模式 8.RabbitMQ四種交換機8.1 直連交換機8.2 主…

工具學習_VirusTotal使用

VirusTotal Intelligence 允許用戶在其龐大的數據集中進行搜索&#xff0c;以查找符合特定條件的文件&#xff0c;例如哈希值、殺毒引擎檢測結果、元數據信息、提交時的文件名、文件結構特征、文件大小等。可以說&#xff0c;它幾乎是惡意軟件領域的“谷歌搜索引擎”。 網頁使…

計算機系統----軟考中級軟件設計師(自用學習筆記)

目錄 1、計算機的基本硬件系統 2、CPU的功能 3、運算器的組成 4、控制器 5、計算機的基本單位 6、進制轉換問題 7、原碼、反碼、補碼、移碼 8、浮點數 9、尋址方式 10、奇偶校驗碼 11、海明碼 12、循環冗余校驗碼 13、RISC和CISC 14、指令的處理方式 15、存儲器…

揚州卓韻酒店用品:優質洗浴用品,提升酒店滿意度與品牌形象

在酒店提供的服務里&#xff0c;沐浴用品占據了非常重要的地位&#xff0c;其質量與種類直接關系到客人洗澡時的感受。好的沐浴用品能讓客人洗澡時感到舒心和快樂&#xff0c;反之&#xff0c;質量不好的用品可能會影響客人整個住宿期間的愉悅心情。挑選恰當的洗浴用品不僅能夠…

學習筆記:黑馬程序員JavaWeb開發教程(2025.4.5)

12.4 登錄認證-登錄校驗-會話跟蹤方案一 設置cookie&#xff0c;服務器給瀏覽器響應數據&#xff0c;通過control方法形參當中獲取response&#xff0c;調用response當中的addCookie方法實現 獲取cookie&#xff0c;調用getCookie方法 用戶可以通過瀏覽器設置禁用cookie 跨域…

進程替換講解

1. 基本概念 1.1 進程替換 vs. 進程創建 進程創建&#xff1a;使用fork()或clone()等系統調用創建一個新的子進程&#xff0c;子進程是父進程的副本&#xff0c;擁有相同的代碼和數據。進程替換&#xff1a;使用exec系列函數在當前進程中加載并執行一個新的程序&#xff0c;替…

【微服務】SpringBoot + Docker 實現微服務容器多節點負載均衡詳解

目錄 一、前言 二、前置準備 2.1 基本環境 2.2 準備一個springboot工程 2.2.1 準備幾個測試接口 2.3 準備Dockerfile文件 2.4 打包上傳到服務器 三、制作微服務鏡像與運行服務鏡像 3.1 拷貝Dockerfile文件到服務器 3.2 制作服務鏡像 3.3 啟動鏡像服務 3.4 訪問一下服…

1.2.2.1.4 數據安全發展技術發展歷程:高級公鑰加密方案——同態加密

引言 在密碼學領域&#xff0c;有一種技術被圖靈獎得主、著名密碼學家Oded Goldreich譽為"密碼學圣杯"&#xff0c;那就是全同態加密&#xff08;Fully Homomorphic Encryption&#xff09;。今天我們就來聊聊這個神秘而強大的加密方案是如何從1978年的概念提出&…

vllm量化03—INT4 W4A16

本系列基于Qwen2.5-7B&#xff0c;學習如何使用vllm量化&#xff0c;并使用benchmark_serving.py、lm_eval 測試模型性能和評估模型準確度。 測試環境為&#xff1a; OS: centos 7 GPU: nvidia l40 driver: 550.54.15 CUDA: 12.3本文是該系列第3篇——INT4 W4A16 一、量化 f…

第二十五天打卡

常見報錯類型 try-except-else-finally 語句 首先執行try語句&#xff0c;若正確直接執行else語句 若try語句發生錯誤&#xff0c;則判斷錯誤類型&#xff0c;執行錯誤類型對應的except語句&#xff0c;不執行else語句 finally語句無條件執行&#xff0c;多用于資源保存&…

城市掃街人文街頭紀實膠片電影感Lr調色預設,DNG/手機適配濾鏡!

調色詳情 城市掃街人文街頭紀實膠片電影感 Lr 調色是通過 Lightroom&#xff08;Lr&#xff09;軟件&#xff0c;對城市街頭抓拍的人文紀實照片進行后期調色處理。旨在賦予照片如同膠片拍攝的質感以及電影般濃厚的敘事氛圍&#xff0c;不放過每一個日常又珍貴的瞬間&#xff0c…

【hadoop】Kafka 安裝部署

一、Kafka安裝與配置 步驟&#xff1a; 1、使用XFTP將Kafka安裝包kafka_2.12-2.8.1.tgz發送到master機器的主目錄。 2、解壓安裝包&#xff1a; tar -zxvf ~/kafka_2.12-2.8.1.tgz 3、修改文件夾的名字&#xff0c;將其改為kafka&#xff0c;或者創建軟連接也可&#xff1…

UDP 多點通信

一、setsockopt/getsockopt 函數詳解 1. 函數原型 c #include <sys/socket.h> int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);…