數據結構青銅到王者第一話---數據結構基本常識(1)

目錄

一、集合框架

1、什么是集合框架

2、集合框架的重要性

2.1開發中的使用

2.2筆試及面試題

3、背后涉及的數據結構以及算法

3.1什么是數據結構

3.2容器背后對應的數據結構

3.3相關java知識

3.4什么是算法

3.5如何學好數據結構以及算法

二、時間和空間復雜度

1、算法的效率

2、時間復雜度

2.1時間復雜度的概念

2.2大O的漸進表示法

2.3推導大O階方法

2.4常見的時間復雜度計算舉例

三、空間復雜度


一、集合框架

1、什么是集合框架

????????Java集合框架(Java Collection Framework),又被稱為容器(container),是定義在java.util包下的一組接口(interfaces)和其實現類(classes).

????????主要表現為把多個元素(element)放在一個單元中,用于對這些元素進行快速、便捷的存儲(store)、檢索(retrieve)、管理(manipulate),即平時俗稱的增刪改查(CRUD)

類和接口總覽:

2、集合框架的重要性

2.1開發中的使用

(1)使用成熟的集合框架,有助于我們便捷、快速的寫出高效、穩定的代碼

(2)學習背后的數據結構知識,有助于我們理解各個集合的優缺點及使用場景

2.2筆試及面試題

? ? ? ? 在各廠的秋招中,常會用數據結構作為筆試的考題;不僅如此,哪怕是在面試中,也常常會問到我們一些數據結構相關的問題!!!

3、背后涉及的數據結構以及算法

3.1什么是數據結構

????????數據結構(Data Structure)是計算機存儲、組織數據的方式,指互相之間存在一種或多種特定關系的數據元素的集合

3.2容器背后對應的數據結構

????????在這里,我們主要學習以下容器,每個容器其實都是對某種特定數據結構的封裝,大概了解一下,后序會給大家詳細講解并模擬實現:

(1)Collection:一個接口,包含了大部分容器常用的一些方法

(2)List:一個接口,規范了ArrayList和LinkedList中要實現的方法

? ? ? ? ? ? ? ? ? ? ? ? ArrayList:實現了List接口,底層為動態類型順序表

? ? ? ? ? ? ? ? ? ? ? ? LinkedList:實現了List接口,底層為雙向鏈表

(3)Stack:底層是棧,棧是一種特殊的順序表

(4)Queue:底層是隊列,隊列是一種特殊的順序表

(5)Deque:是一個接口

(6)Set:集合,是一個接口,里面放置的是K模型

? ? ? ? ? ? ? ? ? ? ? ? HashSet:底層為哈希桶,查詢的時間復雜度為O(1)

? ? ? ? ? ? ? ? ? ? ? ? TreeSet:底層為紅黑樹,查詢的時間復雜度為O( logN ),關于key有序的

(7)Map:映射,里面存儲的是K-V模型的鍵值對

? ? ? ? ? ? ? ? ? ? ? ? ?HashMap:底層為哈希桶,查詢時間復雜度為O(1)

? ? ? ? ? ? ? ? ? ? ? ? ?TreeMap:底層為紅黑樹,查詢的時間復雜度為O(logN),關于key有序

3.3相關java知識

(1)泛型?(Generic)

(2)自動裝箱 (autobox) 和自動拆箱 (autounbox)

(3)Object 的 equals 方法

(4)Comparable 和 Comparator 接口

3.4什么是算法

????????算法(Algorithm):就是定義良好的計算過程,他取一個或一組的值為輸入,并產生出一個或一組值作為輸出。簡單來說算法就是一系列的計算步驟,用來將輸入數據轉化成輸出結果。

3.5如何學好數據結構以及算法

? ? ? ? 不少人都會問:怎么才能學會學好數據結構呢???

(1)死磕代碼,磕成這樣就可以了

(2)注意畫圖和思考

? ? ? ? 在我看來,學數據結構主要分為這樣的過程:

思考==>畫圖==>寫代碼(N)==>畫圖==>再次寫代碼==>調試==>……

#注:一定要畫圖!!!一定要畫圖!!!一定要畫圖!!!

(3)多看兩遍我的博客或者自己寫點的東西(如博客),多做總結

(4)多刷題

? ? ? ? 可以在牛客網和LeetCode上面刷一下相關的數據結構,看一下不同的解題思路!!!

二、時間和空間復雜度

? ? ? ? 首先要明確,我們不只是說只要可以實現、完成任務就可以,而是要盡可能用更少的時間、更少的空間來完成任務!!!(就像是干活一樣,不僅要老板滿意,還要在保證質量的情況下用最短的時間以及最少的成本完成工作,讓利益最大化!!!)

1、算法的效率

????????算法效率分析分為兩種:第一種是時間效率,第二種是空間效率。時間效率被稱為時間復雜度,而空間效率被稱作空間復雜度。時間復雜度主要衡量的是一個算法的運行速度,而空間復雜度主要衡量一個算法所需要的額外空間

(在計算機發展的早期,計算機的存儲容量很小。所以對空間復雜度很是在乎。但是經過計算機行業的迅速發展,計 算機的存儲容量已經達到了很高的程度。所以我們如今已經不需要再特別關注一個算法的空間復雜度。但是,一些面試題或者筆試題中有要求!!!)

2、時間復雜度

2.1時間復雜度的概念

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

2.2大O的漸進表示法

 // 請計算一下func1基本操作執行了多少次?void func1(int N){int count = 0;for (int i = 0; i < N ; i++) {for (int j = 0; j < N ; j++) {count++;}}//N^2for (int k = 0; k < 2 * N ; k++) {count++;}//2*Nint M = 10;while ((M--) > 0) {count++;}//10System.out.println(count);}

Func1 執行的基本操作次數 :

????????????????????????????????????????????????????????F(N) = N^2 + 2*N + 10

(1)N = 10? ? ? ?F(N) = 130

(2)N = 100? ? ?F(N) = 10210

(3)N = 1000? ?F(N) = 1002010

????????實際我們計算時間復雜度時,我們只需要算大概執行的次數,也就是大O的漸進表示法

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

2.3推導大O階方法

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

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

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

????????使用大O的漸進表示法以后,Func1的時間復雜度為:O(N^2)

(1)N = 10? ? ? ?F(N) = 100

(2)N = 100? ? ?F(N) = 10000

(3)N = 1000? ?F(N) = 1000000

????????通過上面我們會發現大O的漸進表示法去掉了那些對結果影響不大的項,簡潔明了的表示出了執行次數。 另外有些算法的時間復雜度存在最好、平均和最壞情況:

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

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

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

如:在一個長度為N數組中搜索一個數據x

????????最好情況:1次找到

????????最壞情況:N次找到

????????平均情況:N/2次找到

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

2.4常見的時間復雜度計算舉例

實例1:

void func3(int N, int M) {int count = 0; for (int k = 0; k < M; k++) {count++;//M} for (int k = 0; k < N ; k++) {count++;//N} System.out.println(count);}

????????由于基本操作執行了N+M次,并且兩數都是未知數,所以時間復雜度為O(N+M)

實例二:

void bubbleSort(int[] array) {for (int end = array.length; end > 0; end--) {boolean sorted = true;for (int i = 1; i < end; i++) {if (array[i - 1] > array[i]) {Swap(array, i - 1, i);sorted = false;}//N*(N-1)/2} if (sorted == true) {break;}}}

????????由于循環執行,第一次執行(N-1)次,最后一次執行了0次,共N次,求每次比前一次少一次,因此得到N*(N-1)/2,因此時間復雜度為O(N^2)

實例三:

int binarySearch(int[] array, int value) {int begin = 0;int end = array.length - 1;while (begin <= end) {int mid = begin + ((end-begin) / 2);if (array[mid] < value)begin = mid + 1;else if (array[mid] > value)end = mid - 1;elsereturn mid;}return -1;}

????????二分查找,一次是原來的一半可以得出(N/2)^O=1,計算可得時間復雜度為O(logN)(logN是以2為底,lgN是以10為底)

實例四:

 long factorial(int N) {return N < 2 ? N : factorial(N-1) * N;}

????????階乘遞歸是在比較N和2的大小關系進行選擇,可以發現共遞歸了N次,所以時間復雜度為O(N)

實例五:

 int fibonacci(int N) {return N < 2 ? N : fibonacci(N-1)+fibonacci(N-2);}

? ? ? ? 我們可以發現,左側最頂端(第一次)是(N-1),最后一次是1,也就可以得到近似的1+2^1+……+2^(N-1),也就是2^N-1,同理,右側也可以計算出是2^(N-1)-1,因此時間復雜度為O(2^N)

????????我們常遇到的復雜度有:O(1) < O(logN) < O(N) < O(N*logN) < O(N^2)

三、空間復雜度

????????空間復雜度是對一個算法在運行過程中臨時占用存儲空間大小的量度 。空間復雜度不是程序占用了多少bytes的空間,因為這個也沒太大意義,所以空間復雜度算的是變量的個數。空間復雜度計算規則基本跟時間復雜度類似,也使用大O漸進表示法。

實例一:

void bubbleSort(int[] array) {for (int end = array.length; end > 0; end--) {boolean sorted = true;for (int i = 1; i < end; i++) {if (array[i - 1] > array[i]) {Swap(array, i - 1, i);sorted = false;}}if (sorted == true) {break;}}
}

????????因為使用了常數個額外空間,所以空間復雜度為O(1)

實例二:

 int[] fibonacci(int n) {long[] fibArray = new long[n + 1];fibArray[0] = 0;fibArray[1] = 1;for (int i = 2; i <= n ; i++) {fibArray[i] = fibArray[i - 1] + fibArray [i - 2];}return fibArray;}

????????因為動態開辟了N個空間,空間復雜度為 O(N)

實例三:

 long factorial(int N) {return N < 2 ? N : factorial(N-1)*N;}

因為遞歸調用了N次,開辟了N個棧幀,每個棧幀使用了常數個空間,因此空間復雜度為O(N)

?????????????????由于內容較多,會分為多篇講解,預知后續內容,請看后續博客!!!

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

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

相關文章

【Verilog】延時和時序檢查

Verilog中延時和時序檢查1. 延時模型1.1 分布延遲1.2 集總延遲1.3 路徑延遲2. specify 語法2.1 指定路徑延時基本路徑延時邊沿敏感路徑延時狀態依賴路徑延時2.2 時序檢查$setup, $hold, $setuphold$recovery, $removal, $recrem$width, $periodnotifier1. 延時模型 真實的邏輯元…

DigitalOcean Gradient AI平臺現已支持OpenAI gpt-oss

OpenAI 的首批開源 GPT 模型&#xff08;200 億和 1200 億參數&#xff09;現已登陸 Gradient AI 平臺。此次發布讓開發者在構建 AI 應用時擁有更高的靈活度和更多選擇&#xff0c;無論是快速原型還是大規模生產級智能體&#xff0c;都能輕松上手。新特性開源 GPT 模型&#xf…

藏在 K8s 幕后的記憶中樞(etcd)

目錄1&#xff09;etcd 基本架構2&#xff09;etcd 的讀寫流程總覽a&#xff09;一個讀流程b&#xff09;一個寫流程3&#xff09;k8s存儲數據過程源碼解讀4&#xff09;watch 機制Informer 機制etcd watch機制etcd的watchableStore源碼解讀5&#xff09; k8s大規模集群時會存在…

騰訊云EdgeOne安全防護:快速上手,全面抵御Web攻擊

為什么需要專業的安全防護&#xff1f; 在當今數字化時代&#xff0c;網站面臨的安全威脅日益增多。據統計&#xff0c;2023年全球Web應用程序攻擊超7千億次&#xff0c;持續快速增長。 其中最常見的包括&#xff1a; DDoS攻擊&#xff1a;通過海量請求使服務器癱瘓Web應用攻…

SpringBoot中的條件注解

文章目錄前言什么是條件注解核心原理常用條件注解詳解1. ConditionalOnClass和ConditionalOnMissingClass2. ConditionalOnBean和ConditionalOnMissingBean3. ConditionalOnProperty應用場景&#xff1a;多數據源配置在SpringBoot自動配置中的核心作用自動配置的工作原理經典自…

LightGBM時序預測詳解:從原理到 PSO 參數優化

前言 在時間序列預測領域&#xff0c;集成學習方法一直占據重要地位。此前我們介紹了基于傳統集成思想的時序預測方法&#xff08;查看前文&#xff09;&#xff0c;而梯度提升樹&#xff08;GBDT&#xff09;作為集成學習的佼佼者&#xff0c;在時序預測中表現尤為突出。本文…

django生成遷移文件,執行生成到數據庫

當報錯時 重新拉取git&#xff0c;重新生成遷移文件&#xff0c;重新執行 1、生成遷移文件 python manage.py makemigrations 子應用2、執行建表、建字段、修改字段 python manage.py migrate 子應用3、當手動已經在數據庫創建字段時&#xff0c; 用 --fake 標記遷移為 “已應用…

2025軟件供應鏈安全技術路線未來趨勢預測

軟件供應鏈安全已從一個技術圈的議題演變為全球企業的治理焦點。近幾年&#xff0c;APT滲透、惡意包植入、開發者誤操作等不同類型的供應鏈安全事件頻發&#xff0c;使得“安全的代碼來源”和“可信的交付鏈路”成為企業數字化轉型的生命線。2025年的軟件供應鏈安全&#xff0c…

用戶登錄Token緩存Redis實踐:提升SpringBoot應用性能

前言在現代Web應用中&#xff0c;用戶認證和授權是至關重要的功能。傳統的基于數據庫的Token存儲方式雖然簡單易用&#xff0c;但在高并發場景下容易成為性能瓶頸。本文將介紹如何將SpringBoot項目中的用戶Token從數據庫存儲遷移到Redis緩存&#xff0c;顯著提升系統性能。一、…

深度解析Structured Outputs:讓AI輸出嚴格遵循JSON Schema的結構化響應

深度解析Structured Outputs&#xff1a;讓AI輸出嚴格遵循JSON Schema的結構化響應 引言 在現代應用開發中&#xff0c;JSON 是最流行的數據交換格式之一。為了提升 API 接口的健壯性和數據一致性&#xff0c;結構化輸出&#xff08;Structured Outputs&#xff09;成為了大模…

關于 微服務中服務注冊與發現 的詳細說明,涵蓋主流框架/解決方案的對比、核心功能、配置示例及總結表格

以下是關于 微服務中服務注冊與發現 的詳細說明&#xff0c;涵蓋主流框架/解決方案的對比、核心功能、配置示例及總結表格&#xff1a;1. 服務注冊與發現的核心概念 服務注冊與發現是微服務架構的基礎能力&#xff0c;主要解決以下問題&#xff1a; 服務注冊&#xff1a;服務實…

08高級語言邏輯結構到匯編語言之邏輯結構轉換 continue break 完結匯編按邏輯結構

目錄 &#x1f4da; 1. continue 語句的原理與實現 &#x1f6e0; 1.1 continue 語句的基本概念 ?? 1.2 底層原理 &#x1f4d6; 1.3 案例分析&#xff1a;跳過偶數&#xff0c;累加奇數 &#x1f680; 2. break 語句的原理與實現 &#x1f6e0; 2.1 break 語句的基本概…

AI出題人給出的Java后端面經(二十二)(日更)

鏈接雙端鏈表 前一篇&#xff1a;AI出題人給出的Java后端面經&#xff08;二十一&#xff09;&#xff08;日更&#xff09; 后一篇&#xff1a;null 目錄 &#x1f535; 一、Java基礎&#xff08;集合/流式/OOP&#xff09; 答案&#xff1a; 題目1&#xff1a;集合遍歷性…

AI賦能體育訓練突破:AI動作捕捉矯正精準、戰術分析系統提效率,運動員破瓶頸新路徑

傳統體育訓練長期受限于 “動作矯正依賴教練主觀判斷”“戰術分析滯后于賽場變化”“運動員體能分配憑經驗摸索” 的難題&#xff0c;而 AI 技術的深度介入&#xff0c;正讓體育訓練從 “經驗驅動” 轉向 “數據驅動”&#xff0c;既能實時捕捉動作偏差&#xff0c;又能動態優化…

【python實用小腳本-194】Python PNR一鍵查票:輸入號碼秒出座位狀態——再也不用刷12306

Python PNR一鍵查票&#xff1a;輸入號碼秒出座位狀態——再也不用刷12306 PNR查詢, 實時座位, 離線腳本, 零廣告, 瑞士軍刀 故事開場&#xff1a;一把瑞士軍刀救了趕火車的你 周五傍晚&#xff0c;你拎著行李沖向站臺&#xff0c;手機信號一格&#xff0c;12306 死活刷不出座位…

【python】python進階——推導式

目錄 一、推導式介紹 二、推導式的用法 2.1 列表推導式 2.2 字典推導式 2.3 集合推導式 2.4 生成器表達式 三、推導式的嵌套和復雜用法 3.1 嵌套推導式 3.2 多重條件推導式 四、推導式對比傳統循環 4.1 性能比較 4.2 可讀性比較 五、常見應用場景 5.1 數據清…

數字安全隱形基石:隨機數、熵源與DRBG核心解析與技術關聯

前言&#xff1a;數字安全的 “隱形基石” 在數字化浪潮席卷全球的今天&#xff0c;從金融交易的密鑰生成到區塊鏈的共識機制&#xff0c;從量子通信的加密協議到智能汽車的身份認證&#xff0c;隨機數如同空氣般滲透在信息系統的每一個安全節點。然而&#xff0c;看似簡單的 …

TDengine IDMP 最佳實踐

最佳實踐 IDMP 提供了一強大的數據建模能力&#xff0c;讓數據標準化、情景化&#xff0c;從而可以更好地利用 AI 技術&#xff0c;從數據中挖掘出業務價值&#xff0c;但數據建模本身是一個很難用 AI 完成的事情。 為最大程度減少建模的成本&#xff0c;TDengine 推薦在數據…

8.20網絡編程——sqlite3數據庫

文章目錄一、思維導圖二、學生管理系統1、myhead.h2、代碼三、牛客網刷題一、思維導圖 二、學生管理系統 1、myhead.h #ifndef __MYHEAD_H__ #define __MYHEAD_H__#include <string.h> #include <stdio.h> #include <stdlib.h> #include <errno.h>#d…

電腦不能訪問服務器磁盤,連不上服務器。解決辦法:在窗口中輸入 regedit 確定即可打開注冊表,。。。。0改為1,確認;

打開注冊表&#xff1a; 按鍵盤上的 WinR 鍵&#xff0c;打開運行窗口&#xff0c;在窗口中輸入 regedit 確定即可打開注冊表。&#xff08;或者直接在左下角搜索框中搜索“注冊表”&#xff09; 依次打開以下目錄 計算機\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Service…