Java面試你必須要知道的那些知識,面試建議

二、面試題

面:考你幾個紅黑樹的知識點🦀

  1. 紅黑樹的數據結構都用在哪些場景,有什么好處?
  2. 紅黑樹的時間復雜度是多少?
  3. 紅黑樹中插入新的節點時怎么保持平衡?

面:2-3樹都是不沒看,回去等消息吧!

三、2-3樹與紅黑樹的等價性

紅黑樹規則

1. 根節點是黑色
2. 節點是紅黑或者黑色
3. 所有子葉節點都是黑色(葉子是NIL節點,默認沒有畫出來)
4. 每個紅色節點必須有兩個黑色子節點(也同樣說明一條鏈路上不能有鏈路的紅色節點)
5. 黑高,從任一節點到齊每個葉子節點,經過的路徑都包含相同數目的黑色節點

那么,這些規則是怎么總結定義出來的呢?接下里我們一步步分析講解。

1. 為什么既有2-3樹要有紅黑樹

首先2-3樹(讀法:二三樹)就是一個節點有1個或者2個元素,而實際上2-3樹轉紅黑樹是由概念模型2-3-4樹轉換而來的。-4叉就是一個節點里有3個元素,這在2-3樹中會被調整,但是在概念模型中是會被保留的。

雖然2-3-4樹也是具備2-3樹同樣的平衡樹的特性,但是如果直接把這樣的模型用代碼實現就會很麻煩,且效率不高,這里的復雜點包括;

  1. 2-叉、3-叉、4-叉,三種結構的節點類型,互相轉換復雜度較高
  2. 3-叉、4-叉,節點在數據比較上需要進行多次,不像2-叉節點,直接布爾類型比較即可非左即右
  3. 代碼實現上對每種差異,都需要有額外的代碼,規則不夠標準化

所以,希望找到一種平衡關系,既保持2-3樹平衡和O(logn)的特性,又能在代碼實現上更加方便,那么就誕生了紅黑樹。

2. 簡單2-3樹轉紅黑樹

2-3樹轉紅黑樹,也可以說紅黑樹是2-3樹2-3-4樹的另外一種表現形式,也就是更利于編碼實現的形式。

簡單轉換示例;

從上圖可以看出,2-3-4樹與紅黑樹的轉換關系,包括;

  1. 2-叉節點,轉換比較簡單,只是把原有節點轉換為黑色節點
  2. 3-叉節點,包括了2個元素,先用紅色線把兩個節點相連,之后拆分出來,最后調整高度黑色節點在上
  3. 4-叉節點,包括了3個元素,分別用紅黑線連接,之后拆分出來拉升高度。這個拉升過程和2-3樹調整一致,只是添加了顏色

綜上,就是2-3-4樹的節點轉換,總結出來的規則,如下;

  1. 將2-3-4樹,用二叉樹的形式表示
  2. 3-叉、4-叉節點,使用紅色、黑色連線進行連接
  3. 另外,3-叉節點有兩種情況,導致轉換成二叉樹,就有左傾和右傾

3. 復雜2-3樹轉紅黑樹

簡單2-3樹轉換紅黑樹的過程中,了解到一個基本的轉換規則右旋定義,接下來我們在一個稍微復雜一點的2-3樹與紅黑樹的對應關系,如下圖;

上圖是一個稍微復雜點的2-3樹,轉換為紅黑樹的過程,是不這樣一張圖讓你對紅黑樹更有感覺了,同時它也滿足一下條件;

  1. 從任意節點到葉子節點,所經過的黑色節點數目相同
  2. 黑色節點保持著整體的平衡性,也就是讓整個紅黑樹接近于O(logn)時間復雜度
  3. 其他紅黑樹的特點也都滿足,可以對照紅黑樹的特性進行比對

四、紅黑樹

1. 平衡操作

通過在上一章節2-3樹的學習,在插入節點時并不會插到空位置,而是與現有節點融合以及調整,保持整個樹的平衡。

而紅黑樹是2-3-4樹的一種概念模型轉換而來,在插入節點時通過紅色鏈接相連,也就是插入紅色節點。插入完成后進行調整,以保持樹接近平衡。

那么,為了讓紅黑樹達到平衡狀態,主要包括染色、?左右旋轉、這些做法其實都是從2-3樹演化過來的。接下來我們就分別講解幾種規則的演化過程,以此更好了解紅黑樹的平衡操作。

1.1 左旋轉

左旋定義: 把一個向右傾斜的紅節點鏈接(2-3樹,3-叉雙元素節點),轉化為左鏈接。

背景:順序插入元素,1、2、3,2-3樹保持平衡,紅黑樹暫時處于右傾斜。

接下來我們分別對比兩種樹結構的平衡操作;

  1. 2-3樹,所有插入的節點都會保持在一個節點上,之后通過調整節點位置,保持平衡。
  2. 紅黑樹,則需要通過節點的左側旋轉,將元素2拉起來,元素1和元素3,分別成為左右子節點。

紅黑樹的左旋,只會處理與之對應的2-3樹節點進行操作,不會整體改變。

1.2 右旋轉

右旋定義: 把一個向左傾斜的紅節點連接(2-3樹,3-叉雙元素節點),轉換為右連接。

背景:順序插入元素,3、1、1,2-3樹保持平衡,紅黑樹暫時處于左傾斜。

接下來我們分別對比兩種樹結構的平衡操作;

  1. 2-3樹,所有插入的節點都會保持在一個節點上,之后通過調整節點位置,保持平衡。
  2. 紅黑樹,則需要通過節點的右側旋轉,將元素2拉起來,元素1和元素3,分別成為左右子節點。

你會發現,左旋與右旋是相互對應的,但在2-3樹中是保持不變的

1.3 左右旋綜合運用

左旋、右旋,我們已經有了一個基本的概念,那么接下來我們再看一個可以綜合左右旋以及對應2-3樹的演化案例,如下;

以上的例子分別演示了一個元素插入的三種情況,如下;

  1. 1、3,插入0,左側底部插入,與2-3樹相比,需要右旋保持平衡
  2. 1、3,插入2,中間位置插入,首先進行左旋調整元素位置,之后進行右旋進行樹平衡
  3. 1、3,插入5,右側位置插入,此時正好保持樹平衡,不需要調整

1.4 染色

在2-3樹中,插入一個節點,為了保持樹平衡是不插入到空位置上的,當插入節點后元素數量有3個后則需要調整中間元素向上,來保持樹平衡。與之對應的紅黑樹則需要調整顏色,來保證紅黑樹的平衡規則,具體參考如下;

2. 旋轉+染色運用案例

接下來我們把上面講解到的旋轉染色,運用到一個實際案例中,如下圖;

  • 首先從左側開始,是一個按照順序插入生產出來的紅黑樹,插入順序;7、2、8、1、4、3、5
  • α,向目前紅黑樹插入元素6,插入后右下角有三個紅色節點;3、5、6
  • β,因為右下角滿足染色條件,變換后;黑色節點(3、5)、紅色節點(4、6)。
  • γ,之后看被紅色連線鏈接的節點7、4、2,最小節點在中間,左旋平衡樹結構。
  • δ,左旋完成后,紅色鏈接線的7、4、2為做傾順序節點,因此需要做右旋操作。
  • ε,左旋、右旋,調整完成后,又滿足了染色操作。到此恢復紅黑樹平衡。

注意,所有連接紅色節點的,都是是紅色線。以此與2-3樹做對應。

3. 刪除操作

根據2-3-4樹模型的紅黑樹,在刪除的時候基本是按照2-3方式進行刪除,只不過在這個過程中需要染色和旋轉操作,以保持樹平衡。刪除過程主要可以分為如圖四種情況,如下;

3.1 刪除子葉紅色節點

紅色子葉節點的刪除并不會破壞樹平衡,也不影響樹高,所以直接刪除即可,如下;

3.2 刪除左側節點

3.2.1 被刪節點兄弟為黑色&含右子節點

3.2.2 被刪節點兄弟為黑色&含左子節點

3.2.3 被刪節點兄弟為黑色&含雙子節點(紅)

3.2.4 被刪節點兄弟為黑色&不含子節點

3.2.5 被刪節點兄弟為黑色&含雙黑節點(黑)

3.3. 刪除右側節點

3.3.1 被刪節點兄弟為黑色&含左子節點

3.3.2 被刪節點兄弟為黑色&含右子節點

3.3.3 被刪節點兄弟為黑色&含雙子節點(紅)

3.2.4 被刪節點兄弟為黑色&不含子節點

3.2.5 被刪節點兄弟為黑色&含雙黑節點(黑)

最后

即使是面試跳槽,那也是一個學習的過程。只有全面的復習,才能讓我們更好的充實自己,武裝自己,為自己的面試之路不再坎坷!今天就給大家分享一個Github上全面的Java面試題大全,就是這份面試大全助我拿下大廠Offer,月薪提至30K!

資料領取方式:藍色傳送門

我也是第一時間分享出來給大家,希望可以幫助大家都能去往自己心儀的大廠!為金三銀四做準備!
一共有20個知識點專題,分別是:

Dubbo面試專題

JVM面試專題

這個GItHub上的Java項目開源了,2020最全的Java架構面試復習指南

Java并發面試專題

這個GItHub上的Java項目開源了,2020最全的Java架構面試復習指南

Kafka面試專題

這個GItHub上的Java項目開源了,2020最全的Java架構面試復習指南

MongDB面試專題

這個GItHub上的Java項目開源了,2020最全的Java架構面試復習指南

MyBatis面試專題

這個GItHub上的Java項目開源了,2020最全的Java架構面試復習指南

MySQL面試專題

這個GItHub上的Java項目開源了,2020最全的Java架構面試復習指南

Netty面試專題

這個GItHub上的Java項目開源了,2020最全的Java架構面試復習指南

RabbitMQ面試專題

這個GItHub上的Java項目開源了,2020最全的Java架構面試復習指南

Redis面試專題

這個GItHub上的Java項目開源了,2020最全的Java架構面試復習指南

Spring Cloud面試專題

這個GItHub上的Java項目開源了,2020最全的Java架構面試復習指南

SpringBoot面試專題

這個GItHub上的Java項目開源了,2020最全的Java架構面試復習指南

zookeeper面試專題

這個GItHub上的Java項目開源了,2020最全的Java架構面試復習指南

常見面試算法題匯總專題

這個GItHub上的Java項目開源了,2020最全的Java架構面試復習指南

計算機網絡基礎專題

這個GItHub上的Java項目開源了,2020最全的Java架構面試復習指南

設計模式專題

這個GItHub上的Java項目開源了,2020最全的Java架構面試復習指南

[外鏈圖片轉存中…(img-38gvEK3Z-1626344127956)]

zookeeper面試專題

[外鏈圖片轉存中…(img-x1BcUbtV-1626344127957)]

常見面試算法題匯總專題

[外鏈圖片轉存中…(img-7RtszomX-1626344127957)]

計算機網絡基礎專題

[外鏈圖片轉存中…(img-xhS1PIPy-1626344127958)]

設計模式專題

[外鏈圖片轉存中…(img-B81wVGev-1626344127959)]

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

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

相關文章

存儲映射I/O(一)

一、存儲映射I/O 存儲映射I/O使一個磁盤文件與存儲空間中的一個緩沖區映射,于是當從緩沖區中取數據,就相當于讀文件中的相應字節。于此類似,將數據存入緩沖區,則相應的字節就自動寫入文件,這樣,就可在不不…

【絕對干貨】kafkastream廣告

Java如何入門? 1、建立好開發環境 首先建立好開發環境非常重要,工欲善其事,必先利其器。做任何開發,首先就是要把這個環境準備好,之后就可以去做各種嘗試,嘗試過程中就能逐漸建立信心。初學者往往在環境配…

存儲映射IO(二)

mmap父子進程間通信 1. 測試代碼&#xff1a; #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/mman.h> #include <sys/wait.h>int var 100;int main(void) {int *p;pid_t pid;int fd;…

【聊透SpringMVC】java技術經理崗位職責

緩存維護方案一 如果是一讀&#xff08;線程B&#xff09;一寫&#xff08;線程A&#xff09;操作&#xff0c;「先操作緩存&#xff0c;再操作數據庫」。流程圖如下所示&#xff1a; 1.線程A發起一個寫操作&#xff0c;第一步del cache 2.線程A第二步寫入新數據到DB 3.線程…

【聊透SpringMVC】自學java和三大框架要多久

餓了么一面&#xff08;Java&#xff09; hashmap源碼問題 HashMap底層結構 put操作講一下 HashMap、HashMap如何保證線程安全、ConcurrentHashMap JVM有哪些回收算法&#xff0c;對應的收集器有哪些&#xff1f; jvm g1的內存模型講一下&#xff0c;G1和CMS收集器的區別&#…

【設計思想解讀開源框架】mysql官方文檔中文版下載免費

01 源碼分析 源碼閱讀&#xff0c;最核心有三點&#xff1a;技術基礎強烈的求知欲耐心。 1.1 設計模式&#xff08;45設計模式&#xff1a;介紹優缺點應用實例源代碼解決問題&#xff09; 1.2 Spring復習大綱&#xff1a;依賴注入IocBeans注解數據訪問AOPMVC等 1.3 Spring全家…

命令新參

命令形參&#xff1a; 命令行參數是使用main()函數參數來處理的&#xff0c;其中&#xff0c;argc是指傳入參數的個數&#xff0c;argv[]是一個指針數組&#xff0c;指向傳遞給程序的每個參數。 應當指出的是&#xff0c; argv[0]存儲程序的名稱&#xff0c;argv[1]是一個指向…

【金三銀四】啟動mysql服務器

微服務架構 ①微服務概念&#xff1a; ②Spring Cloud微服務架構&#xff1a; 海量數據處理 ①&#xff1a;經典的海量數據處理面試題 高可用架構 ①基于 Hystrix 實現高可用&#xff1a; ②限流&#xff1a; ③熔斷&#xff1a; 高并發架構 ①消息隊列&#xff1a; ②搜索…

函數fork vfork

一、函數fork fork函數原型&#xff1a; #include <unistd.h> pid_t fork(void); 二、程序清單 1. 測試代碼&#xff1a; #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h>…

【金三銀四】微軟java后端社招

分布式系統特性與衡量標準 透明性&#xff1a;使用分布式系統的用戶并不關心系統是怎么實現的&#xff0c;也不關心讀到的數據來自哪個節點&#xff0c;對用戶而言&#xff0c;分布式系統的最高境界是用戶根本感知不到這是一個分布式系統 可擴展性&#xff1a;分布式系統的根…

【面試必會】java虛擬機原理

如何才可以進大廠&#xff1f; 答案其實也很簡單&#xff0c;能力學歷。不知道大家有沒有發現&#xff0c;大廠的一些部門對于學歷要求已經放低了&#xff0c;阿里的一些部門同樣也招大專學歷的程序員&#xff0c;當然肯定也是因為他的能力足夠出色。 對于準備秋招的你來說&a…

函數exec

exec函數族 1. 執行指定目錄下的程序 #include <unistd.h> int execl(const char *path, const char *arg, ...);返回值&#xff1a;若出錯&#xff0c;返回-1&#xff1b;若成功&#xff0c;不返回 分析&#xff1a; path: 要執行的程序的絕對路徑變參arg: 要執行的…

【面試必備】java寫spark好不好

并發編程三大特性 原子性 一個操作或者多次操作&#xff0c;要么所有的操作全部都得到執行并且不會受到任何因素的干擾而中斷&#xff0c;要么所有的操作都執行&#xff0c;要么都不執行。 對于基本數據類型的訪問&#xff0c;讀寫都是原子性的【long和double可能例外】。 …

【面試必備】java面試題視頻講解

二、我們先來看看這份筆記到底有什么 1、先把kubernetes跑起來&#xff08;先跑起來創建kubernetes集群部署應用訪問應用Scale應用滾動更新&#xff09; 2、重要概念 3、部署kubernetes Cluster&#xff08;安裝docker安裝 kubelet.kubeadm和 kubectll用kubeadm 創建cluster&a…

【面試總結】java測試工程師培訓

阿里P8級架構師核心理論落地篇 再造淘寶&#xff0c;貫穿全系&#xff0c;阿里團隊代碼落地&#xff0c;詳細每個版本迭代&#xff0c;拒絕2-3個月PPT架構師再造淘寶之咚寶-技術支撐-完整搭建DevOps再造淘寶之咚寶-統一規則-代碼規范落地解析再造淘寶之咚寶搭建基礎服務再造淘…

進程組的應用

一、實驗1 題目&#xff1a;利用進程扇完成一個小實驗。該進程扇有 1 個父進程和 3 個子進程&#xff0c;我們希望達到圖 1 中的效果&#xff0c;即將進程 0 (父進程)和進程 1 設置成一組&#xff0c;假設為組 1&#xff0c;將進程 2 和 進程 3 設置成另一個組&#xff0c;假設…

【原理+實戰+視頻+源碼】docker映射端口教程

阿里巴巴Java崗面試題分享 1.HashMap 的內部結構&#xff1f;內部原理&#xff1f;和 HashTable 的區別&#xff0c;假如發?了 hash 碰撞&#xff0c;如何設計能讓遍歷效率?&#xff1f; 2.講一講講講 ConcurrentHashMap吧。 3.講一下JVM虛擬機內存結構&#xff0c;以及它…

前臺進程組、后臺進程組

一、前臺進程組、后臺進程組 cat | cat & cat | cat | cat 輸出結果&#xff1a; 二、主要函數應用 1. tcgetpgrp函數原型&#xff1a; #include <unistd.h> pid_t tcgetpgrp(int fd);返回值&#xff1a;若成功&#xff0c;返回前臺進程組ID, 若出錯&#xff0c;…

【原理+實戰+視頻+源碼】docker權限參數

一面&#xff1a; 個人介紹加項目介紹20分鐘 微服務架構是什么&#xff0c;它的優缺點&#xff1f; ACID CAP BASE理論 分布式一致性協議&#xff0c;二段、三段、TCC&#xff0c;優缺點 RPC過程 服務注冊中心宕機了怎么辦&#xff1f; 微服務還有其他什么組件 分布式架…

【孤兒進程】孤兒進程組、守護進程

一、孤兒進程組 1. 孤兒進程的定義&#xff1a; 定義1&#xff1a;該進程組的每個成員的父進程要么是該組的成員&#xff0c;要么在其它會話中。 定義2&#xff1a;一個進程不是孤兒進程組的條件是——該組有一個進程&#xff0c;其父進程在屬于同一會話的另一個組中。 只要能…