數據結構之算法的時間復雜度

1.時間復雜度的定義

在計算機科學中,算法的時間復雜度是一個函數,它定量描述了算法的運行時間。一個算法所花費的時間與其中語句的執行次數成正比列,算法中的基本操作的執行次數,為算法的時間復雜度

例1:

計算Func1中++count執行的次數

void Func1(int N)
{int count = 0;for(int i = 0; i < N; ++i){for(int j = 0; j < N; ++j){++count;}}for(int i = 0; i < 2 * N; ++i){++count;}int M = 10;while(M--){++count;    }printf("%d\n", count);
}

Func1的基本操作次數:F(N) = N^2 + 2 * N + 10來分析一下是為什么?

首先可以看到這段代碼有三個循環

第一個是由兩個for內外嵌套組成:每次循環N次,執行了N次,即N + N + N.....=N * N = N^2

第二個循環執行了 2*N

第三個循環執行了 10

如果每個時間復雜度都要這么表示的話那太復雜了,所以我們只取最大量級來表示這段代碼的時間復雜度

當N? = 10時:F(N) = 130

當N = 20時:F(N) = 10210

當N = 30時:F(N) = 1002010

當我們的N取無窮大時 2 * N + 10這兩個項對結果的影響已經不大了可以忽略不計,所以說只需要取N^2來表示它的時間復雜度就可以了

所以這段代碼Func1的時間復雜度為: O(N ^ 2)

2.大O的漸進表示法

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

推導大O階方法:

(1).用常數1來取代運行時間中的所有加法常數

(2).在修改后的運行次數的函數中,只保留最高階項

(3).如果最高階存在且不是1,則去除與這個項目相乘的常數,得到的結果就是大O階

通過上面一個例子我們可以發現大O漸進表示法去掉了那些對結果影響不大的項,簡潔明了的表示出了執行次數

我們來計算幾道代碼的時間復雜度

例1:

void Func2(int N)
{int count = 0;for(int i = 0; i < 2 * N; i++){++count;}int M = 10;while(M--){++count; }printf("%d", count);
}

F(N) = 2 * N +10

去掉與最高階相乘的常熟和10使用大O漸進法表示法該段代碼的時間復雜度為:O(N)

例2:

void Func3(int M, int N)
{int count = 0;for(int i = 0; i < M; i++){++count;}for(int j = 0; j < N; j++){++count;}printf("%d\n", count);
}

使用大O漸進法表示法該段代碼的時間復雜度為:O(N + M)

因為M和N是未知的所以不能去掉它們兩個任意一個

如果N大于M,則可以去掉M,反之可以去掉N,相等可任取M和N中任何一個

例3:

void Func4(int N)
{int count = 0;for(i = 0; i < 100: i++){++count;}printf("%d\n", count);
}

F(N) = 100

執行了100次,但是我們用1來表示

使用大O漸進法表示法該段代碼的時間復雜度為:O(1)??

注:這里的1表示代表1次,而是常數次

3.時間復雜度的最好,最壞和平均情況

另外有些算法的時間復雜度存在最好,平均,最壞情況:

最壞情況:任意輸入規模的最大運行次數(上界)

平均情況:任意輸入規模的期望運行次數

最好情況:任意輸入規模最小運行次數(下界)

例4:

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

例如:在一個長度為N的數組中找一個數據x

最好情況:1次找到

平均情況:N/2次找到

最壞情況:N次找到

在實際情況中一般關注的是算法的最壞運行情況,所以該段代碼的時間復雜度為:O(N)

例5:

void BubbleSort(int *a, int n)
{assert(a);for(int end = n; end > 1; --end){for(int i = 1; i < end; i++){if(a[i - 1] > a[i]){int tmp = a[i];a[i] = a[i + 1];a[i + 1] = tmp;}}}
}

最好情況:O(N)

最壞情況將兩個for循環跑滿

外循環為n時,內循環循環n - 1次? 然后按順序n - 2, n-3, ....., 3,?2,?1通過判斷可以知道這是一個等差數列,所以它的總和就為:n(n - 1 + 1)/2 = n^2*1/2 即最壞情況:O(N^2)

使用大O漸進法表示法去掉常數該段代碼的時間復雜度為:O(N^2)??

例6:

在數組有序的情況下:可以使用二分法(折半查找)

int binarysearch(int *a,int n, int x)
{int begin = 0;int end = n - 1;while(begin <= end){int mid = begin + ((end - begin)>>1);if(a[mid] > x){end = a[mid] - 1;}else if(a[mid] < x){begin = a[mid] + 1;}else{return mid;}}return -1;
}

最好情況:O(1)

最壞情況:區間縮放到一個值,要么找到,要么找不到,假設N為數組個數,x是最壞查找次數N每次除2就等于查找一次,折半查找多少次就除多少個2

N/2/2/2..../2 = 1, 因為n為int所以最小二分到1,2^x = N 即:x = logN(log在時間復雜度中表示以2為底)所以最壞情況:O(logN)

例7:

long long fac(size_t N)
{if(N == 0)return 1;elsereturn fac(N - 1) * N;
}

使用大O漸進法表示法該段代碼的時間復雜度為:O(N)

例8:

long long Fib(int n)
{if(n < 3){return 1;}else{return Fib(n - 1) + Fib(n - 2);}
}

最好情況:O(1)

可以觀察到該遞歸的方式為等差數列我們用求和公式可以得出:2^(N-1)-1

最壞情況用大O漸進表示法:O(2^N)

總結以上時間復雜度:O(1)>O(logN)>O(N)>O(N^2)>O(N^3)>O(2*N)

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

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

相關文章

Linux:ollama大模型部署

目錄 Ollama 是一個能在本地機器上輕松構建和運行大型語言模型的輕量級、可擴展框架&#xff0c;適用于多種場景&#xff0c;具有易于使用、資源占用少、可擴展性強等特點。 1.安裝下載ollama 2.為 Ollama 創建一個用戶 3.為ollama創建服務文件 4.啟動ollama服務 5.拉取語…

Java 家庭物聯網

家庭物聯網系統的代碼和說明&#xff0c;包括用戶認證、設備控制、數據監控、通知和警報、日志記錄以及WebSocket實時更新功能。 ### 項目結構 plaintext home-iot-system ├── backend │ └── src │ └── main │ └── java │ └…

圖書館數據倉庫

目錄 1.數據倉庫的數據來源為業務數據庫&#xff08;mysql&#xff09; 初始化腳本 init_book_result.sql 2.通過sqoop將mysql中的業務數據導入到大數據平臺&#xff08;hive&#xff09; 導入mysql數據到hive中 3.通過hive進行數據計算和數據分析 形成數據報表 4.再通過sq…

【matlab】智能優化算法——求解目標函數

智能優化算法在求解目標函數方面發揮著重要作用&#xff0c;它通過迭代、篩選等方法來尋找目標函數的最優值&#xff08;極值&#xff09;。以下是關于智能優化算法求解目標函數的詳細介紹&#xff1a; 一、智能優化算法概述 智能優化算法是一種搜索算法&#xff0c;旨在通過…

設置單實例Apache HTTP服務器

配置倉庫 [rootlocalhost ~]# cd /etc/yum.repos.d/ [rootlocalhost yum.repos.d]# vi rpm.repo倉庫代碼&#xff1a; [BaseOS] nameBaseOS baseurl/mnt/BaseOS enabled1 gpgcheck0[AppStream] nameAppStream baseurl/mnt/AppStream enabled1 gpgcheck0掛載 [rootlocalhost …

2.4G無線收發芯片 XL2401D,SOP16封裝,集成單片機,高性價比

XL2401D 芯片是工作在2.400~2.483GHz世界通用ISM頻段&#xff0c;片內集成了九齊 NY8A054E單片機的SOC無線收發芯片。芯片集成射頻收發機、頻率收生器、晶體振蕩器、調制解調器等功能模塊&#xff0c;并且支持一對多組網和帶ACK的通信模式。發射輸出功率、工作頻道以及通信數據…

網絡基礎:IS-IS協議

IS-IS&#xff08;Intermediate System to Intermediate System&#xff09;是一種鏈路狀態路由協議&#xff0c;最初由 ISO&#xff08;International Organization for Standardization&#xff09;為 CLNS&#xff08;Connectionless Network Service&#xff09;網絡設計。…

油猴腳本高級應用:攔截與修改網頁Fetch請求實戰指南

油猴腳本高級應用&#xff1a;攔截與修改網頁Fetch請求實戰指南 簡介&#xff1a; 本文介紹了幾個使用油猴&#xff08;Tampermonkey&#xff09;腳本攔截和修改網頁 fetch 請求的案例。這些腳本可以在瀏覽器擴展油猴中運行&#xff0c;用于開發者調試網絡請求或自定義頁面行…

Vue 前端修改頁面標題無需重新打包即可生效

在public文件夾下創建config.js文件 index.html頁面修改 其他頁面的標題都可以用window.title來引用就可以了&#xff01;

【雷豐陽-谷粒商城 】【分布式高級篇-微服務架構篇】【19】認證服務03—分布式下Session共享問題

持續學習&持續更新中… 守破離 【雷豐陽-谷粒商城 】【分布式高級篇-微服務架構篇】【19】分布式下Session共享問題 session原理分布式下session共享問題Session共享問題解決—session復制Session共享問題解決—客戶端存儲Session共享問題解決—hash一致性Session共享問題…

ASUS/華碩飛行堡壘8 FX506L FX706L系列 原廠win10系統 工廠文件 帶F12 ASUS Recovery恢復

華碩工廠文件恢復系統 &#xff0c;安裝結束后帶隱藏分區&#xff0c;一鍵恢復&#xff0c;以及機器所有驅動軟件。 系統版本&#xff1a;Windows10 原廠系統下載網址&#xff1a;http://www.bioxt.cn 需準備一個20G以上u盤進行恢復 請注意&#xff1a;僅支持以上型號專用…

域名、網頁、HTTP概述

目錄 域名 概念 域名空間結構 域名注冊 網頁 概念 網站 主頁 域名 HTTP URL URN URI HTML 超鏈接 發布 HTML HTML的結構 靜態網頁 特點 動態網頁 特點 Web HTTP HTTP方法 GET方法 POST方法 HTTP狀態碼 生產環境下常見的HTTP狀態碼 域名 概念 IP地…

基于.NET開源游戲框架MonoGame實現的開源項目合集

前言 今天分享一些基于.NET開源游戲框架MonoGame實現的開源項目合集。 MonoGame項目介紹 MonoGame是一個簡單而強大的.NET框架&#xff0c;使用C#編程語言可以創建桌面PC、視頻游戲機和移動設備游戲。它已成功用于創建《怒之鐵拳4》、《食肉者》、《超凡蜘蛛俠》、《星露谷物…

【跟我學K8S】45天入門到熟練詳細學習計劃

目錄 一、什么是K8S 核心功能 架構組件 使用場景 二、入門到熟練的學習計劃 第一周&#xff1a;K8s基礎和概念 第二周&#xff1a;核心對象和網絡 第三周&#xff1a;進階使用和管理 第四周&#xff1a;CI/CD集成和監控 第五周&#xff1a;實戰模擬和案例分析 第六周…

XPointer 實例

XPointer 實例 1. 引言 XPointer 是一種用于定位 XML 文檔中特定部分的語言。它是 XLink 的補充,允許用戶在 XML 文檔中創建鏈接,指向文檔中的特定元素、屬性或文本。XPointer 的強大之處在于其精確的定位能力,使得開發者能夠創建更加豐富和動態的 XML 應用。 2. XPointe…

【Spring Boot】spring boot主啟動類_內置服務

1、主啟動類 1.1 定義與功能 Spring Boot的主啟動類是一個特殊的Java類&#xff0c;用于啟動Spring Boot應用程序。該類通常使用SpringBootApplication注解進行標注&#xff0c;這個注解是一個復合注解&#xff0c;包含SpringBootConfiguration、EnableAutoConfiguration和Co…

LRU Cache 雙向鏈表以及STL list實現----面試常考

雙向鏈表版本&#xff1a; #include <bits/stdc.h> using namespace std; struct Node{int key, value;Node* prev;Node* next;Node():key(0), value(0), prev(nullptr), next(nullptr){}Node(int k, int v):key(k), value(v), prev(nullptr), next(nullptr){} }; class…

【IT領域新生必看】Java中的對象創建魔法:小白也能掌握的五種方法

文章目錄 引言為什么需要創建對象&#xff1f;創建對象的五種常見方式1. 使用 new 關鍵字示例&#xff1a; 2. 使用反射示例&#xff1a; 3. 使用克隆示例&#xff1a; 4. 使用序列化和反序列化示例&#xff1a; 5. 使用工廠方法示例&#xff1a; 選擇合適的對象創建方式總結 引…

Spring容器Bean之XML配置方式

一、首先看applicationContext.xml里的配置項bean 我們采用xml配置文件的方式對bean進行聲明和管理&#xff0c;每一個bean標簽都代表著需要被創建的對象并通過property標簽可以為該類注入其他依賴對象&#xff0c;通過這種方式Spring容器就可以成功知道我們需要創建那些bean實…

IPython代碼塊粘貼秘籍:效率與技巧的完美結合

標題&#xff1a;IPython代碼塊粘貼秘籍&#xff1a;效率與技巧的完美結合 在數據科學和Python編程的日常實踐中&#xff0c;經常需要在IPython環境中快速有效地粘貼代碼塊。這個過程雖小&#xff0c;卻對提升工作效率至關重要。本文將詳細介紹如何在IPython中粘貼代碼塊&…