JAVA必須掌握的數據結構和算法

2020-12-09 計算機java編程

常見的數據結構

鍊表

LinkedHashSet LinkedList 底層數據結構由鍊表和哈希表組成。

數據的添加和刪除都較為方便,就是訪問比較耗費時間。

數組

ArrayList 訪問數據十分簡單,而添加和刪除數據比較耗工夫

堆是一種圖的樹形結構,被用於實現「優先隊列",優先隊列是一種數據結構,可以自由添加數據,但取出數據時要從最小值開始按順序取出堆的特點:①堆中的每個結點最多有兩個子結點②子結點必定大於父結點③把新數據放在最下面一行靠左的位置。當最下面一行裡沒有多餘空間時,就再往下另起一行,把數據加在這一行的最左端④如果子結點的數字小於父結點的,就將父結點與其左右兩個子結點中較小的一個進行交換堆中最頂端的數據始終最小,所以無論數據量有多少,取出最小值的時間複雜度都為O(1)可知樹的高度為log2n,那麼重構樹的時間複雜度便為O(logn)棧 (LIFO)

隊列 (FIFO)

哈希表 HashSet

TreeSet底層數據結構是紅黑樹哈希函數(Hash)計算key,哈希值除以數組的長度5,求得其餘數。這個餘數就是key的編號即位置如果發生哈希衝突,就使用鍊表進行存儲(鏈地址法)給數組設定合適的空間非常重要除了鏈地址法以外,還有幾種解決衝突的方法。其中,應用較為廣泛的是「開放地址法」。這種方法是指當衝突發生時,立刻計算出一個候補地址(數組上的位置)並將數據存進去。如果仍然有衝突,便繼續計算下一個候補地址,直到有空地址為止。可以通過多次使用哈希函數或「線性探測法」等方法計算候補地址。二叉樹

特點:①第一個是每個結點的值均大於其左子樹上任意一個結點的值②是每個結點的值均小於其右子樹上任意一個結點的值③二叉查找樹的最小結點要從頂端開始,往其左下的末端尋找。此處最小值為3。④二叉查找樹的最大結點要從頂端開始,往其右下的末端尋找添加數據的時候 與頂端數據比較 如果比他小就往左移,左邊沒有節點了就把插入的數據作為新節點添加到左下方,大於他則往右移(左小右大)刪除數據的時候 如果節點沒有子節點 直接刪 如果有一個 刪了後子節點補上,如果有兩個,刪掉後從左子樹中中找最大的補上

比較的次數取決於樹的高度。所以如果結點數為n,而且樹的形狀又較為均衡的話,比較大小和移動的次數最多就是log2n。因此,時間複雜度為O(logn)。但是,如果樹的形狀朝單側縱向延伸,樹就會變得很高,此時時間複雜度也就變成了O(n)。

常見的算法整理

排序

冒泡排序冒泡排序就是重複「從序列右邊開始比較相鄰兩個數字的大小,再根據結果交換兩個數字的位置」這一操作的算法。在這個過程中,數字會像泡泡一樣,慢慢從右往左「浮」到序列的頂端,所以這個算法才被稱為「冒泡排序」冒泡排序的時間複雜度為O(n2)選擇排序選擇排序就是重複「從待排序的數據中尋找最小值,將其與序列最左邊的數字進行交換」這一操作的算法。在序列中尋找最小值時使用的是線性查找每輪中交換數字的次數最多為1次。如果輸入數據就是按從小到大的順序排列的,便不需要進行任何交換。選擇排序的時間複雜度也和冒泡排序的一樣,都為O(n2)。插入排序插入排序的思路就是從右側的未排序區域內取出一個數據,然後將它插入到已排序區域內合適的位置上時間複雜度和冒泡排序的一樣,都為O(n2)。堆排序首先堆中存儲所有的數據,並按降序來構建堆,然後從降序排列的堆中取出數據時會從最大的數據開始取,所以將取出的數據反序輸出,排序就完成了。堆排序的時間複雜度為O(nlogn)。歸併排序歸併排序算法會把序列分成長度相同的兩個子序列,當無法繼續往下分時(也就是每個子序列中只有一個數據時),就對子序列進行歸併。歸併指的是把兩個排好序的子序列合併成一個有序序列。該操作會一直重複執行,直到所有子序列都歸併為一個整體為止。運行時間複雜度為O(nlogn)快速排序快速排序算法首先會在序列中隨機選擇一個基準值(pivot),然後將除了基準值以外的數分為「比基準值小的數」和「比基準值大的數」這兩個類別。解決子問題的時候會再次使用快速排序,甚至在這個快速排序裡仍然要使用快速排序。只有在子問題裡只剩一個數字的時候,排序才算完成。整體的時間複雜度為O(nlogn)。數組查找

線性查找線性查找需要從頭開始不斷地按順序檢查數據,因此在數據量大且目標數據靠後,或者目標數據不存在時,比較的次數就會更多,也更為耗時。若數據量為n,線性查找的時間複雜度便為O(n)。二分查找(略)圖的搜索

廣度優先搜索廣度優先搜索是一種對圖進行搜索的算法。假設我們一開始位於某個頂點(即起點),此時並不知道圖的整體結構,而我們的目的是從起點開始順著邊搜索,直到到達指定頂點(即終點)。在此過程中每走到一個頂點,就會判斷一次它是否為終點。廣度優先搜索會優先從離起點近的頂點開始搜索深度優先搜索深度優先搜索和廣度優先搜索一樣,都是對圖進行搜索的算法,目的也都是從起點開始搜索直到到達指定頂點(終點)。深度優先搜索會沿著一條路徑不斷往下搜索直到不能再繼續為止,然後再折返,開始搜索下一條候補路徑。貝爾曼-福特算法(略)貝爾曼-福特(Bellman-Ford)算法是一種在圖中求解最短路徑問題的算法狄克斯特拉算法(略)A*算法(略)安全算法

共享密鑰加密公開密鑰加密混合加密迪菲-赫爾曼交換其他算法

k-means 算法歐幾裡得算法素性測試網頁排名漢諾塔【拓展】

圖的表示:鄰接矩陣和鄰接表遍歷算法:深度搜索和廣度搜索(必學)最短路徑算法:Floyd,Dijkstra(必學)最小生成樹算法:Prim,Kruskal(必學)實際常用算法:關鍵路徑、拓撲排序(原理與應用)二分圖匹配:配對、匈牙利算法(原理與應用)拓展:中心性算法、社區發現算法(原理與應用)2.圖還是比較難的,不過我覺得圖涉及到的挺多算法都是挺實用的,例如最短路徑的計算等,圖相關的,我這裡還是建議看書的,可以看《算法第四版》。

3、搜索與回溯算法

貪心算法(必學) 啟發式搜索算法:A*尋路算法(了解) 地圖著色算法、N 皇后問題、最優加工順序 旅行商問題

這方便的只是都是一些算法相關的,我覺得如果可以,都學一下。像貪心算法的思想,就必須學的了。建議通過刷題來學習,leetcode 直接專題刷。

4、動態規劃

樹形DP:01背包問題 線性DP:最長公共子序列、最長公共子串 區間DP:矩陣最大值(和以及積) 數位DP:數字遊戲 狀態壓縮DP:旅行商

我覺得動態規劃是最難的一個算法思想了,記得當初第一次接觸動態規劃的時候,是看01背包問題的,看了好久都不大懂,懵懵懂懂,後面懂了基本思想,可是做題下不了手,但是看的懂答案。一氣之下,再leetcdoe專題連續刷了幾十道,才掌握了動態規劃的套路,也有了自己的一套模板。不過說實話,動態規劃,是考的真他媽多,學習算法、刷題,一定要掌握。這裡建議先了解動態規劃是什麼,之後 leetcode 專題刷,反正就一般上面這幾種題型。

5、字符匹配算法

正則表達式 模式匹配:KMP、Boyer-Moore

6、流相關算法

最大流:最短增廣路、Dinic 算法 最大流最小割:最大收益問題、方格取數問題 最小費用最大流:最小費用路、消遣

相關焦點

  • java 數據結構與算法 之遞歸算法
    從事java開發多年,越來越發現要學的很多,但是有什麼辦法呢,誰叫我們已經走上了這條道路呢。我們也只有一點一點的積累,趁現在有時間,今天討論一下java 的數據結構與算法:遞歸算法,希望能達到溫故而知新的效果。一。
  • Java 程式設計師必須掌握的 8 道數據結構面試題你會幾道?
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫40多年後,這個等式仍被奉為真理。這就是為什麼在面試過程中,需要考察軟體工程師對數據結構的理解。幾乎所有的問題都需要面試者對數據結構有深刻的理解。
  • 前端學習數據結構與算法系列(一):初識數據結構與算法
    前言作為一個對算法沒有任何認知,非科班出身的前端程式設計師,如果想提高自己的能力,不再只寫業務代碼當一個應用工程師,算法是必須掌握的一門本領。算法也是一種思想,當你去讀一些優秀框架的源碼,如果對算法和數據結構一無所知,讀起來很困難,你無法理解人家為什麼要那樣寫,那樣寫的好處是什麼,接下來就跟大家分享下作為一個前端程式設計師,如何學習數據結構與算法。
  • 我們到底該如何學習《數據結構與算法》
    第二:工作現在的大廠api框架基本上背後的邏輯就是基於算法實現的。其實算法的種類有很多,比如說機器學習、神經網絡算法,還有java中的排序算法,網際網路的商品推薦、股票預測其背後的邏輯都是算法。就算是熟悉的那些框架,背後的邏輯也是數據結構與算法。我們敲代碼解決問題的過程當中也是算法的集中體現。
  • 尚矽谷Java數據結構與算法、設計模式教程雙雙發布
    算法是程序的靈魂,優秀的程序在對海量數據處理時,依然保持高速計算,就需要高效的數據結構和算法支撐。網上數據結構和算法的教程不少,但存在兩個問題:(1) 授課方式單一,大多是照著代碼念一遍,數據結構和算法本身就比較難理解,對基礎好的學員來說,還好一點,對基礎不好的學生來說,基本上就是聽天書了。
  • 搞大數據,Java 工程師需要掌握哪些知識?
    題目是一名叫「截然不同」的同學私信我的一個問題,原話是,「搞大數據,java 需要掌握哪些技術點?」,我稍微調整了一下。必須得承認一點,我本人沒有搞過大數據,所在這方面的經驗為零。但同學既然問了,咱就不能假裝不知道啊,雖然真的是不知道。但要變強,就必須無所畏懼,迎難而上,對吧?
  • 快速入門數據結構和算法
    本文簡要分享算法基礎、常見的數據結構以及排序算法,給同學們帶來一堂數據結構和算法的基礎課。文末福利:阿里雲開發者訓練營來了。一  前言1  為什麼要學習算法和數據結構?2  業務開發要掌握到程度? 二  數據結構基礎1  什麼是數據結構?數據結構是數據的組織、管理和存儲格式,其使用目的是為了高效的訪問和修改數據。數據結構是算法的基石。如果把算法比喻成美麗靈動的舞者,那麼數據結構就是舞者腳下廣闊而堅實的舞臺。2  物理結構和邏輯結構的區別?
  • 詳解JAVA數據結構與算法:排序算法
    排序算法排序也稱排序算法(Sort Algorithm),排序是將一組數據,依指定的順序進行排列的過程。排序的分類:1) 內部排序:指將需要處理的所有數據都加載到內部存儲器中進行排序。低從圖中可見,我們應該盡可 能 避 免使用 指數階的算法1)常數階O(1)無論代碼執行了多少行,只要是沒有循環等複雜結構,那這個代碼的時間複雜度就都是O(1)
  • Java版數據結構與算法
    如果一個算法有缺陷,或不適合於某個問題,執行這個算法將不會解決這個問題。不同的算法可能用不同的時間、空間或效率來完成同樣的任務。一個算法的優劣可以用空間複雜度與時間複雜度來衡量。算法中的指令描述的是一個計算,當其運行時能從一個初始狀態和(可能為空的)初始輸入開始,經過一系列有限而清晰定義的狀態,最終產生輸出並停止於一個終態。一個狀態到另一個狀態的轉移不一定是確定的。
  • 你必須掌握的 21 個 Java 核心技術!
    在JVM這個大類中,我認為需要掌握的知識有:JVM內存模型和結構GC原理,性能調優調優:Thread Dump, 分析內存結構path, java運行的主目錄等)3. 數據類型這條沒有什麼好多說的,無非就是Java中的基本類型和對象類型的掌握。可以再了解一些JDK如何自動轉換方面的知識,包括裝箱拆箱等,還要注意避免裝箱之後的類型相等的判斷。
  • 數據結構和算法學習指南
    首先,這裡講的都是普通的數據結構和算法,咱不是搞競賽的,野路子出生,只解決常規的問題,以面試為最終目標。另外,以下是我個人的經驗的總結,沒有哪本算法書會寫這些東西,所以請讀者試著理解我的角度,別糾結於細節問題,因為這篇文章就是對數據結構和算法建立一個框架性的認識。
  • 學好Python,必須熟練掌握的幾種數據結構【文末送書】
    實際上,其意在闡明編程的核心在於掌握數據結構與算法!如果把一名優秀的程式設計師比作武林高手,那麼數據結構即為招式,算法則是內功,二者缺一不可。當下,Python語言非常火熱,學好Python就必須掌握好這些數據結構的常用用法。
  • 程式設計師必須掌握的核心算法有哪些?
    由於我之前一直強調數據結構以及算法學習的重要性,所以就有一些讀者經常問我,數據結構與算法應該要學習到哪個程度呢?,說實話,這個問題我不知道要怎麼回答你,主要取決於你想學習到哪些程度,不過針對這個問題,我稍微總結一下我學過的算法知識點,以及我覺得值得學習的算法。
  • 概述Java中的數據結構是什麼及其內部實現原理
    本文主講介紹幾種常用的數據結構,數據結構是一種容器的一個分支,容器時用來裝東西的,那麼數據結構就是專門用來存儲數據的容器。首先我們從數組來給大家漸漸引入數據結構,容器的概念。那麼數組是什麼呢,數組是一個對象,準確的說我們將對象進行分類,具有特定功能的對象就被成為數據結構或者容器,集合等,數組就是其中之一。
  • Java數據結構和算法(三)圖的深度優先遍歷算法,附代碼(DFS)
    所謂圖的遍歷,即是對結點的訪問,一個圖會有很多的結點,那麼如何遍歷這些結點,需要特定的策略,一般有兩種訪問策略深度遍歷優先和廣度遍歷優先。
  • 算法和數據結構最全最易懂總結,再也不怕面試了~
    亦即總結常見的的數據結構,以及在Java中相應的實現方法,務求理論與實踐一步總結到位。好好梳理一下數據結構與算法,畢竟這些基礎知識是很重要的嘛首先給出Java集合框架的基本接口/類層次結構:java.util.Collection [I]    +--java.util.List [I]       +--java.util.ArrayList [C]           +--java.util.LinkedList
  • Java數據結構和算法——圖
    1.1圖的概念圖(Graph),是一種複雜的非線性表結構,圖的元素我們就叫做頂點(vertex),一個頂點可以與任意其他頂點建立連接關係,這種建立的關係叫做邊(edge),頂點相連接的邊的條數叫做度(degree) 。邊有方向的圖叫做有向圖 ,邊無方向的圖叫無向圖 。
  • Java實現冒泡排序算法
    1.引子1.1.為什麼要學習數據結構與算法?有人說,數據結構與算法,計算機網絡,與作業系統都一樣,脫離日常開發,除了面試這輩子可能都用不到呀!有人說,我是做業務開發的,只要熟練API,熟練框架,熟練各種中間件,寫的代碼不也能「飛」起來嗎?於是問題來了:為什麼還要學習數據結構與算法呢?
  • 數據結構和算法 四階段 72 篇總結!
    在所有基本功中,最核心的一定是數據結構與算法。王爭根據自己研讀數十本算法書籍和多年項目開發的經驗,精選了 20 個最實用數據結構和算法結合具體的軟體開發實例,由淺入深進行講解背後的設計思想,並適時總結一些實用「寶典」,保證你印象深刻,並且能夠迅速對應到實際工作場景中。
  • 數據結構與算法大總結
    數據結構知識綜述一、前言經過一個學期對數據結構與算法的學習,對這門課程有了更深入的了解,了解到了數據結構的相關知識,明白了,數據結構的重要性及應用,回顧一個學期,通過這個小論文,來總結一學期的學習成果,數據結構這門課程,具有一定的深度和廣度,有其複雜性,我們一起來分析一下