(數據結構)復雜度

基本概念說明

數據結構

定義:數據結構(Data Structure)是計算機存儲、組織數據的方式,指相互之間存在?種或多種特定關系的數據元素的集合。沒有?種單?的數據結構對所有用途都有用(要考慮適配、效率問題,在不同情況下使用合適的數據結構提高效率)
如:線性表、樹、圖、哈希等
功能

  1. 存儲數據
  2. 組織數據:增刪改查數據

算法

定義:算法(Algorithm):就是定義良好的計算過程,他取一個或一組的值為輸入,并產生出一個或一組值作為輸出。簡單來說算法就是一系列的計算步驟,用來將輸入數據轉化成輸出結果。
算法都有好壞之分——就由復雜度來衡量
而數據結構和算法是不分家的

復雜度引入

我們來做一道算法題
https://leetcode.cn/problems/rotate-array/description/
在這里插入圖片描述
在這里插入圖片描述
自測運行通過,但是提交后的樣例測試沒有全部通過——代碼所使用的算法不夠好?
我們是否可以通過一些清晰的表達方法明確地表示算法的好壞呢?

復雜度的概念

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

大O的漸進表示法

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

推導大O階規則

  1. 復雜度函數式T(N)中,只保留最高階項,去掉那些低階項,因為當N不斷變大時,低階項對結果影響越來越?,當N無窮時,就可以忽略不計了。
  2. 如果最高階項存在且不是1,則去除這個項目的常數系數,因為當N不斷變大,這個系數對結果影響越來越小,當N無窮大時,就可以忽略不計了。
  3. T(N)中如果沒有N相關的項目,只有常數項,用常數1取代所有加法常數。

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

時間復雜度運算

在計算機科學中,算法的時間復雜度是?個函數式T(N),它定量描述了該算法的運?時間。
實際中我們計算時間復雜度時,計算的也不是程序的精確的執?次數,精確執?次數計算起來還是很?煩的(不同的?句程序代碼,編譯出的指令條數都是不?樣的),計算出精確的執?次數意義也不?,因為我們計算時間復雜度只是想?較算法程序的增?量級,也就是當N不斷變?時T(N)的差別,當N不斷變?時,常數和低階項對結果的影響很?,所以我們只需要計算程序能代表增?量
級的?概執?次數,復雜度的表?通常使??O的漸進表?法。
1.
在這里插入圖片描述
在這里插入圖片描述
2.
在這里插入圖片描述
在這里插入圖片描述
3.

在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
5.

在這里插入圖片描述
在這里插入圖片描述

空間復雜度運算

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

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

常見復雜度對比

在這里插入圖片描述

復雜度算法題

在這里插入圖片描述
最后我們再回到一開始的算法題

法一

審視一下最開始的算法的時間復雜度——O(n^2)。

void rotate(int* nums, int numsSize, int k) {while(k--){int i=1;int tmp=nums[numsSize-1];for(int i=numsSize-1;i>0;i--)//注意替換元素的方向!nums[i]=nums[i-1];nums[0]=tmp;}
}

這種算法由于超出時間限制導致測試不通過,就是因為時間復雜度太高,所以現在我們需要進行優化、或者想出其他時間復雜度更低算法來解決問題。

法二:重新創建一個新數組,把nums中的元素按規律重新安置——只需要遍歷一次nums數組就可完成——時間復雜度O(n)

(只要有思路,寫具體代碼之前就可以把時間復雜度寫出來了)在這里插入圖片描述

void rotate(int* nums, int numsSize, int k) {int newArray[numsSize];for(int i=0;i<numsSize;i++){newArray[(i+k)%numsSize]=nums[i];//巧用取模解決越界問題,不需要if語句分類討論了}//將新數組導入到原數組中for(int j=0;j<numsSize;j++){nums[j]=newArray[j];}
}

在這里插入圖片描述
空間復雜度是O(n),因為運行時開辟臨時變量數組另外申請了numsSize個int的空間,而反觀最開始的方法一,空間復雜度為O(1)
所以我們稱法二是一種“用時間換空間”的方法。

法三:三次逆置

在這里插入圖片描述

void reverse(int* nums,int left,int right){while(left<right){int tmp=nums[left];nums[left]=nums[right];nums[right]=tmp;left++;right--;}
}
void rotate(int* nums, int numsSize, int k) {reverse(nums,0,numsSize-k-1);reverse(nums,numsSize-k,numsSize-1);reverse(nums,0,numsSize-1);
}

但是這樣寫的代碼運行是正確的,但是不是所有樣例都通過
在這里插入圖片描述
看上圖分析可以得出,這是因為當k>numsSize時,這種方法會導致反轉時出現數組編號為負數的越界問題。
只需要多寫一句k%=numsSize即可避免越界情況。

void reverse(int* nums,int left,int right){while(left<right){int tmp=nums[left];nums[left]=nums[right];nums[right]=tmp;left++;right--;}
}
void rotate(int* nums, int numsSize, int k) {k%=numsSize;reverse(nums,0,numsSize-k-1);reverse(nums,numsSize-k,numsSize-1);reverse(nums,0,numsSize-1);
}

此算法
時間復雜度:O(n)
空間復雜度:O(1)

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

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

相關文章

玩轉Docker | 使用Docker部署bender個人導航頁工具

玩轉Docker | 使用Docker部署bender個人導航頁工具 前言 一、bender介紹 Bender 簡介 Bender 的主要特點 二、系統要求 環境要求 環境檢查 Docker版本檢查 檢查操作系統版本 三、部署bender服務 下載bender鏡像 編輯部署文件 創建容器 檢查容器狀態 檢查服務端口 安全設置 四、…

解決了困擾我的upload靶場無法解析phtml等后綴的問題

本文章為解決困擾我的 upload 靶場無法解析 phtml 問題 ? 這個問題直接讓我過不了Upload-Pass-03這一關&#xff0c;一直卡著。 ? 痛太痛了 &#xff0c;為什么無法解析上傳之后的 phtml 后綴文件&#xff01;這塊兒折磨了博主一天多&#xff0c;太不容易了&#xff0c;查找…

Leetcode百題斬-二分搜索

二分搜索也是一個很有趣的專題&#xff0c;被做過的題中&#xff0c;剛好一個Easy&#xff0c;一個Medium和一個Hard&#xff0c;剛好可以看看&#xff0c;二分搜索的三個難度等級都是啥樣的。 124. Binary Tree Maximum Path Sum[Hard]&#xff08;詳見二叉樹專題&#xff09;…

【IDEA】格式化代碼工具配置

格式化代碼快捷鍵&#xff1a; CtrlAltL格式代碼的時候不會再方法名與參數中間添加空格默認不勾選的情況下&#xff1a;代碼樣例&#xff1a;勾選之后的樣例&#xff1a;選擇不勾選&#xff0c;IDEA默認情況下就是不勾選的狀態忽略加載文件有些非必要加載到開發工具中的文件我們…

驅動開發(3)|rk356x驅動GPIO基礎應用之點亮led燈

點亮LED燈看似是一個基礎的操作&#xff0c;但實際上&#xff0c;許多高級應用也依賴于高低電平的切換。例如&#xff0c;脈沖寬度調制&#xff08;PWM&#xff09;信號可以用來精確控制電機的轉速&#xff0c;通過改變脈沖的頻率和占空比&#xff0c;實現對電機的精確調節&…

手動搭建PHP環境:步步為營,解鎖Web開發

目錄一、引言二、準備工作2.1 明確所需軟件2.2 下載軟件三、Windows 系統搭建步驟3.1 安裝 Apache 服務器3.2 安裝 PHP3.3 集成 Apache 與 PHP3.4 安裝 MySQL3.5 配置 PHP 連接 MySQL四、Linux 系統搭建步驟&#xff08;以 Ubuntu 為例&#xff09;4.1 更新系統4.2 安裝 Apache…

DrissionPage:一款讓網頁自動化更簡單的 Python 庫

在網頁自動化領域&#xff0c;Selenium 和 Playwright 早已是開發者耳熟能詳的工具。但今天要給大家介紹一款更輕量、更易用的 Python 庫 ——DrissionPage。它以 "融合 selenium 和 requests 優勢" 為核心設計理念&#xff0c;既能像 requests 一樣高效處理靜態網頁…

理解Grafana中`X-Scope-OrgID`的作用與配置

X-Scope-OrgID的作用 該HTTP Header用于標識Loki日志數據的所屬租戶&#xff08;組織&#xff09;。在多租戶模式下&#xff0c;Loki通過此Header隔離不同團隊或用戶的數據&#xff0c;確保查詢和存儲的獨立性。數據隔離&#xff1a; 租戶A的日志標記為X-Scope-OrgID: team-a&a…

【PycharmPyqt designer桌面程序設計】

在 main.py 中調用 Qt Designer 生成的 windows.py&#xff08;假設它是 PySide2 版&#xff09;。 只要把兩個文件放在同一目錄即可直接運行。 ──────────────────── 1?? windows.py&#xff08;Qt Designer 生成&#xff0c;已轉碼&#xff09; # -*-…

Unity Android Logcat插件 輸出日志中文亂碼解決

背景之前安卓真機調試看日志&#xff0c;一直用的是Android Studio自帶的adb命令進行看日志&#xff0c;不太方便&#xff0c;改用Unity自帶的安卓日志插件時&#xff0c;存在中文日志亂碼問題。插件安裝基于Unity6000.1.11版本&#xff1a;Window -> Package Management -&…

Halcon雙相機單標定板標定實現拼圖

1.Halcon圖像拼接算法在之前的文章里也寫過&#xff0c;主要是硬拼接和特征點拼接兩種方式&#xff0c;今天增加另一種拼接圖像的方式。應用場景是多個相機聯合一起拍大尺寸的物體&#xff0c;并且相機視野之間存在重疊區域。通過在同一個標定板上面標定&#xff0c;計算兩個相…

動物世界一語乾坤韻芳華 人工智能應用大學畢業論文 -仙界AI——仙盟創夢IDE

提示詞在一個奇幻的童話森林里&#xff0c;所有的動物都像人類一樣直立行走&#xff0c;穿著各種搞怪的衣服。 一只戴著超大眼鏡、穿著背帶褲的烏龜&#xff0c;正一本正經地站在一個蘑菇舞臺上&#xff0c;拿著一根樹枝當作麥克風&#xff0c;準備唱歌。它的眼鏡總是往下滑&am…

SpringBoot(原理篇)

大家好&#xff0c;這里是 盛碼筆記。 本篇我們來聊一聊 Spring Boot 的“魔法”是如何實現的。你可能已經用過 Spring Boot 快速搭建項目&#xff0c;但有沒有想過&#xff1a;為什么只需要引入幾個 starter&#xff0c;Spring Boot 就能自動配置好整個應用環境&#xff1f; …

數據結構:棧(區間問題)

碼蹄集OJ-小碼哥的棧 #include<bits/stdc.h> using namespace std; #define int long long const int N1e67; struct MOOE {int ll,rr; }; stack<MOOE>st; signed main( ) {ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin>>n;while(n--){int opt…

Vue 中 data、watch、created 和 methods

以下是 Vue 中 data、watch、created 和 methods 的詳細解釋&#xff0c;結合常見使用場景和示例&#xff1a;1. data&#xff1a;響應式數據容器 作用&#xff1a;定義組件的響應式數據&#xff08;狀態&#xff09;&#xff0c;當數據變化時&#xff0c;視圖自動更新。特點&a…

精密模具冷卻孔內輪廓檢測方法探究 —— 激光頻率梳 3D 輪廓檢測

引言精密模具冷卻孔的內輪廓精度直接影響注塑成型效率與制品質量。冷卻孔具有深徑比大&#xff08;可達 25:1&#xff09;、結構復雜&#xff08;多為螺旋形或異形&#xff09;、表面質量要求高&#xff08;Ra≤0.2μm&#xff09;等特點&#xff0c;傳統檢測方法難以滿足其高精…

Vue單文件組件與腳手架工程化開發

一、Vue與VueComponent原型關系解析1. 原型鏈關系圖解在Vue中&#xff0c;組件實例(VueComponent)與Vue實例之間存在特殊的原型鏈關系&#xff1a;VueComponent.prototype.__proto__ Vue.prototype這種設計使得所有組件都能訪問Vue原型上定義的方法和屬性。2. 原理驗證示例// …

架構設計之計算高性能——單體服務器高性能

架構設計之計算高性能——單體服務器高性能 高性能是每個程序員共同的追求&#xff0c;無論是開發系統&#xff0c;還是僅僅只是寫一段腳本&#xff0c;都希望能夠達到高性能的效果&#xff0c;而高性能又是軟件系統設計中最復雜的一步。無論是開發千萬級并發的電商系統&#…

Unity燈光面板環境設置

在Unity中&#xff0c;環境設置&#xff08;Environment Lighting&#xff09; 是燈光面板&#xff08;Lighting Window&#xff09;的核心功能之一&#xff0c;用于控制場景的全局光照效果&#xff0c;包括天空盒、環境光、反射和霧效等。這些設置直接影響場景的整體氛圍和真實…

MySQL語句優化案例

1.案例in查詢條件很慢其中in中共115個select id,detail_id,request,response,utime,ctime from response_detaill where detaill_id in (26371986, 26372242, 26371984, 26371990, 26400150, 26371988, 26371994, 26371992,26371998, 26371996, 26371970, 26371968, 2637197…