1. 程式人生 > 其它 >阿里巴巴二面:資料結構與演算法奪命連環17問

阿里巴巴二面:資料結構與演算法奪命連環17問

前言

金三銀四真的太捲了,最近小編在整理java面試題彙總的時候,無意中尋到了這份阿里面試官手冊,這份面試題還真的與以往的java核心面試知識點有大不同,這份面試官手冊是完全站在面試官出題的角度分析問題,要問它有多香我們且看目錄就完事了,不過小編這裡只摘取了一部分面試官會經常問的分享給到大家。

一、分散式

二、中介軟體

三、大資料與高幵發

四、資料庫

五、設計模式與實踐

六、資料結構與演算法

六、資料結構與演算法

1、樹

樹是一種資料結構,它是由n(n>=1)個有限節點組成一個具有層次關係的集合。

把它叫做"樹"是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。它具有以下的特點∶(01)每個節點有零個或多個子節點;(02)沒有父節點的節點稱為根節點;(03)每一個非根節點有且只有一個父節點;(04)除了根節點外,每個子節點可以分為多個不相交的子樹。

2、BST樹

二叉樹的定義

二叉樹是每個節點最多有兩個子樹的樹結構。它有五種基本形態︰二叉樹可以是空集;根可以有空的左子樹或右子樹﹔或者左、右子樹皆為空。

二叉樹的性質

二叉樹有以下幾個性質:TODO(上標和下標)性質1∶二叉樹第i層上的結點數目最多為2**(i-1}**(i≥1)。性質2∶深度為k的二叉樹至多有2k-1個結點(e1)。性質3∶包含n個結點的二叉樹的高度至少為log2(n+1)。性質4∶在任意一棵二叉樹中,若終端結點的個數為n0,度為2的結點數為n2,則n0=n2+1。

2.1性質1:

二叉樹第層上的結點數目最多為2(l-1(≥1)

證明︰下面用"數學歸納法"進行證明。(O1)當i=1時,第i層的節點數目為2i-1]=2(0)=1。因為第1層上只有一個根結點,所以命題成立。(02)假設當i>1,第i層的節點數目為2i-1)。這個是根據(O1推斷出來的!下面根據這個假設,推斷出"第(i+1)層的節點數目為20)"即可。由於二叉樹的每個結點至多有兩個孩子,故"第(i+1)層上的結點數目”最多是"第i層的結點數目的2倍"。即,第(+1)層上的結點數目最大值=2x2(i-1=20)。故假設成立,原命題得證!

2.2性質2∶

深度為k的二叉樹至多有2k)-1個結點(k≥1)

證明︰在具有相同深度的二叉樹中,當每一層都含有最大結點數時,其樹中結點數最多。利用"性質1"可知,深度為k的二叉樹的結點數至多為:20+21+...+2k-1=2k-1故原命題得證!

2.3性質3∶

包含n個結點的二叉樹的高度至少為log2 (n+1)

證明∶根據"性質2"可知,高度為h的二叉樹最多有2h-1個結點。反之,對於包含n個節點的二叉樹的高度至少為log2(n+1)。

2.4性質4∶

在任意一棵二叉樹中,若終端結點的個數為n0,度為2的結點數為n2,則nO=n2+1

證明︰因為二叉樹中所有結點的度數均不大於2,所以結點總數記為n)="0度結點數n0)"+"1度結點數(n1)"+"2度結點數(n2)"。由此,得到等式一。(等式一)n=n0+n1+n2另一方面,0度結點沒有孩子,1度結點有一個孩子,2度結點有兩個孩子,故二叉樹中孩子結點總數是:n1+2n2。此外,只有根不是任何結點的孩子。故二叉樹中的結點總數又可表示為等式二。(等式二)n=n1+2n2+1由(等式一)和(等式二)計算得到:nO=n2+1。原命題得證!

3、BST樹

定義∶二叉查詢樹(Binary Search Tree),又被稱為二叉搜尋樹。設x為二叉查詢樹中的一個結點,x節點包含關鍵字key,節點x的key值記為keyx。如果y是x的左子樹中的一個結點,則keyly]<=keyIx];如果y是x的右子樹的一個結點,則keyy >= keyx。

在二叉查詢樹中∶(01)若任意節點的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值﹔(02)任意節點的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;(03)任意節點的左、右子樹也分別為二叉查詢樹。(04)沒有鍵值相等的節點

4、AVL樹

AVL樹是高度平衡的二叉搜尋樹,按照二叉搜尋樹(Binary Search Tree )的性質,AVL首先要滿足︰·

  • 若它的左子樹不為空,則左子樹上所有結點的值均小於它的根結點的值;
  • 若它的右子樹不為空,則右子樹上所有結點的值均大於它的根結點的值﹔·
  • 它的左、右子樹也分別為二叉搜尋樹。

AVL樹的性質∶左子樹和右子樹的高度之差的絕對值不超過1樹中的每個左子樹和右子樹都是AVL樹每個節點都有一個平衡因子(balance factor-bf),任一節點的平衡因子是1,0,1之一(每個節點的平衡因子bf 等於右子樹的高度減去左子樹的高度)

當插入或者刪除節點之後,若AVL樹的條件被破壞,則需要進行旋轉操作來調整資料的結構以恢復AVL條件

旋轉至少涉及三層節點,所以至少要向上回溯一層,才會發現非法的平衡因子並進行旋轉向上回溯校驗時,需要進行旋轉的幾種情況:

  • 1.當前節點的父節點的平衡因子等於2時,說明父節點的右樹比左樹高︰這時如果當前節點的平衡因子等於1,那麼當前節點的右樹比左樹高,形”\”,需要進行左旋﹔如果當前節點的平衡因子等於-1,那麼當前節點的右樹比左樹低,形如“>”,需要進行右左雙旋!
  • 2當前節點的父節點的平衡因子等於-2時,說明父節點的右樹比左樹低∶這時如果當前節點的平衡因子等於-1,那麼當前節點的右樹比左樹低,形如”l";需要進行右旋;如果當前節點的平衡因子等於1,那麼當前節點的右樹比左樹高,形如<",需要進行左右雙旋!

5、紅黑樹

紅黑樹是一種自平衡二叉查詢樹,滿足以下條件:

  • 1.節點是紅色或黑色。
  • ⒉根節點是黑色。
  • 3.每個葉子節點都是黑色的空節點(NIL節點)。
  • 4.每個紅色節點的兩個子節點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點)
  • 5.從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點

這些特性使得紅黑樹中從根節點到葉子節點的最長路徑不會超過最短路徑的兩倍

紅黑樹通過變色、左旋和右旋來保持平衡,任何不平衡都會在三次旋轉之內解決

首先紅黑樹是不符合AVL樹的平衡條件的,即每個節點的左子樹和右子樹的高度最多差1的二叉查詢樹。但是提出了為節點增加顏色,紅黑是用非嚴格的平衡來換取增刪節點時候旋轉次數的降低,任何不平衡都會在三次旋轉之內解決,而AVL是嚴格平衡樹,因此在增加或者刪除節點的時候,根據不同情況,旋轉的次數比紅黑樹要多。所以紅黑樹的插入效率更高!!!

6、B-樹

B-樹就是B樹,千萬丌要讀B減樹!!!!

  1. 從演算法邏輯上來講,二叉查詢樹的查詢次數和比較次數都是最小的。但是,我們不得不考慮一個現實的問題︰磁碟Io
  2. 資料庫索引是儲存在磁碟上的,當資料量比較大的時候,索引的大小可能有幾個G甚至更多
  3. 當我們利用索引查詢的時候,能把整個索引檔案全部載入到記憶體嗎?顯然不可能,能做的只有逐一載入每一個磁碟頁,這裡的磁碟頁對應著索引樹的節點

在使用二叉查詢樹查詢過程中,我們發現在最壞的情況下,磁碟IO次數等於索引樹的高度

因此,為了減少磁碟IO次數,我們就需要把原本"瘦高"的樹結構變得"矮胖"些。這就是B-樹的特徵之一B樹是一種多路平衡查詢樹,它的每一個節點最多包含K個孩子,K被稱為B樹的階,K的大小取決於磁碟頁的大小一個m階的B樹具有如下幾個特徵∶

1.根結點至少有兩個子女。

2.每個中間節點都包含k-1個元素和k個孩子,其中m/2 <= k <= m

3.每一個葉子節點都包含k-1個元素,其中m/2<=k <=m

4.所有的葉子結點都位於同一層。

5.每個節點中的元素從小到大排列,節點當中k-1個元素正好是個孩子包含的元素的值域分劃。

在這棵B樹中,假設我們要查詢的查詢關鍵字為6,查詬過程如下:

  • 可是相比磁碟IO的速度,記憶體中比較耗時幾乎可以忽略。所以只要樹的高度足夠低,I0次數足夠小,就可以提升查詢效能
  • 相比之下節點內部元素多一些也沒有關係,僅僅是多了幾次記憶體互動,只要不超過磁碟頁的大小即可。這就是B樹的優勢之一
  • B樹的插入刪除操作.......

7、B+樹

B+樹是基於B-權的一種變體,有著比B-樹更高的查詢效能

一個m階的B+樹具有如下幾個特徵:

1.有k個子樹的中間節點包含有k個元素(B樹中是k-1個元素),每個元素不儲存資料,只用來索引,所有資料都儲存在葉子節點。

2.所有的葉子結點中包含了全部元素的資訊,及指向含這些元素記錄的指標,且葉子結點本身依關鍵字的大小自小而大順序連結。

3.所有的中間節點元素都同時存在於子節點,在子節點元素中是最大(或最小)元素。

由於父節點的元素都出現在子節點中,因此所有的葉子節點包含了全量元素資訊,並且每一個葉子節點都帶有指向下一個節點的指標,形成了一個有序連結串列

B+樹還具有一個特點,這個特點是在索引之外,確是至關重要的特點,那就是【衛星資料】

所謂衛星資料,指的是索引元素所指向的資料記錄,比如資料庫中的某一行。在B-樹種,無論中間節點還是葉子節點都帶有衛星資料

B-樹中的衛星資料

而在B+樹中,只有葉子節點帶有衛星資料,其餘中間節點僅僅是索引,沒有人任何資料關聯B+樹中的衛星資料

需要補充的是,在資料庫的聚集索引 (Clustered Index )中,葉子節點直接包含衛星資料。在非聚集索引( NonClustered lndex )中,葉子節點帶有指向衛星資料的指標。

在B+樹種查詢元素3,流程如下:

第一次磁碟IO:

第二次磁碟IO:

第三次磁碟IO:

與B-樹不同的是,B+樹中間節點沒有衛星資料,所以同樣大小的磁碟頁可以容納更多的節點元素,這意味著,資料量相同的情況下,B+樹的結構比B-樹更加"矮胖”,因此查詢時IO次數也更少

其次,B+樹的查詢必須最終查詢到葉子節點,而B-樹只要找到匹配元素即可,無論匹配元素處於中間節點還是葉子節點

因此,B-樹的查詢效能並不穩定,最好的情況下直查根節點,最壞的情況下查詢到葉子節點,而B+樹的每一次查詢都是穩定的

B+樹的優勢:

1.單一節點儲存更多的元素,使得查詢的IO次數更少。

⒉所有查詢都要查詢到葉子節點,查詢效能穩定。

3.所有葉子節點形成有序連結串列,便於範圍查詢。

8、字典樹

又稱單詞查詢樹,Trie樹,是一種樹形結構,是一種雜湊樹的變形。典型應用是用於統計,排序和儲存大量的字串,所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是利用最大公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比雜湊表高。

性質

  • 根節點不包含字元,除根節點以外的每一個節點都只包含一個字元﹔
  • 從根節點到某一節點,路徑上經過的字串連線起來,為該節點對應的字串
  • 每個節點的所有子節點包含的字元都不相同。

實現方法

搜尋字典專案的方法︰

  • 從根節點開始一次搜尋;
  • ·取得要查詢關鍵詞的第一個字母,並根據該字母選擇對應的子樹繼續進行檢索;
  • 在相應的子樹上,取得要查詢關鍵詞的第二個字母,並進一步選擇對應的子樹進行檢索
  • 迭代下去
  • ·在某個結點處,關鍵詞的所在字母已被取出,則讀取附在該結點上的資訊,即完成查詢。

應用

( 1)串的快速檢索

給出N個單片語成的熟詞表,以及一篇全用小寫英文書寫的文章,請你按最早出現的順序寫出所有不在熟詞表中的生詞。

  • 方法1:可以將英文文章中的所有單詞逐個與熟詞表進行比較,O(N)=O ( navg(length1Navg(length2))=O(nN)
  • 方法2∶採用hash表,
  • 方法3∶採用字典樹,將該熟詞表構成字典樹,然後通過字典樹進行查詢。建樹的時間複雜度:O(n)= O(N),查詢的時間複雜度,只和樹的深度相關,而與熟詞表中有多少個單詞無關,樹的深度又與單詞的長度有關,而單詞最長不過30個字元,因此D(N=O(1);另外在空間複雜度上又優於其他的演算法,由於公共字首的存在,不需要大量儲存重複的字元。

(2)串的排序

給定N個互不相同的僅由一個單詞構成的英文名,讓你將他們按字典序從小到大輸出。

用字典樹進行排序,採用陣列的方式建立字典樹,因為樹的每個結點的所有子結點很顯然是按照其字母大小排序的,那麼對待這棵樹進行先序遍歷即可。

( 3)最長公共字首

對所有串建立字典樹

9、跳錶

10、HashMap

Java為資料結構中的對映定義了一個介面java.util.Map,此介面主要有四個常用的實現類,分別是HashMap.Hashtable、LinkedHashMap和TreeMap,類繼承關係如下圖所示︰

11、ConcurrentHashMap

CAS無鎖演算法

實現方式

  • CAS:Compare and Swap,翻譯成比較並交換。
  • java.util.concurrent包中藉助CAS實現了區別於synchronouse同步鎖的一種樂觀鎖。
  • CAS有3個運算元,記憶體值V,舊的預期值A,要修改的新值B。當且僅當預期值A和記憶體值V相同時,將記憶體值V修改為B,否則什麼都不做。

12、ConcurrentLinkedQueue

延遲更新tail節點

延遲刪除head節點

13、Topk問題

14、資源池思想

15、JVM記憶體管理演算法

16、容器虛擬化技術,Doocker思想

17、持續整合、持續釋出,jenkins

為了不影響大家的閱讀體驗,2022阿里面試官手冊已經為大家打包好了,希望這份面試真題可以對大家今年的金三銀四面試有幫助,有時候內卷幹不過,不如咱們都加入吧!