數據結構之復雜度

數據結構的理解

數據本身是雜亂無章的,需要結構進行增刪查改等操作更好的管理數據;

比如:在程序中需要將大量的代碼(數據)通過結構進行管理;
再比如:定義1000個整型變量的數組,我們可以對數組進行刪除某一個數據,在某一個數據后面插入新的數據等等操作。這些都是數據結構的體現。

數據結構是用來在計算機中存儲和管理數據的,這種存儲和管理的方式有很多種,我們后面會一一學到比如:線性表、數、圖、哈希等

數組是最基礎的數據結構;

算法理解

算法是一個良好計算的過程,我們可以將數據結構作為放著數據的容器,而算法就是用來如何才能讓我們良好的從容器中獲取和管理數據的這么一個過程就叫做算法

因此:有數據結構的地方就有算法,數據結構和算法不分家

算法重要性

在筆試和面試中是必考的,是以編程題的形式進行考察,我們要好好磨礪算法,做到手撕代碼 <:

學好算法秘籍:

1.死磕代碼
2.遇到算法題莫慌,帶著思考進行畫圖。
3.看關于算法和數據結構的書藉
4.使用各大OJ平臺進行刷題(用OJ平臺刷題的魅力:只需要寫入內部的邏輯代碼即可,其他的平臺都已經定義好了)

自己下去將輪轉數組進行單獨實現
如何衡量算法的好壞呢? ----->用復雜度進行衡量

復雜度理解

而復雜度又包含時間復雜度和空間復雜度
時間復雜度主要衡量一個算法的運行快慢;
空間復雜度主要衡量一個算法運行所需要的額外空間
隨著時代的發展,我們對空間的關注已經不是大頭了,時間才是,注意不是不關注!(也就是摩爾定律)

時間復雜度理解

時間復雜度是一個函數表達式T(N),這個與數學中的定義的一次函數和二次函數是一樣的,它是用來衡量程序的運行效率。它是一個粗估的值,不是精確的值。
為什么不去計算程序的運行時間呢?

1.因為程序的運行時間和編譯環境和運行機器的配置都有關系,
比如:同一個算法程序,用一個老的編譯器進行編譯和新的編譯器編譯,在同樣的運行機器下程序運行時間不同
2.同一個算法程序,在不同的運行機器下(在一個老低配置機器和新高配置機器的情況下)使用同一個編譯器進行編譯,程序運行時間也會不一樣
3. 并且計算程序的運行時間只能在程序運行之后才能知道,不能在寫程序之前就知道大概的運行時間是多少。

總結:程序的運行時間是不確定的

時間復雜度T(N)到底怎么去計算呢?
T(N) = 每條語句的運行時間 * 運行次數
前面我們知道運行時間是不確定的,所以將運行時間去掉,所以
T(N) = 程序的運行次數

在這里插入圖片描述

這個程序的時間復雜度T(N) = N^2 + 2N + 10
因為2N + 10 對時間復雜度的影響很小,所以忽略不計,最終:T(N) = N^2

因此,對于時間復雜度來說,是一個粗估的值,爭對這種情況,我們有了大O的漸進表示法的計算法則進行計算

大O的漸進表示法

大O的計算規則:

  1. 時間復雜度T(N) 中,只保留最高項,去掉最低項,包括常數項
  2. 如果最高項的常數系數存在且不是1,則去除這個項目的常數系數
  3. 如果T(N) 中只有常數項,用常數1代表所有的加法常數。 O(1)來表示

判斷高階項的方法:對結果影響最大就是高階項

大O的漸進表示法在空間和時間上都可以用
時間復雜度舉例:

以下是常見時間復雜度的計算:

在這里插入圖片描述
T(N) = 2N + 10 根據法則2:O(N)
在這里插入圖片描述
如果T(N) 中存在兩個變量,不確定這兩個變量的大小,則這兩個變量都可以表示,例如:O(M + N), M 和 N 都是變量,具體看題目中是如何定義M和N 的大小,比如:M >> N, 則為O(M),反之則為O(N);在有一種情況就是M == N, 則為O(M+N)。
在這里插入圖片描述
T(N) = 100, 根據法則3:O(1)

請寫出查找字符長度的時間復雜度
在這里插入圖片描述

這里T(N) 的大小取決于你所要查找的位置,
比如:
查找的字符的位置在最后一個位置,則為O(N)
查找的字符的位置在第一個位置,則為O(1)
查找的字符的位置在中間位置,則為O(1/2 * N) = O(N)

最好情況: O(1)
最壞情況: O(N)
平均情況: O(N)

總結 通過上面我們會發現,有些算法的時間復雜度存在最好、平均和最壞情況。 最壞情況:任意輸入規模的最大運行次數(上界)
平均情況:任意輸入規模的期望運行次數 最好情況:任意輸入規模的最小運行次數(下界)
大O的漸進表示法在實際中一般情況關注的是算法的上界,也就是最壞運行情況。

在看看冒泡排序的時間復雜度:
在這里插入圖片描述
因此,我們取得是上界的情況:O(N^2)

再看看這道題
在這里插入圖片描述

這里需要注意的是:
課件中和書籍中 log2 n 、 log n 、 lg n 的表示
當n接近?窮?時,底數的??對結果影響不?。因此,?般情況下不管底數是多少都可以省略不 寫,即可以表?為 log n
不同書籍的表??式不同,以上寫法差別不?,我們建議使? log n
還有一個原因是:鍵盤中敲不出底數

在這里插入圖片描述

到這里時間復雜度的計算就夠夠用了

空間復雜度

空間復雜度計算規則基本跟時間復雜度類似,也使??O漸進表?法。
注意:我們計算空間復雜度時只計算函數運?時所需要的棧空間,存儲參數、局部變量、?些寄存器信息和非遞歸函數調用的棧幀等都是在函數運行時的內容。
因此空間復雜度主要通過函數在運?時候顯式申請的額外空間來確定,也就是函數定義的下面那一部分

以下是常見的空間復雜度的計算:
在這里插入圖片描述
在這里插入圖片描述

常見的空間復雜度計算

通過動態內存申請內容也會涉及到空間復雜度的計算
例如:
在這里插入圖片描述

常?復雜度對?:

在這里插入圖片描述
在這里插入圖片描述
總結:隨著n的增加,各種的復雜度的變化趨勢也大不相同;隨著n的增加,變化越緩的復雜度代表著在程序運行時的效率高;越陡的效率低

關于復雜度的相關算法題:

輪轉數組

思路1:

	時間復雜度 O(n^2)循環K次將數組所有元素向后移動?位(代碼不通過)

在這里插入圖片描述

核心代碼如下:

void rotate(int* nums, int numsSize, int k) {while(k--)//直到輪轉結束后就停止{int end = nums[numsSize-1];for(int i = numsSize - 1; i > 0; i--)//這里是整體向后移的操作,起始位置在最后一位,直到將第一個數據移到第二位后就結束{nums[i] = nums[i - 1];//將一位的數據移到后一位}nums[0] = end;//將最后的移到第一位}
}

在這里插入圖片描述

思路2:

空間復雜度 O(n)
申請新數組空間,先將后k個數據放到新數組中,再將剩下的數據挪到新數組中
在這里插入圖片描述

核心代碼:

void rotate(int* nums, int numsSize, int k) {int NewArr[numsSize];for(int i = 0; i < numsSize; i++){NewArr[(k + i) % numsSize] = nums[i];//這里是將原數組中的數據放入到新數組下標為(k + i) % numsSize中}for(int i = 0; i < numsSize; i++){nums[i] = NewArr[i]; //再放到原數組中去}}

思路3:

逆置:是指將開始的位置(begin) 和末尾的位置(last)相互置換,多次置換時需要begin++,last–。

空間復雜度 O(1)
先將前n-k個逆置:5 6 7
再將后k個逆置 :4 3 2 1
最后將整體逆置 :5 6 7 1 2 3 4

核心代碼:

//逆置的過程可以分裝成一個函數
void reverse(int* nums, int begin, int end)
{while(begin < end) {int tmp = nums[begin];nums[begin] = nums[end];nums[end] = tmp;begin++;end--;}   }void rotate(int* nums, int numsSize, int k) {k = k % numsSize;//先將前n-k個進行逆置reverse(nums, 0, numsSize - 1 - k);//這里傳的是數組的下標//再將后k個進行逆置reverse(nums, numsSize - k, numsSize - 1);//最后整體進行逆置reverse(nums, 0, numsSize - 1);
}

假設數組的個數非常大,有n個,我們從頭 和 尾 兩兩逆置,總共逆置了1/2 * n次,所以時間復雜度為O(N), 我們也沒有額外申請空間,所以空間復雜度為O(1)

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

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

相關文章

運維安全06 - 服務安全

云計算服務安全 在當今數字化時代&#xff0c;各種服務&#xff08;如網絡應用、云計算平臺、數據庫系統等&#xff09;已成為我們日常生活和工作中不可或缺的一部分。 然而&#xff0c;隨著服務的廣泛應用&#xff0c;其安全性問題也日益凸顯。 一、服務安全 服務安全是一…

01數據結構-初探動態規劃

01數據結構-初探動態規劃前言1.基本思想2.重疊子問題3.斐波那契數列4.備忘錄&#xff08;記憶化搜索表&#xff09;4.1備忘錄&#xff08;記憶化搜索表&#xff09;代碼實現5.DP table5.1DP table代碼實現6.練習前言 在學習動態規劃時切忌望文生義&#xff0c;因為其名字與其思…

[智能算法]可微的神經網絡搜索算法-FBNet

一、概述 相較于基于強化學習的NAS&#xff0c;可微NAS能直接使用梯度下降更新模型結構超參數&#xff0c;其中較為有名的算法就是DARTS&#xff0c;其具體做法如下。 首先&#xff0c;用戶需要定義一些候選模塊&#xff0c;這些模塊內部結構可以互不相同&#xff08;如設置不同…

Elasticsearch安裝啟動常見問題全解析

文章目錄&#x1f4da; Elasticsearch 安裝與啟動問題總結一、核心問題概覽二、詳細問題分析與解決方案1. &#x1f510; **權限問題&#xff1a;AccessDeniedException**? 錯誤日志&#xff1a;&#x1f4cc; 原因&#xff1a;? 解決方案&#xff1a;2. ?? **配置沖突&…

Uniapp中使用renderjs實現OpenLayers+天地圖的展示與操作

Uniapp中自帶的地圖組件對支持的地圖服務略有局限&#xff0c;同時&#xff0c;該組件在樣式布局上層級過高且無法控制&#xff0c;無法滿足部分高度自定義化的需求。故引入renderjs視圖層工具搭配OpenLayers框架對地圖功能進行實現&#xff0c;但由于renderjs的限制&#xff0…

從C++開始的編程生活(8)——內部類、匿名對象、對象拷貝時的編譯器優化和內存管理

前言 本系列文章承接C語言的學習&#xff0c;需要有C語言的基礎才能學會哦~ 第8篇主要講的是有關于C的內部類、匿名對象、對象拷貝時的編譯器優化和內存管理。 C才起步&#xff0c;都很簡單&#xff01;&#xff01; 目錄 前言 內部類 性質 匿名對象 性質 ※對象拷貝時的…

MT5追大速率回測BUG

將MT5策略測試器中的回測速率調到最大(最快速度),**確實非常容易導致出現不符合策略邏輯的秒級成交(閃電交易)**。這并非MT5的“bug”,而是由**回測引擎的工作方式**與**策略代碼的編寫方法**在高速運行下不匹配所導致的。 --- ### 為什么最大速率會導致問題? MT5回測…

[數據結構——lesson10.堆及堆的調整算法]

引言 上節我們學習完二叉樹后[數據結構——lesson9.二叉樹]&#xff0c;這節我們將學習數據結構——堆 學習目標 1.堆的概念及結構 堆是一種特殊的完全二叉樹結構&#xff0c;在計算機科學和數據結構中廣泛應用&#xff0c;特別是在堆排序算法和優先隊列的實現中&#xff0c;…

九識智能與北控北斗合作研發的L4級燃氣超微量高精準泄漏檢測無人車閃耀服貿會,守護城市安全

2025年9月10日至14日&#xff0c;2025年中國國際服務貿易交易會將于北京首鋼園舉辦。在這場國際盛會上&#xff0c;九識智能與北京北控北斗科技投資有限公司&#xff08;以下簡稱“北控北斗”&#xff09;合作研發的L4級燃氣超微量高精準泄漏檢測無人車及相關系統解決方案&…

【C語言入門】手把手教你實現順序棧

棧是計算機科學中最基礎且重要的數據結構之一&#xff0c;它遵循"后進先出"&#xff08;LIFO&#xff09;的原則。想象一下一疊盤子&#xff0c;你只能從最上面取放&#xff0c;這就是棧的直觀體現。本文將用C語言帶你一步步實現一個順序棧&#xff0c;即使你是編程小…

北斗導航 | ARAIM(高級接收機自主完好性監測)算法在民航LPV-200進近中的具體實現流程

要詳細說明ARAIM(高級接收機自主完好性監測)算法在民航LPV-200進近中的具體實現流程,需結合ARAIM的核心邏輯(多星座融合、多假設解分離、風險優化分配)與LPV-200的嚴格要求(垂直保護級VPL≤35米、垂直告警限VAL=35米、有效監測門限EMT≤15米等),以下是 step-by-step 的…

AIPex:AI + 自然語言驅動的瀏覽器自動化擴展

AIPex:AI + 自然語言驅動的瀏覽器自動化擴展 引言 一、快速上手 1.1 安裝AIPex擴展 1.2 首次配置 1.3 界面介紹 第二章:30+工具詳解 2.1 標簽頁管理工具集 ??? **get_all_tabs - 全局標簽頁概覽** ?? **switch_to_tab - 智能標簽頁切換** ?? **標簽頁批量操作** ?? …

機器學習模型可信度與交叉驗證:通俗講解

先從一個故事說起&#xff1a;農場里的火雞科學家&#xff0c;觀察了一年發現“每天上午11點必有食物”&#xff0c;結果感恩節當天&#xff0c;它沒等到食物&#xff0c;反而成了人類的食物。這個故事告訴我們&#xff1a;只靠過去的經驗下結論&#xff0c;很可能出錯——機器…

HTML5和CSS3新增的一些屬性

1、HTML5新增特性這些新特性都有兼容性問題&#xff0c;基本是IE9以上版本瀏覽器才支持1&#xff09;新增語義化標簽2&#xff09;新增多媒體標簽音頻&#xff1a;<audio>視頻&#xff1a;<video>&#xff08;1&#xff09;視頻<video>---盡量使用mp4格式<…

Redis的RedLock

RedLock算法深度解析RedLock是Redis作者針對分布式環境設計的多節點鎖算法&#xff0c;核心目標是解決單點Redis在分布式鎖場景中的可靠性缺陷。傳統方案的局限性單節點Redis鎖的問題單點故障&#xff1a;單個Redis實例宕機導致所有鎖服務不可用可靠性不足&#xff1a;無法保證…

SpringMVC @RequestMapping的使用演示和細節 詳解

目錄 一、RequestMapping是什么&#xff1f; 二、RequestMapping 的使用演示 1.RequestMapping在方法上的使用&#xff1a; 2.RequestMapping同時在類和方法上使用&#xff1a; 3.RequestMapping指定請求參數&#xff1a; 4.RequestMapping使用Ant風格URL&#xff1a; 5.Requ…

flutter項目 -- 換logo、名稱 、簽名、打包

1、換logo, 透明底&#xff0c;下面5個尺寸&#xff0c;需要UI設計2、換名沒配置型的改名方式如下 打開app/src/main/AndroidManifest.xml3、簽名 運行 flutter doctor -vD:\project\Apk\keystore 自己建立的keystore文件夾&#xff0c; 注意命令后是 megoai-release-key(自…

【貪心算法】day9

&#x1f4dd;前言說明&#xff1a; 本專欄主要記錄本人的貪心算法學習以及LeetCode刷題記錄&#xff0c;按專題劃分每題主要記錄&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代碼&#xff1b;&#xff08;2&#xff09;優質解法 優質代碼&#xff1b;&#xff…

linux C 語言開發 (八) 進程基礎

文章的目的為了記錄使用C語言進行linux 開發學習的經歷。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接&#xff1a; linux C 語言開發 (一) Window下用gcc編譯和gdb調試 linux C 語言開發 (二) VsCode遠程開發 linux linux C 語言開發 (…

從零學算法1094

1094.拼車 車上最初有 capacity 個空座位。車 只能 向一個方向行駛&#xff08;也就是說&#xff0c;不允許掉頭或改變方向&#xff09; 給定整數 capacity 和一個數組 trips , trips[i] [numPassengersi, fromi, toi] 表示第 i 次旅行有 numPassengersi 乘客&#xff0c;接他…