數據結構——算法和算法效率的度量

目錄

一、引言

二、算法

1 算法的基本概念

?2 算法的復雜度

2.1 時間復雜度

2.1.1 概念

2.1.2 大O的漸進表示

3 算法的空間復雜度

3.1 概念

?3.2 實例

4 實例分析

5 結論


一、引言

大家在寫代碼的時候有沒有發現寫同樣功能的代碼有多種不同的寫法,而不同的代碼也會給我們的程序帶去不同的影響,比如有的代碼執行的快,有的代碼執行的慢;有的代碼申請的空間大,有的代碼申請的空間小,那這是為什么呢?因為是算法不同呀,那為什么不同呢,接下來就由姜糖給大家講講算法這一特殊的名詞。

二、算法

1 算法的基本概念

算法(Algorithm)是對特定問題求解步驟的一種描述,它是指令的有限序列,其中的每條指令表示一個或多個操作。此外,一個算法還具有下列五個重要特性:

  • 有窮性。一個算法必須總在執行有窮步之后結束,且每一步都可在有窮時間內完成。
  • 確定性。算法中每條指令必須有確切的含義,對于相同的輸入只能得出相同的輸出。
  • 可行性。算法中描述的操作都可以通過已經實現的基本運算執行有限次來實現。
  • 輸入。一個算法有零個或多個輸入,這些輸入取自于某個特定的對象的集合。
  • 輸出。一個算法有一個或多個輸出,這些輸出是與輸入有著某種特定關系的量。

通常,設計一個“好”的算法應考慮達到以下目標:

  • 正確性。算法應能夠正確地解決求解問題。
  • 可讀性。算法應具有良好的可讀性,以幫助人們理解。
  • 健壯性。算法能對輸入的非法數據做出反應或處理,而不會產生莫名其妙的輸出。
  • 高效率與低存儲量需求。效率是指算法執行的時間,存儲量需求是指算法執行過程中所需要的最大存儲空間,這兩者都與問題的規模有關。


?2 算法的復雜度

算法效率的度量是通過時間復雜度和空間復雜度來描述的。

2.1 時間復雜度

說起時間可能有的人就會說,運行時間嘛我也會,把代碼放在電腦上面跑一下就知道了。那大家想過沒,我拿學校機房大LOL都卡的電腦和家里豪華rog全家桶來跑一個代碼,他們的運行時間會一樣嗎?那有的人可能會說那放在同一臺電腦上跑不就行了嗎?那萬一網卡了呢,時間不就又不一樣了。所以算法中就有一個時間復雜度的概念

2.1.1 概念

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

?那接下來我們來看一個程序來找出他的執行次數:

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);
}

次數:

F(N)=N^{2}+2*N+10

當我們發現當N足夠大時,2*N+10對函數的影響可以忽略不記,所以F(N)=N^{2}?。

所有我們計算時間復雜度的時候,我們其實并不一定有計算精確的次數,只需要一個大概就好了,所有我們這里可以用大O的漸進表示法。

2.1.2 大O的漸進表示

?大O符號:是用于描述函數漸進行為的數學符號。

推導大O階的方法:

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

所以上面例子代碼的時間復雜度為:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?O(N^{2})

*時間復雜度中,變量一般用N表示。

接下來再舉一個讓我們對大O階漸進表示有更深一步的認識:

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);
}

?那么這個函數的時間復雜度為什么呢?

F(N)=2N+10,只保留最高項,然后去掉最高項的常數,所以最后為O(N)。

在大O漸進表示中有一些特殊的:

  • 比如有兩個變量N和M,在沒有特殊說明N或者M遠遠大于另外一個時:O(N+M);
  • O(常數)時用O(1)表示

接下來我們再來舉一個例子:

const char strchr( const char* str, int character)
{while(*str){if(*str==character)return str;++str;}
}

這是一個在字符串中查找的函數

他的次數不固定,最好的情況為?O(1),最壞的情況是O(n),平均情況是O(n/2)。那我們該選擇哪種情況呢?

這算法中我們一般選擇最壞的運行情況,以保證算法的運行時間不會比它更長。

就如同我們生活中約會一樣,我們到達的時間不可能比對象晚,不然后果很嚴重,所以我們要把最壞的時間告訴她,給我們留下充足的時間赴約。


3 算法的空間復雜度

3.1 概念

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

?3.2 實例

下面我們來看代碼進行分析:

// 計算階乘遞歸Fac的空間復雜度?
long long Fac(size_t N)
{if(N == 0)return 1;return Fac(N-1)*N;
}

該函數為階乘遞歸,自身的遞歸每進行一次都會重新創造一個變量N,如圖:

所以該函數創造的變量為N+1,用大O漸進法空間復雜度為O(N)。


4 實例分析

我們現在學習了空間復雜度和時間復雜度,那接下來我們用一道題結束今天的文章:

斐波那契數列(遞歸方法):

#include<stdio.h>int Fibonacci(int N)
{if (N < 3){return 1;}elsereturn Fibonacci(N - 1) + Fibonacci(N - 2);
}int main()
{printf("%d", Fibonacci(10));return 0;
}

大家想想它的時間和空間復雜度為多少呢?

在分析之前我想告訴大家的是,做這類題的時候我們畫圖是很有利于我們理解的,如圖:

根據話題我們可以輕而易舉的知道函數時間復雜度的大O為O(2^{N})(綠色部分缺少為常數所以忽略不計)

而時間復雜度呢,可能有人覺得也是O(2^{N}),答案卻是錯誤的。那這是為什么呢?

那是因為函數是按照順序執行的,如圖函數肯定是先執行1然后執行完銷毀完內存后才會執行2,

?而空間內存算的是函數執行需要的空間,當部分函數執行完的時候,空間就會被銷毀,后續的函數會重新利用這一部分被銷毀的空間,所以我們在這里算空間復雜度的時候,又該選擇執行最大的一條如圖藍色部分,則最大申請變量為N+1,用大O漸進法表示則為:O(N)。

*大家注意

時間的消逝是回不來了的

空間是一直在的,是可以重復利用的


5 結論

姜糖最近因為特殊情況正逐步向著數據結構的方向前進,如有不足請大佬們幫我指出,姜糖也會不斷去更新自己博客,不斷反思完善自我,與各位一起邁入大牛之列。希望大家能一鍵三連,謝謝大家!

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

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

相關文章

51種企業應用架構模式詳解

01 什么是企業應用 我的職業生涯專注于企業應用&#xff0c;因此&#xff0c;這里所談及的模式也都是關于企業應用的。&#xff08;企業應用還有一些其他的說法&#xff0c;如“信息系統”或更早期的“數據處理”。&#xff09;那么&#xff0c;這里的“企業應用”具體指的是什…

[原型資源分享]經典產品餓了么UI模版部件庫

?部件庫預覽鏈接&#xff1a;https://f13gm0.axshare.com 支持版本: Axrure RP 8 文件大小: 3MB 文檔內容介紹 基本部件&#xff1a;表單樣式&#xff1a;12款、數據樣式&#xff1a;10款、服務樣式&#xff1a;6款、導航&#xff1a;5款、業務組件&#xff1a;7款、 模板…

python把簡體中文轉換為繁體中文

Python 可以使用第三方庫來將簡體中文&#xff08;簡體中文&#xff09;轉換為繁體中文&#xff08;繁體中文&#xff09;。一個常用的庫是 opencc-python-reimplemented&#xff0c;它是 Open Chinese Convert (OpenCC) 的 Python 實現&#xff0c;OpenCC 是一個開源的中文簡繁…

MySQL之查詢性能優化(三)

查詢性能優化 重構查詢的方式 在優化有問題的查詢時&#xff0c;目標應該是找到一個更優的方法獲得實際需要的記過——而不是一定總是需要從MySQL獲取一模一樣的結果集。有時候&#xff0c;可以將查詢轉換一種寫法讓其返回一樣的結果&#xff0c;但是性能更好。但也可以通過修…

Python魔法之旅-魔法方法(14)

目錄 一、概述 1、定義 2、作用 二、應用場景 1、構造和析構 2、操作符重載 3、字符串和表示 4、容器管理 5、可調用對象 6、上下文管理 7、屬性訪問和描述符 8、迭代器和生成器 9、數值類型 10、復制和序列化 11、自定義元類行為 12、自定義類行為 13、類型檢…

在Debian系統上賦予普通用戶ping 權限

在Debian系統上&#xff0c;普通用戶默認情況下沒有權限使用 ping 命令&#xff0c;因為它需要發送 ICMP 包&#xff0c;這通常需要 root 權限。為了允許普通用戶使用 ping&#xff0c;可以設置 ping 命令的 setuid 位。以下是具體的步驟&#xff1a; 查找 ping 命令的位置&am…

2024年度自貢市社會民生重大科技計劃項目申報要求、時間流程

一、申報要求 申報項目需符合以下申報要求和申報指南要求&#xff0c;申報資料需在“自貢市科技綜合業務服務平臺”中的“自貢市重點科技計劃項目管理系統”上傳。 &#xff08;一&#xff09;項目申報單位要求。 1.項目申報單位包括項目牽頭單位和項目合作單位。 2.多家單…

【Python】pyinstaller打包時添加詳細信息

在要被打包的py文件同級目錄新建version.txt&#xff0c;寫入以下內容 # UTF-8 # # For more details about fixed file info ffi see: # http://msdn.microsoft.com/en-us/library/aa381058.aspx # VSVersionInfo(ffiFixedFileInfo(filevers(1, 4, 0, 5),prodvers(1, 4, 0, 5…

SpringBoot使用RabbitMQ實現延遲隊列

SpringBoot使用RabbitMQ實現延遲隊列 需求和目標名詞解釋實現方式引入依賴添加配置文件配置類死信隊列消費者即時隊列消費者延遲消息發送結果注意 需求和目標 商城系統&#xff0c;用戶下單后若15分鐘內仍未完成支付&#xff0c;則自動取消訂單&#xff0c;若已支付&#xff0c…

重組蛋白的定量定性方法,你了解嗎?

重組蛋白的定量和定性分析是蛋白質工程和生物技術中至關重要的步驟&#xff0c;用于確保蛋白質的表達、純度和功能性符合預期。以下是小編整理的一些常用的方法以及實驗介紹&#xff0c;希望這些方法幫助研究人員詳細了解重組蛋白的特性。 主要的定性方法 1 WB&#xff08;Wes…

AIGC 011-SAM第一個圖像分割大模型-分割一切!

AIGC 011-SAM第一個圖像分割大模型-分割一切&#xff01; 文章目錄 0 論文工作1論文方法2 效果 0 論文工作 這篇論文介紹了 Segment Anything (SA) 項目&#xff0c;這是一個全新的圖像分割任務、模型和數據集。SA 項目是一個具有里程碑意義的工作&#xff0c;它為圖像分割領域…

基于springboot的多媒體素材庫源碼數據庫

基于springboot的多媒體素材庫源碼數據庫 近年來&#xff0c;信息化管理行業的不斷興起&#xff0c;使得人們的日常生活越來越離不開計算機和互聯網技術。首先&#xff0c;根據收集到的用戶需求分析&#xff0c;對設計系統有一個初步的認識與了解&#xff0c;確定多媒體素材庫…

迎七一黨史知識競賽答題怎么做

迎七一黨史知識競賽答題&#xff0c;不僅是對于黨史知識的檢驗&#xff0c;更是對于參賽者學習態度和綜合能力的考量。在參與這類競賽時&#xff0c;我們需要做好充分的準備&#xff0c;掌握一定的答題技巧&#xff0c;才能取得好的成績。 首先&#xff0c;我們要深入了解競賽…

FFmpeg播放器的相關概念【1】

播放器框架 相關術語 ?容器&#xff0f;文件&#xff08;Conainer/File&#xff09;&#xff1a;即特定格式的多媒體文件&#xff0c;比如mp4、flv、mkv等。 ? 媒體流&#xff08;Stream&#xff09;&#xff1a;表示時間軸上的一段連續數據&#xff0c;如一段聲音數據、一段…

UFS Explorer Professional Recovery: 如何從啟用了 mSATA 緩存的 Drobo 設備中恢復數據

天津鴻萌科貿發展有限公司是 UFS Explorer Professional Recovery 數據恢復軟件的授權代理商。 UFS Explorer Professional Recovery 數據恢復軟件提供綜合性的解決方案&#xff0c;用于解決復雜的數據恢復案例&#xff0c;包括那些采用特殊存儲技術的案例&#xff0c;或介質受…

上海亞商投顧:創業板指震蕩收漲 超70家ST股跌停

上海亞商投顧前言&#xff1a;無懼大盤漲跌&#xff0c;解密龍虎榜資金&#xff0c;跟蹤一線游資和機構資金動向&#xff0c;識別短期熱點和強勢個股。 一.市場情緒 滬指昨日震蕩震蕩&#xff0c;創業板指走勢稍強&#xff0c;盤中一度漲超1%&#xff0c;黃白二線分化嚴重。算…

vue ts 導入 @/assets/ 紅色顯示的問題解決

vue ts 導入 /assets/ 紅色顯示的問題解決 一、問題描述 在使用的時候這樣導入會出現如上的錯誤。 在使用的時候&#xff0c;導入的類型也沒有對應的代碼提示&#xff0c;說明導入有問題。 二、解決 在 tsconfig.json 中添加如下內容&#xff1a; {"compilerOptions&…

AI大模型探索之路-實戰篇15: Agent智能數據分析平臺之整合封裝Tools和Memory功能代碼

系列篇章&#x1f4a5; AI大模型探索之路-實戰篇4&#xff1a;深入DB-GPT數據應用開發框架調研 AI大模型探索之路-實戰篇5&#xff1a;探索Open Interpreter開放代碼解釋器調研 AI大模型探索之路-實戰篇6&#xff1a;掌握Function Calling的詳細流程 AI大模型探索之路-實戰篇7…

模式識別判斷題

貝葉斯估計的方法類似于貝葉斯決策&#xff0c;也需要定義損失函數。&#xff08;正確&#xff09; 解釋&#xff1a;貝葉斯估計是一種基于貝葉斯定理的參數估計方法&#xff0c;它在估計參數時考慮了參數的先驗分布。與貝葉斯決策類似&#xff0c;貝葉斯估計也需要定義損失函數…

46.ThreadPoolExcutor接口

線程池狀態 ThreadPoolExcutor使用int高3位來表示線程池狀態&#xff0c;低29位表示線程數量 狀態高三位接收新任務處理阻塞隊列任務說明RUNNING111YYSHUTDOWN000NY不會接收新任務&#xff0c;但會處理阻塞隊列剩余任務&#xff0c;比較溫和&#xff0c;已經提交的任務都會執…