心智圖資源庫 程式設計師面試必須掌握的8種資料結構
程式設計師面試必須掌握的8種資料結構,例如佇列Queue:FIFO先進先出的順序儲存線性資料結構,超市結帳,看看你會不會。
編輯於2023-10-11 09:57:06이것은 (III) 저산소증-유도 인자 프롤릴 하이드 록 실라 제 억제제에 대한 마인드 맵이며, 주요 함량은 다음을 포함한다 : 저산소증-유도 인자 프롤릴 하이드 록 실라 제 억제제 (HIF-PHI)는 신장 빈혈의 치료를위한 새로운 소형 분자 경구 약물이다. 1. HIF-PHI 복용량 선택 및 조정. Rosalasstat의 초기 용량, 2. HIF-PHI 사용 중 모니터링, 3. 부작용 및 예방 조치.
이것은 Kuka Industrial Robots의 개발 및 Kuka Industrial Robot의 모션 제어 지침에 대한 마인드 맵입니다. 주요 내용에는 쿠카 산업 로봇의 역사, 쿠카 산업 로봇의 특성, 쿠카 산업 로봇의 응용 분야, 2. 포장 프로세스에서 쿠카 로봇은 빠르고 일관된 포장 작업을 달성하고 포장 효율성을 높이며 인건비를 줄입니다. 2. 인건비 감소 : 자동화는 운영자에 대한 의존성을 줄입니다. 3. 조립 품질 향상 : 정확한 제어는 인간 오류를 줄입니다.
408 컴퓨터 네트워크가 너무 어렵습니까? 두려워하지 마세요! 나는 피를 구토하고 지식 맥락을 명확히하는 데 도움이되는 매우 실용적인 마인드 맵을 분류했습니다. 컨텐츠는 매우 완전합니다. 네트워크 아키텍처에서 응용 프로그램 계층, TCP/IP 프로토콜, 서브넷 디비전 및 기타 핵심 포인트에 이르기까지 원칙을 철저히 이해하는 데 도움이 될 수 있습니다. 📈 명확한 논리 : Mindmas 보물, 당신은 드문 기회가 있습니다. 서둘러! 이 마인드 맵을 사용하여 408 컴퓨터 네트워크의 학습 경로에서 바람과 파도를 타고 성공적으로 해변을 얻으십시오! 도움이 필요한 친구들과 공유해야합니다!
이것은 (III) 저산소증-유도 인자 프롤릴 하이드 록 실라 제 억제제에 대한 마인드 맵이며, 주요 함량은 다음을 포함한다 : 저산소증-유도 인자 프롤릴 하이드 록 실라 제 억제제 (HIF-PHI)는 신장 빈혈의 치료를위한 새로운 소형 분자 경구 약물이다. 1. HIF-PHI 복용량 선택 및 조정. Rosalasstat의 초기 용량, 2. HIF-PHI 사용 중 모니터링, 3. 부작용 및 예방 조치.
이것은 Kuka Industrial Robots의 개발 및 Kuka Industrial Robot의 모션 제어 지침에 대한 마인드 맵입니다. 주요 내용에는 쿠카 산업 로봇의 역사, 쿠카 산업 로봇의 특성, 쿠카 산업 로봇의 응용 분야, 2. 포장 프로세스에서 쿠카 로봇은 빠르고 일관된 포장 작업을 달성하고 포장 효율성을 높이며 인건비를 줄입니다. 2. 인건비 감소 : 자동화는 운영자에 대한 의존성을 줄입니다. 3. 조립 품질 향상 : 정확한 제어는 인간 오류를 줄입니다.
408 컴퓨터 네트워크가 너무 어렵습니까? 두려워하지 마세요! 나는 피를 구토하고 지식 맥락을 명확히하는 데 도움이되는 매우 실용적인 마인드 맵을 분류했습니다. 컨텐츠는 매우 완전합니다. 네트워크 아키텍처에서 응용 프로그램 계층, TCP/IP 프로토콜, 서브넷 디비전 및 기타 핵심 포인트에 이르기까지 원칙을 철저히 이해하는 데 도움이 될 수 있습니다. 📈 명확한 논리 : Mindmas 보물, 당신은 드문 기회가 있습니다. 서둘러! 이 마인드 맵을 사용하여 408 컴퓨터 네트워크의 학습 경로에서 바람과 파도를 타고 성공적으로 해변을 얻으십시오! 도움이 필요한 친구들과 공유해야합니다!
資料結構
圖Graph,不常考
定義
用網路形式相互連接的節點
術語
頂點:節點
邊:edge,一對節點
權重/成本
類型
有向圖
無向圖
表示方式
鄰接矩陣
鄰接表
遍歷演算法
廣度優先搜尋DFS
深度優先搜尋TFS
面試相關
實現廣度和深度優先搜索
檢查圖是否為樹
計算圖的邊數
求兩個頂點之間的最短距離
單調棧monotone stack很少考
雙端隊列Deque,很少考
並查集Union Find很少考
線段樹,很少考
樹狀數組Binary Indexed Tree,BIT,很少考
字典樹Trie,很少考
定義
也稱為:前綴樹,特殊的樹狀資料結構
用途
解決字串相關問題很有效
提供快速檢索
搜尋字典中的單字
搜尋引擎中自動提供建議
用於IP的路由
面試
計算字典樹中的總單字數
列印儲存在字典樹中的所有單字
使用字典樹對數組中的元素進行排序
使用字典樹從字典形成單字
建構T9字典:字典樹 DFS
散列表/Hash Map 哈希表,常考
定義
鍵值對的形式儲存唯一識別的對象
字典:鍵值對的集合
使用鍵key搜尋物件value
Java 中的 HashSet / HashMap,C 中的 unordered_map,Python 中的 dict
支援操作:O(1) Insert / O(1) Find / O(1) Delete
哈希表的工作原理
<br>工作原理:對於set。 key透過hash函數得到一個index,然後把value存在數組裡。 <br>對於get,透過key和hash函數求出index,得到value。
為什麼 hash 上各種操作的時間複雜度不能單純的認為是 O(1) 的
key可以是字串,整數等未知長度的東西。所以用O(L)合適;任何操作的時間複雜度從嚴格意義上來說 都是 O(keySize) 而不是 O(1)<br>
哈希函數該如何實現
128 哈希函數
哈希衝突(Collision)該如何解決
衝突(Collision),是說兩個不同的 key 經過雜湊函數的計算後,得到了兩個相同的值。解決衝突的方法,主要有兩種:<br>開散列法(Open Hashing)。是指哈希表所基於的陣列中,每個位置是一個 Linked List 的頭結點。這樣衝突的 <key, value> 二元組,就都放在同一個鍊錶中。 <br>閉散列法(Closed Hashing)。是指在發生衝突的時候,後來的元素,往下一個位置去找空位<br>
如何讓哈希表可以不斷擴容?
129 重哈希
性能因素
哈希函數
哈希表大小
碰撞處理方法
面試
數組中尋找對稱的鍵值對
是否會靈活的使用哈希表解決問題
是否熟練哈希表的基本原理
追蹤便利的完整路徑
尋找數組是否為另一個數組的子集
檢查給定的陣列是否不相交
526. 負載平衡器<br>
134. LRU快取策略<br>657. Insert Delete GetRandom O(1)<br>954. Insert Delete GetRandom O(1) - Duplicates allowed<br>209. 第一個只出現一次的字符
Data Stream類別問題<br>960. First Unique Number in a Stream II<br>138.子陣列總和<br>105. 複製隨機指標的鍊錶<br>171. 亂序字串<br>124.最長連續序列
排序查找
排序
插入排序
快速排序
選擇排序
歸併排序
基數排序
堆排序
尋找
靜態查找表
動態查找表
哈希表
資料結構定義:資料結構可以認為是資料儲存集合以及定義在這個集合上的若干運算(函數)
考法1:問某種資料結構的基本原理,並要求實現
例題:說一下 Hash 的原理並實作一個 Hash 表
考法2:使用某種資料結構完成事情
例題:歸併 K 個有序數組
考法3:實作一種資料結構,提供一些特定的功能
例題:最高頻 K 項問題
時間複雜度:
對多個介面的時間複雜度進行描述<br>
例如你需要設計一個 Set 的資料結構
演算法1:O(n) lowerBound O(1) add
實現方法:使用數組存儲,每次打擂台進行比較,插入就直接插入到數組最後面
演算法2:O(logn) lowerBound O(logn) add
實作方法:使用紅黑樹(Red-black Tree)存儲,Java 裡的 TreeSet,C 裡的 map
數組Array,最常考
類型
一維數組
二維數組
多維數組
子數組
數組一部分
面試題
41. 42,43,最大子數組<br>44. 最小子數組<br>138. 子數組之和
數組區間問題
面試題
30. 插入區間<br>793. 多個陣列的交集<br>156. 合併區間
外排序問題
定義:外部排序演算法(External Sorting),是指在記憶體不夠的情況下,如何對儲存在一個或多個大檔案中的資料進行排序的演算法。 <br>
兩個基本步驟:<br>將大文件切分為若干個小文件,並分別使用內存排好序<br>使用K路歸併算法(k-way merge)將若干個排好序的小文件合併到一個大文件中
面試題
486. Merge K Sorted Arrays<br>104. Merge K Sorted Lists
位元運算
定義:對二進位位元的運算
面試題
365. 二進位中有多少1<br>
樹狀數組很少考
又名:Fenwick Tree 英文名字:Binary Indexed Tree 簡寫:BIT 基於前綴和訊息來實現<br>
雖然名字叫做 Tree,但是用數組(Array)儲存的<br>BIT 是一棵多叉樹,父子關係代表包含關係<br>用 getPrefixSum(k) 實作 getRangeSum(x, y)
時間複雜度
Log(n) 修改任意位置值<br>Log(n) 查詢任意區間和
功能特性
對於一個有N 個數的數組,支援如下功能:<br>update(index, val) // logN 的時間內更新數組中一個位置上的值getPrefixSum(k) // log(K) 的時間內獲得數組中前K 個數的和
面試題
817. 範圍矩陣元素和-可變的<br>249. 統計前面比自己小的數的個數
操作
增get
刪delete
插入insert、
大小size
面試相關
尋找數組中第二小的元素
找第一個不重複的整數
重新排列數組中的正負值
65. 兩個排序數組的中位數,難題<br>
6. 合併排序數組II<br>64.合併排序數組<br>839.合併兩個排序的間隔列表<br>486. Merge K Sorted Arrays<br>577.合併K個排序間隔列表<br>547 . 兩個數組的交集<br>548. 兩個數組的交集II<br>793. 多個數組的交集<br>654. 稀疏矩陣乘法<br>931. Median of K Sorted Arrays<br>149. 買賣股票的最佳時機<br>405. 和為零的子矩陣<br>944. Maximum Submatrix<br>943. Range Sum Query - Immutable<br>665. 平面範圍求和-不可變矩陣<br>840.可變範圍求和
棧Stack,不常考
定義
後進先出LIFO。例如物流裝車,後裝的貨物先卸
支援操作:O(1) Push / O(1) Pop / O(1) Top
應用
用於非遞歸的遍歷二元樹,計算逆波蘭表達式,等等。
非遞歸實現DFS的主要資料結構
在寬度優先搜尋(BFS)中,記錄待擴展的節點。
佇列可用於實作訊息佇列(message queue),以完成非同步(asynchronous)任務。
當訊息生產和消費的速度不一致時,就需要訊息佇列,暫時保存那些已經發送而並未接收的訊息。
實作堆疊方式
用一個儲存結構(常用數組,偶見鍊錶),儲存元素
用一個陣列實作三個堆疊?
用兩個佇列實作一個棧? <br>
差別
數組對隨機存取有較好效能。 <br>鍊錶對插入和刪除元素有較好效能。
練習題<br>
lintcode: 495. 實作堆疊
494. 雙佇列實作堆疊<br>
224. 用一個陣列實作三個堆疊<br>
操作
push,頂部插入元素
pop返回並且移除棧頂元素
isEmpty堆疊是空,回傳true
top返回頂部元素,但不移除它
Java,使用java.util.Stack,它是擴展自Vector類,支援push(),pop(),peek(),empty(),search()等操作。
C ,使用<stack>中的stack即可,方法類似Java,只不過C 中peek()叫做top(),而且pop()時,回傳值為空。
Python,直接使用list,查看棧頂用[-1]這樣的切片操作,彈出棧頂時用list.pop(),壓棧時用list.append()。 <br>
面試相關
使用堆疊計算後綴表達式
對棧的元素進行排序
判斷表達式是否括號平衡
隊列Queue,常考
定義
FIFO先進先出的順序儲存線性資料結構,超市結帳
支援操作: O(1) Push / O(1) Pop / O(1) Top
應用
用作 BFS 演算法的主要資料結構
操作
enqueue隊列尾插入元素
dequeue移除隊列頭部元素
isEmpty對列為空,回傳true
top傳回佇列的第一個元素
實現方式
用鍊錶實作隊列?
用兩個棧實作一個佇列? <br>
用循環數組實作佇列?
練習題:955. Implement Queue by Circular Array<br>
面試
使用佇列表示堆疊
對隊列的前面k個元素倒序
使用佇列產生1到n的二進制數
642. Moving Average from Data Stream<br>
955. Implement Queue by Circular Array<br>
鍊錶Linked List,常考
定義
節點鏈:每個節點包含資料和指向後續節點的指針
用途
實作檔案系統,哈希表,鄰接表
類型
單向鍊錶
雙向鍊錶
操作
insertAtEnd
insertAtHead
Delete
DeleteAtHead
Search
isEmpty,為空,回傳true
面試
反轉鍊錶
檢測鍊錶中的循環
返回鍊錶倒數第n個節點
刪除鍊錶中重複項
樹Tree
定義
層級式的資料結構
頂點和邊組成
樹中沒有圖中的環路
術語
root根節點
parent父節點
child子節點
leaf葉子節點
sibling兄弟節點
類型
N元樹
線段樹,基本上不考,萬能的
二元樹,常考
二元搜尋樹
定義:左子樹小於根節點,根節點小於右子樹。效果就是:左邊永遠小於右邊
平衡二元樹
平衡樹(AVL樹)
定義:
它是一 棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二元樹。
實作方法
紅黑樹、AVL、替罪羊樹、Treap、伸展樹
堆疊
定義:堆是一種平衡二元樹,父節點小於子節點,多餘的子節點盡可能的放在左子節點,左右子節點無大小關係。可以用數組實現<br>
支援操作:O(log N) Add / O(log N) Remove / O(1) Min or Max
Max Heap vs Min Heap
值特性:對於min堆,父節點小於子節點,左右子節點無大小關係;對於max類型堆,父節點大於子節點,左右子節點無大小關係;
結構特性:是二元樹,高度logN
時間複雜度:delete, pop 複雜度都是logN,求min,or max複雜度O(1)<br>
插入方法:永遠從左側插入,保證是平衡二元樹,如果插入數字小,那就上移,父節點下移。所以複雜度最大就是logN<br>
刪除方法類似
實作方法:練習題:lintcode 130 heapify<br>
面試練習題
104. Merge K Sorted Lists<br>612. K個最近的點<br>545.前K大數II<br>613. 優異成績<br>486. Merge K Sorted Arrays<br>81. 資料流中位數<br>544. 前K大數<br>401. 排序矩陣中的從小到大第k個數
線段樹 Segment Tree<br>
定義:線段樹是一種高階資料結構,也是一種樹狀結構,精確的說是二元樹。它能夠有效率的處理區間修改查詢等問題。 <br>
備註:基本上不考,但是如果能掌握,可以一口氣解決一大堆問題 線段樹是基於分治法實現的,可以作為很好的分治法的練習
面試
求二元樹高度
在二元搜尋樹中尋找第k個最大值
找出和根節點距離k的節點
在二元樹中尋找給定節點的祖先節點
104. Merge K Sorted Lists<br>
3種方法
方法一:使用 PriorityQueue
方法二:類似歸併排序的分治演算法
方法三:自底向上的兩兩歸併演算法
時間複雜度均為 O(NlogK)
結合:九章演算法 整理而成
練習題都是lintcode的題