衡量算法性能的量級標準:算法復雜度

今天開始數據結構的學習!作為一大重點,拿出態度很重要,想要真實掌握,博客筆記自然少不了!重點全部上色!避免疏忽

下面我們從0基礎開始學習今天的第一節!不用擔心看不懂,拒絕枯燥的理論概念!? ?

目錄

對“算法”的理解

“算法復雜度”概念理解

? ? ? ??一? 時間復雜度的表示與計

? ? ? ? ? ? ? ? ? ? ? ?一.1? 時間復雜度實例講解

? ? ? ? ? ? ??一.2? “約會”預期管理類時間復雜度

? ? ? ? ? ? ??一.3? “約會”預期管理類時間復雜度實例講解

? ? ? ? ? ? ??一.4? 時間復雜度的意義

二? 空間復雜度的表示與計算?

? ? ? ? ? ?? ?二.1? 空間復雜度實例講解


對“算法”的理解

算法簡而言之,就是解決問題的步驟跟指令,通過一系列操作,從而達到預期的結果

“算法復雜度”概念理解

哈是算法復雜度?

概念:度量算法性能優劣的一個量級說明

度量算法主要從兩個方面來考慮:時間復雜度? ? 空間復雜度

時間復雜度作用:體現執行這個算法所需要的計算工作量(下面是完整概念)

比如:對2個算法進行比較,若算法A較算法B更加快,此時指它的時間復雜度更好?

空間復雜度作用:體現執行這個算法所需要占用的額外的內存空間大小(下面是完整概念)

下面我們分別來進行講解!?

一? 時間復雜度的表示與計算

表示:首先它的表示用大O符號表示(O(n)),這個n(下面參考例題詳解!)表示這個問題的? ? ? ? ? ? ?一個工序規模次數?,O(n)也叫大O表示法

計算規則:

? ? ? ? ? ? ? ? ??1:用常數1來取代運行時間中所有加法常數

? ? ? ? ? ? ? ? ? 2:只要高階項,不要低階項

? ? ? ? ? ? ? ? ? 3:不要高階項系數

常見的時間復雜度(復雜度由低到高):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? O(1)? ? ? ? ? ? ?常數階

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? O(n)? ? ? ? ? ? ?線性階

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? O(n^2)? ? ? ? ?平方階

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? O(logn)? ? ? ? 對數階

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? O(nlogn)? ? ? nlogn階

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? O(n^3)? ? ? ? ?立方階

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? O(2^n)? ? ? ? ?指數階

畫圖演示:

一.1? 時間復雜度實例講解

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??實例1

第一步:我們計算出這個工程的工序次數是 2*N+10?次

第二步:根據計算規則進行刪除

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 只要高階項,不要低階項,去除10,首先得到:2*N

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 不要高階項系數,去除2,最后得到:N

第三步:得出最終結果,Func2的時間復雜度為 O(N)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??實例2

第一步:計算這個工程的執行工序,得到:M+N? 次

第二步:根據計算規則進行刪除更改:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?因為MN都是未知數,因為最高階階數相同,也無常數? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?故全部保留

第三步:得出時間復雜度:O(M+N)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 實例3? ? ??

第一步:計算這個工程的總工序,得到100? 次

第二步:根據計算規則進行更改與刪除:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?用常數1取代所有加法常數100改為1,最終得到1

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?注:這個“1”代表常數次,不是代表1次?

第三步:得到時間復雜度:O(1)

一.2? “約會”預期管理類時間復雜度

難道跟“約會”有關嗎?沒錯沒錯!下面如果是你和你的對象約會,你會選擇哪個時間點?? ? ? ? ? ? ?? ?最早:下午17:00

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 大概:下午19:00

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??最遲:下午20:00

我們來分析一下,因為這只是一個引入,所以無法符合每個人的想法啊!

如果我們把對每件事的期望盡量拉小,那么當這件事不管完沒完成,對你的打擊也就越小!

如果失敗:那么我的期望也沒那么高,管的他呢!

如果成功:帶給我的期望是不是更多一些!

下面我們針對非直接性(需要分情況考慮)的對時間復雜度的計算:

另外一些時間復雜度存在幾種考慮情況:比如計算:什么時候可以從一堆字符串找到一個對應字符

有以下幾種情況:

? ? ? ? ? ? ? ? ? ? ? ? ? ? 直接一次找到,這屬于最好情況(下界)

? ? ? ? ? ? ? ? ? ? ? ? ? ? 找到末尾才找到,這屬于最壞情況(上界)

? ? ? ? ? ? ? ? ? ? ? ? ? ? 最壞與最好平均下來,就是平均情況

那么我們假設一個長為N的字符串,對應幾種情況分別是:1次

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?N次

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?N/2次

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

一.3? “約會”預期管理類時間復雜度實例講解

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?實例1

第一步:得到這個問題的最壞工序次數為 7

第二步:根據計算規則進行刪除與更改:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?用常數1取代所有加法常數7改為1

第三步:得到Srchr的時間復雜度為 O(1)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? 實例2

第一步:計算這個問題的最壞情況下執行次數,為N^2(也就是N的平方)

第二步:根據計算規則進行刪除與更改:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 與三條規則不沖突,不用更改

第三步:得到它的時間復雜度為 O(N^2)

?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 實例3

二分查找涉及數學邏輯,下面配有演示!

?第一步:計算這個問題最壞情況工序為 logN(也就是log以2為底的N的對數)

第二步:根據計算規則刪除與更改:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?與三條規則不沖突,直接保留

第三步:得出時間復雜度為 O(logN)

我們看數學演示計算過程:假設N是數組個數,x表示最壞查找數

查詢次數記錄
1N/2
2N/2/2
3N/2/2/2
xN/2^x

我們發現:每查詢一次,就需要除一次2

? ? ? ? ? ? ? ? ? 那么查詢x次,就表示N/2^x

? ? ? ? ? ? ? ? ? 有2^x=N(注意:查一次有一個2,那么查了x次,就是2^x,數組有N個元素,那么最? ? ? ? ? ? ? ? ? ? ? 壞情況就是N=2^x

? ? ? ? ? ? ? ? ? 那么最壞查找數? x=log2N

由于:log以2為底的N的對數不好寫這個底數,所以規定:凡是以2為底的對數可以直接寫為logN

注:只適用于以2為底的對數 可以寫為? logN(底數2可以不寫)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?實例4

(斐波那契數的計算,下圖配有數學解析)?

?第一步:計算這個問題的最壞工序次數:

第二步: 根據計算規則進行刪除與更改:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 去除高階項系數2^(N-1)=2^N * 2^(-1),最終得2^N

第三步:得到時間復雜度 O(2^N

一.4? 時間復雜度的意義

學會時間復雜度的計算,可以更理解題目的要求,以及比較平時代碼的性能,比如:

我們可以看到上面有時間復雜度的限制,那么我們在寫題目時,需要先大概計算一下時間復雜度!?

二? 空間復雜度的表示與計算

空間復雜度我們之前已經大概了解了一下:? ?運行算法過程中額外占用存儲空間大小的量度

表示:與時間復雜度類似,還是用大O表示法:O(n),其中n表示變量個數,n一般等于變量個數+額外開辟次數(不是字節數)

計算:依然遵循時間復雜度的三條原則

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

下面我們來進行例題操練!

二.1? 空間復雜度實例講解

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 實例1

第一步:計算圖中的變量個數以及看是否額外占用空間

? ? ? ? ? ? ? ?發現創建了3個變量,并沒有額外開創空間(帶?i?的循環是在n里面的,所以?i?用的是n開? ? ? ? ? ? ? ? ?辟的那個空間,沒有重新開辟)

第二步:按照三條規則重新刪除與更改:常數項改為1

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? O(3)也就變成了O(1)

第三步:得出空間復雜度為O(1)

? ? ??

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?實例2

第一步:分析變量個數與額外開辟空間大小 (變量個數+額外開辟空間)

第二步:計算?額外占用存儲空間大小為O(n+1+1)

? ? ? ? ? ? ? 按照三個規則進行刪除與更改:只要高階項,不要低階項,改為O(n)?

第三步:得出空間復雜度 O(n)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??實例3

第一步:計算變量個數以及額外占用的空間?

每次調用函數都需要開辟空間,一共調用了N+1次 (這個空間的開辟是計算開辟次數,不是字節)

?第二步:根據三條規則進行刪除與更改:不要地階項,只保留高階項

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? O(N+1)更變為 O(N)

第三步:空間復雜度為 O(N)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

以上就是? ?算法復雜度? 的全部講解了!寫的好的話記得一鍵三連哦!希望每天都是陽光明媚!

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

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

相關文章

Spring Boot Starter介紹

前言 大概10來年以前,當時springboot剛剛出現并沒有流行,當時的Java開發者們開發Web應用主要是使用spring整合springmvc或者struts、iBatis、hibernate等開發框架來進行開發。項目里一般有許多xml文件配置,其中配置了很多項目中需要用到的Be…

Java面試題2025-Spring

講師:鄧澎波 Spring面試專題 1.Spring應該很熟悉吧?來介紹下你的Spring的理解 1.1 Spring的發展歷程 先介紹Spring是怎么來的,發展中有哪些核心的節點,當前的最新版本是什么等 通過上圖可以比較清晰的看到Spring的各個時間版本對…

Linux 切換到 Root 用戶的方式及差異詳解

在 Linux 系統中,切換到 root 用戶進行管理和操作是常見需求。不同的切換方法會影響環境變量、工作目錄以及加載的配置文件。本文將介紹幾種常用的切換方式及它們的特點。 切換到 Root 用戶的主要方式 1. sudo su 這是通過 sudo 提權后調用 su 切換到 root 用戶的…

虹科分享 | 汽車NVH小課堂之聽音辨故障

隨著車主開始關注汽車抖動異響問題,如何根據故障現象快速診斷異響來源,成了汽修人的必修課。 一個比較常用的方法就是靠“聽”——“聽音辨故障”。那今天,虹科Pico也整理了幾個不同類型的異響聲音,一起來聽聽看你能答對幾個吧 汽…

淺談Redis

2007 年,一位程序員和朋友一起創建了一個網站。為了解決這個網站的負載問題,他自己定制了一個數據庫。于2009 年開發,稱之為Redis。這位意大利程序員是薩爾瓦托勒桑菲利波(Salvatore Sanfilippo),他被稱為Redis之父,更…

element tbas增加下拉框

使用Tabs 標簽頁的label插槽,嵌入Dropdown 下拉菜單,實現Tabs 標簽頁增加下拉切換功能 Tabs 標簽頁 tab-click"事件"(這個事件當中到擁有下拉框的tab里時,可以存一下Dropdown 第一個菜單的id,實現點擊到擁有…

SQL-leetcode—1179. 重新格式化部門表

1179. 重新格式化部門表 表 Department: ---------------------- | Column Name | Type | ---------------------- | id | int | | revenue | int | | month | varchar | ---------------------- 在 SQL 中,(id, month) 是表的聯合主鍵。 這個表格有關…

【Address Overfitting】解決過擬合的三種方法

目錄 1. 收集更多數據實踐方法:適用場景:優缺點: 2. 特征選擇方法介紹:實踐示例:適用場景:優缺點: 3. 正則化(Regularization)正則化類型:實踐示例&#xff1…

面向通感一體化的非均勻感知信號設計

文章目錄 1 非均勻信號設計的背景分析1.1 基于OFDM波形的感知信號1.2 非均勻信號設計的必要性和可行性1.2 非均勻信號設計的必要性和可行性 3 通感一體化系統中的非均勻信號設計方法3.1 非均勻信號的設計流程(1)均勻感知信號設計(2&#xff0…

【深度學習】搭建PyTorch神經網絡進行氣溫預測

第一步 數據加載與觀察 ①導包 import numpy as np import pandas as pd import matplotlib.pyplot as plt import torch import torch.optim as optim import warnings warnings.filterwarnings("ignore") %matplotlib inline ②加載數據 features pd.read_csv(…

ESP8266 NodeMCU與WS2812燈帶:實現多種花樣變換

在現代電子創意項目中,LED燈帶的應用已經變得極為廣泛。通過結合ESP8266 NodeMCU的強大處理能力和FastLED庫的高效功能,我們可以輕松實現多達100種燈帶變換效果。本文將詳細介紹如何使用Arduino IDE編程,實現從基礎到高級的燈光效果&#xff…

pycharm踩坑(1)

由于我重裝系統,導致我的pycharm需要進行重裝,因此我覺得需要記錄一下,pycharm的正確使用方法 漢化 漢化很重要,除非你從小就雙語教學,不然你看著那些英文就是會消耗大量的精力 我使用的pycharm版本是pycharm-commun…

#HarmonyOS篇:build-profile.json5里面配置productsoh-package.json5里面dependencies依賴引入

oh-package.json5 用于描述包名、版本、入口文件和依賴項等信息。 {"license": "","devDependencies": {},"author": "","name": "entry","description": "Please describe the basic…

OpenCV2D 特征框架 (11)特征檢測與描述用于檢測二值圖像中連通區域(即“斑點”或“blob”)的類cv::SimpleBlobDetector的使用

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 cv::SimpleBlobDetector 是 OpenCV 中用于檢測二值圖像中連通區域(即“斑點”或“blob”)的類。這些連通區域可以是白色前…

關于deepin上運行Qt開發的程序

國產化替代是將來各單位的主流趨勢,探索自行開發應用程序在國產操作系統上正常運行是將來的主要工作之一。本文淺嘗gui程序在統信社區版——deepin上遇到的小問題。 使用Qt在deepin上做了一個類似gif的幀動畫彈窗,在編譯運行時,程序可以正常…

Unity自學之旅05

Unity自學之旅05 Unity學習之旅⑤📝 AI基礎與敵人行為🥊 AI導航理論知識(基礎)開始實踐 🎃 敵人游戲機制追蹤玩家攻擊玩家子彈碰撞完善游戲失敗條件 🤗 總結歸納 Unity學習之旅⑤ 📝 AI基礎與敵…

我想通過python語言,學習數據結構和算法該如何入手?

學習數據結構和算法是編程中的重要基礎,Python 是一個非常適合入門的語言。以下是學習數據結構和算法的步驟和建議: 1. 掌握 Python 基礎 確保你對 Python 的基本語法、數據類型、控制結構(如循環、條件語句)、函數等有扎實的理…

淺談Unity中Canvas的三種渲染模式

Overview UGUI通過 Canvas 組件渲染和管理UI元素。Canvas 是 UI 元素的容器,它決定了 UI 元素的渲染方式以及它們在屏幕上的顯示效果。Canvas 有三種主要的渲染模式,每種模式有不同的用途和特點。本文將介紹這三種渲染模式 1. Screen Space - Overlay 模…

Unity中在UI上畫線

在UI中畫一條曲線 我封裝了一個組件,可以實現基本的畫線需求. 效果 按住鼠標左鍵隨手一畫. 用起來也很簡單,將組件掛到空物體上就行了,紅色的背景是Panel. 你可以將該組件理解為一個Image,只不過形狀更靈活一些罷了,所以它要放在下面的層級(不然可能會被擋住). 代碼 可以…

2024.1.22 安全周報

政策/標準/指南最新動態 01 工信部印發《關于加強互聯網數據中心客戶數據安全保護的通知》 原文: https://www.secrss.com/articles/74673 互聯網數據中心作為新一代信息基礎設施,承載著千行百業的海量客戶數據,是關系國民經濟命脈的重要戰略資源。…