數據結構回顧(Java)

1.數組 線性表

定義的方式

int[] a=new int[10]

為什么查詢快?

????????1.可以借助O(1)時間復雜度訪問某一元素,

????????2.地址連續,邏輯連續

????????3.數組長度一旦確定就不可以被修改

當需要擴容的時候需要將老數組的內容復制過來

在Java中數組是一個對象

ArrayList 數組列表

ArrayList的添加(自動擴容)

????????對應的源碼

????????值得一看的是ensureCapacityInternal方法

????????Ctrl+鼠標右鍵點進去

????????看這個231行的這個方法,modCount這個不用關注,是并發下的一個計數,重點看234行的代碼,minCapacity是新加入的值的位置,如果比數組的長度大就會執行grow(),數組擴容的方法

private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;//取到老的容量int newCapacity = oldCapacity + (oldCapacity >> 1);//構建新的容量,新的容量是老的容量的+老的容量右移一位(1.5倍)if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);// minCapacity is usually close to size, so this is a win:elementData = Arrays.copyOf(elementData, newCapacity);//把老數組的值賦值給新的數組
}

底層就是構建了一個新的數組,并且把老的數組內容復制過來,從而就實現了自動擴容。

總結:初始容量是多少 10

擴容機制: 當elementData已經滿了,才會擴容

擴容的方式:原容量加原容量右移一位

優點:隨機訪問,

缺點:需要連續的空間

2.鏈表

1.可以不斷的擴容

2.由node結點組成,每個node由data和next組成

3.兩種插入方式,頭插法和尾插法

鏈表的構建,以及兩種插入方法(頭插法和尾插法)

class MySingleLinkedList{public Node head;class Node{public int value;public Node next;public Node(int value, Node next) {this.value = value;this.next = next;}}//頭插法public void addFirst(int value){Node node =new Node(value, null);if (head==null){head=node;}else {node.next=head;head=node;}}//尾插法public void addEnd(int value){Node node=new Node(value,null);Node temp=head;if (head==null){head=node;}else {while (temp.next!=null){temp=temp.next;}temp.next=node;}}//循環輸出public void loop(){Node temp=head;while (temp!=null){System.out.println(temp.value);temp=temp.next;}}
}

? ? ? ? ?Java中提供的LinkedList是一個雙端的隊列

? ? ? ? 練習:

? ? ? ? leetcode中

???????????????單鏈表的反轉

????????????????鏈表成環的判斷、環的長度????????

????????????????兩個有序鏈表的合并

3.二叉樹

二叉樹的三種遍歷代碼實現

前序遍歷

中序遍歷

后序遍歷

?3.1 搜索二叉樹

左邊的節點比根小,右邊的節點比根大(不保證平衡)

時間復雜度最好O(log(n)),最壞O(n)

3.2 平衡二叉樹:

搜索二叉樹基礎上,任一節點的左右子樹高度差不超過1.

LL旋轉,RR旋轉,LR旋轉,RL旋轉

3.3 紅黑樹:

紅黑樹是一棵近似平衡的二叉樹,是一種高效的查找樹。

所有的結點要么紅色要么黑色,非黑即紅

根結點是黑色的,葉節點是不存儲數據的黑色 空結點

不能連續兩棵紅色相連

從任意結點到其所有的葉子結點所經過的黑色葉子結點數是一樣的

推導出來,從紅黑樹的葉子結點到另一最近結點上的與到另一最遠結點上,不超過一倍(任一結點的左右子樹的高度差不超過兩倍)

AVL樹(平衡樹)和紅黑樹的對比

AVL嚴格的平衡樹,紅黑樹近似的平衡樹

AVL在查詢上更高效,紅黑樹在插入和刪除上更高效

紅黑樹插入的時候默認結點是紅色的,因為只是有可能會違反根葉黑或者不紅紅的規則

如果插入破壞了規則分以下三種情況:

1)插入結點是根節點

直接把根結點變黑

2)插入結點的叔叔是紅色結點

父親層和爺爺層同時變色,黑色變紅色,紅色變黑色,再看是否破壞紅黑樹的規則。

3)插入結點的叔叔是黑色

(LL,RR,LR,RL)旋轉,然后變色,變色規則是旋轉中心點,旋轉點進行變色

LL:右旋,向右旋轉,沖突的右孩變左孩

RR:左旋,向左旋轉,沖突的左孩子變右孩子

LR: 左旋左孩子,然后右旋

RL:右旋右孩子,然后左旋

4.B樹

紅黑樹雖然是近似平衡的,而且插入,刪除上很高效,但是如果插入數據非常的多,也會出現樹的深度過深,導致內存和磁盤間的I/O次數過多的情況,這時候就可以使用多叉樹。

對于一個m叉樹

(1)樹中每個結點至多有m個孩子結點(m-1個關鍵字)

(2)每個結點的結構

(3)除根結點外,其他結點至少有m/2個孩子結點

(4)若根節點不是葉子結點,則根結點至少有兩個孩子結點

(5)所有的葉子結點都在同一層上,即B樹是所有結點的平衡因子等于0的多路查找樹

B樹的查找

首先我們要了解一個概念,我們讀取磁盤中的數據時,是按照塊或者頁讀取的,比如,一個word文檔大小3.5K,它存儲的時候會按照一個頁的大小的整數倍去存儲,存儲占用4K,讀取的時候也是一樣的。

B樹的訪問結點是在硬盤上解決的,但是B樹對結點內的數據的操作是在內存中使用的。

B樹就是一次性去磁盤中讀取一個塊,數據,指針都在這個塊里了

B+樹

B+樹就是在B樹的基礎上非葉子結點只存儲記錄和指針,葉子結點存儲數據,B+樹的元素個數和分支樹是相同的,也就是一個元素值對應一個子樹。

B+樹的非葉子結點是為了快速定位到葉子結點上的關鍵字,就相當于給葉子結點層建立了索引。

整個B+樹就是一個多級索引結構,目的就是為了加速查詢的速度,查詢的速度是log(n)級別的

B+樹被廣泛用作數據庫的索引結構

B+樹可以用于:順序查找,隨機查找,范圍查找

B樹和B+樹的對比

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

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

相關文章

bug定位策略

前提--用戶環境層面 hosts異常&#xff1a;hosts文件主要是加快某個域名或者網站的解析速度&#xff0c;從而達到快速訪問的作用&#xff0c;也可以屏蔽網站。hosts異常可能會導致部分網頁無法訪問&#xff0c;能夠加載&#xff0c;但是網頁無法正常顯示&#xff1b;測試環境臟…

記錄些Redis題集(2)

Redis 的多路IO復用 多路I/O復用是一種同時監聽多個文件描述符&#xff08;如Socket&#xff09;的狀態變化&#xff0c;并能在某個文件描述符就緒時執行相應操作的技術。在Redis中&#xff0c;多路I/O復用技術主要用于處理客戶端的連接請求和讀寫操作&#xff0c;以實現高并發…

Python_使用pyecharts構建折線圖

Pyecharts簡介 Pyecharts是一款將python與echarts結合的強大的數據可視化工具&#xff0c;使用 pyecharts 可以生成獨立的網頁&#xff0c;也可以在 flask , Django 中集成使用。echarts &#xff1a;百度開源的一個數據可視化 JS 庫&#xff0c;主要用于數據可視化。pyechart…

嵌入式linux相機 框圖

攝像頭讀取數據顯示到LCD流程 重點&#xff1a;攝像頭數據&#xff08;yuyv&#xff0c;mjpeg&#xff0c;rgb&#xff09;&#xff08;640,320&#xff09;與LCD顯示數據&#xff08;RGB&#xff09;&#xff08;480&#xff0c;240&#xff09;不同&#xff1b;需要轉換&…

ReactRouter v6升級的步驟

React Router v6 引入了一個 Routes 組件&#xff0c;它有點像 Switch &#xff0c;但功能要強大得多。與 Switch 相比&#xff0c; Routes 的主要優勢在于&#xff1a; <Routes> 中的所有 <Route> 和 <Link> 都是相對的。這導致在 <Route path> 和 &…

項目文章|EMBO J(IF=9.4):16S+代謝組解析腸道菌群代謝物改善高脂飲食誘導的胰島素抵抗機制

腸道菌群及其代謝產物與肥胖相關疾病&#xff08;如2型糖尿病&#xff09;密切相關&#xff0c;但其因果關系和潛在機制尚不清楚。研究表明&#xff0c;肥胖與腸道微生物的豐度和多樣性變化有關&#xff0c;例如&#xff0c;高脂飲食&#xff08;HFD&#xff09;誘導的肥胖會增…

AIGC率超標?掌握論文去AI痕跡的高效策略

隨著 AI 技術迅猛發展&#xff0c;各種AI輔助論文寫作的工具層出不窮&#xff01; 為了防止有人利用AI工具進行論文代寫&#xff0c;在最新的學位法中已經明確規定“已經獲得學位者&#xff0c;在獲得該學位過程中如有人工智能代寫等學術不端行為&#xff0c;經學位評定委員會…

ESP32CAM物聯網教學11

ESP32CAM物聯網教學11 霍霍webserver 在第八課的時候&#xff0c;小智把樂鑫公司提供的官方示例程序CameraWebServer改成了明碼&#xff0c;這樣說明這個官方程序也是可以更改的嘛。這個官方程序有四個文件&#xff0c;一共3500行代碼&#xff0c;看著都頭暈&#xff0c;小智決…

S7-200smart與C#通信

https://www.cnblogs.com/heizao/p/15797382.html C#與PLC通信開發之西門子s7-200 smart_c# s7-200smart通訊庫-CSDN博客https://blog.csdn.net/weixin_44455060/article/details/109713121 C#上位機讀寫西門子S7-200SMART PLC變量 教程_嗶哩嗶哩_bilibilihttps://www.bilibili…

清朝嘉慶二十五年(1820年)地圖數據

我們在《中國歷史行政區劃連續變化數據》一文中&#xff0c;為你分享了中國歷史行政區劃連續變化地圖數據。 現在再為你分享清朝嘉慶二十五年&#xff08;1820年&#xff09;的地圖數據&#xff0c;該數據對于研究歷史的朋友應該比較有用&#xff0c;請在文末查看領取方式。 …

【Rust練習】2.數值類型

練習題來自https://practice-zh.course.rs/basic-types/numbers.html 1 // 移除某個部分讓代碼工作 fn main() {let x: i32 5;let mut y: u32 5;y x;let z 10; // 這里 z 的類型是? }y的類型不對&#xff0c;另外&#xff0c;數字的默認類型是i32 fn main() {let x: i…

Jupyter Lab 使用

Jupyter Lab 使用詳解 Jupyter Lab 是一個基于 Web 的交互式開發環境&#xff0c;提供了比 Jupyter Notebook 更加靈活和強大的用戶界面和功能。以下是使用 Jupyter Lab 的詳細指南&#xff0c;包括安裝、基本使用、設置根目錄和擴展功能等內容。 一、Jupyter Lab 安裝與啟動…

HTTP背后的故事:理解現代網絡如何工作的關鍵(一)

一.HTTP是什么 概念 &#xff1a; 1.HTTP ( 全稱為 " 超文本傳輸協議 ") 是一種應用非常廣泛的 應用層協議。 2.HTTP 誕生與1991年. 目前已經發展為最主流使用的一種應用層協議. 3.HTTP 往往是基于傳輸層的 TCP 協議實現的 . (HTTP1.0, HTTP1.1, HTTP2.0 均為 T…

DelphiXE內存泄漏問題,已經發生了很多次

內存泄漏的地方一定要注意: 不斷分配的Tbytes會導致內存泄漏,發生以下錯誤: Access violation at address CA5ED400. Execution of address CA5ED400 {=====內存泄漏最大的地方、居然沒有釋放=====} //SetLength(tbuff,length(Adata)); //Move(Adata,Tbuff,length(…

2024世界人工智能大會(WAIC)學習總結

1 前言 在2024年的世界人工智能大會&#xff08;WAIC&#xff09;上&#xff0c;我們見證了從農業社會到工業社會再到數字化社會的深刻轉變。這一進程不僅體現在技術的單點爆發&#xff0c;更引發了整個產業鏈的全面突破&#xff0c;未來將是技術以指數級速度發展的嶄新時代。…

等保測評別犯難,黑龍江等保測評服務流程來啦!

引言 在當今數字化時代&#xff0c;網絡安全已經成為企業發展的基石。為了響應國家網絡安全等級保護&#xff08;簡稱“等保”&#xff09;政策&#xff0c;黑龍江地區的企業紛紛啟動了等保測評工作。然而&#xff0c;對于很多企業而言&#xff0c;等保測評似乎是一項既復雜又…

【從0到1進階Redis】主從復制 — 主從機宕機測試

上一篇&#xff1a;【從0到1進階Redis】主從復制 測試&#xff1a;主機斷開連接&#xff0c;從機依舊連接到主機的&#xff0c;但是沒有寫操作&#xff0c;這個時候&#xff0c;主機如果回來了&#xff0c;從機依舊可以直接獲取到主機寫的信息。 如果是使用命令行&#xff0c;來…

PyTorch深度學習實戰(46)——深度Q學習

PyTorch深度學習實戰&#xff08;46&#xff09;——深度Q學習 0. 前言1. 深度 Q 學習2. 網絡架構3. 實現深度 Q 學習模型進行 CartPole 游戲小結系列鏈接 0. 前言 我們已經學習了如何構建一個 Q 表&#xff0c;通過在多個 episode 中重復進行游戲獲取與給定狀態-動作組合相對…

Hypertable install of rhel6.0

1.rpm 安裝:(如果已存在,會提示沖突,使用--replacefiles) 1.1 編譯環境 安裝gcc gcc-c++ make cmake(在admin machine上,放置rpm包的文件里依次執行下面的語句): sudo rpm -ivh cpp-4.4.6-4.el6.x86_64.rpm --replacefiles sudo rpm -ivh libgcc-4.4.6-4.el6.x86_64.rp…

【學習筆記】無人機(UAV)在3GPP系統中的增強支持(十四)-無人機操控關鍵績效指標(KPI)框架

引言 本文是3GPP TR 22.829 V17.1.0技術報告&#xff0c;專注于無人機&#xff08;UAV&#xff09;在3GPP系統中的增強支持。文章提出了多個無人機應用場景&#xff0c;分析了相應的能力要求&#xff0c;并建議了新的服務級別要求和關鍵性能指標&#xff08;KPIs&#xff09;。…