快速入門數據結構和算法

2021-02-13 阿里技術

阿里妹導讀:有哪些常見的數據結構?基本操作是什麼?常見的排序算法是如何實現的?各有什麼優缺點?本文簡要分享算法基礎、常見的數據結構以及排序算法,給同學們帶來一堂數據結構和算法的基礎課。

文末福利:阿里雲開發者訓練營來了。

一  前言

1  為什麼要學習算法和數據結構?

2  業務開發要掌握到程度?

 

二  數據結構基礎

1  什麼是數據結構?

數據結構是數據的組織、管理和存儲格式,其使用目的是為了高效的訪問和修改數據。

數據結構是算法的基石。如果把算法比喻成美麗靈動的舞者,那麼數據結構就是舞者腳下廣闊而堅實的舞臺。

2  物理結構和邏輯結構的區別?

物理結構就像人的血肉和骨骼,看得見,摸得著,實實在在,如數組、鍊表。

邏輯結構就像人的思想和精神,它們看不見、摸不著,如隊列、棧、樹、圖。

3  線性存儲結構和非線性存儲結構的區別?

 

三  算法基礎

1  什麼是算法?

2  如何衡量算法好壞?

時間複雜度:運行時間長短。

空間複雜度:佔用內存大小。

3  怎麼計算時間複雜度?

大O表示法(漸進時間複雜度):把程序的相對執行時間函數T(n)簡化為一個數量級,這個數量級可以是n、n^2、logN等。

推導時間複雜度的幾個原則:

如果運行時間是常數量級,則用常數1表示。

只保留時間函數中的最高階項。

如果最高階項存在,則省去最高項前面的係數。

時間複雜度對比:O(1) > O(logn) > O(n) > O(nlogn) > O(n^2)。

不同時間複雜度算法運行次數對比:

4  怎麼計算空間複雜度?

常量空間 O(1):存儲空間大小固定,和輸入規模沒有直接的關係。

線性空間 O(n):分配的空間是一個線性的集合,並且集合大小和輸入規模n成正比。

二維空間 O(n^2):分配的空間是一個二維數組集合,並且集合的長度和寬度都與輸入規模n成正比。

遞歸空間 O(logn):遞歸是一個比較特殊的場景。雖然遞歸代碼中並沒有顯式的聲明變量或集合,但是計算機在執行程序時,會專門分配一塊內存空間,用來存儲「方法調用棧」。執行遞歸操作所需要的內存空間和遞歸的深度成正比。

5  如何定義算法穩定性?

穩定:如果a原本在b前面,而a=b,排序之後a仍然在b的前面。

不穩定:如果a原本在b的前面,而a=b,排序之後 a 可能會出現在 b 的後面。

6  有哪些常見算法?

首先要明確:特定算法解決特定問題。

其中,字符串、查找、排序算法是最基礎的算法。

四  常見數據結構

1  數組

1)什麼是數組?

數據是有限個相同類型的變量所組成的有序集合。數組中的每一個變量被稱為元素。

2)數組的基本操作?

讀取O(1)、更新O(1)、插入O(n)、刪除O(n)、擴容O(n)。

2  鍊表

1)什麼是鍊表?

鍊表是一種在物理上非連續、非順序的數據結構,由若干個節點組成。

單向鍊表的每一個節點又包含兩部分,一部分是存放數據的變量data,另一部分是指向下一個節點的指針next。

2)鍊表的基本操作?

讀取O(n)、更新O(1)、插入O(1)、刪除O(1)。

3)鍊表 VS 數組

數組:適合多讀、插入刪除少的場景。

鍊表:適用於插入刪除多、讀少的場景。

3  棧

1)什麼是棧?

棧是一種線性邏輯數據結構,棧的元素只能後進先出。最早進入的元素存放的位置叫做棧底,最後進入的元素存放的位置叫棧頂。

一個比喻,棧是一個一端封閉一端的開放的中空管子,隊列是兩端開放的中空管子。

2)如何實現棧?

數組實現:

鍊表實現:

3)棧的基本操作

入棧O(1)、出棧O(1)。

4)棧的應用?

4  隊列

1)什麼是隊列?

一種線性邏輯數據結構,隊列的元素只能後進後出。隊列的出口端叫做隊頭,隊列的入口端叫做隊尾。

2)如何實現隊列?

數組實現:

鍊表實現:

3)隊列的基本操作?

入隊 O(1)、出隊 O(1)。

4)隊列的應用

5  哈希表

1)什麼是哈希表?

一種邏輯數據結構,提供了鍵(key)和值(value)的映射關係。

2)哈希表的基本操作?

寫入:O(1)、讀取:O(1)、擴容O(n)。

3)什麼是哈希函數?

哈希表本質上是一個數組,只是數組只能根據下標,像a[0] a[1] a[2] a[3] 這樣來訪問,而哈希表的key則是以字符串類型為主的。

通過哈希函數,我們可以把字符串或其他類型的key,轉化成數組的下標index。

如給出一個長度為8的數組,則:

當key=001121時,

index = HashCode ("001121") % Array.length = 7

當key=this時,

index = HashCode ("this") % Array.length = 6


4)什麼是哈希衝突?

不同的key通過哈希函數獲得的下標有可能是相同的,例如002936這個key對應的數組下標是2,002947對應的數組下標也是2,這種情況就是哈希衝突。

5)如何解決哈希衝突?

開放尋址法:例子Threadlocal。

鍊表法:例子Hashmap。

6  樹

1)什麼是樹?

樹(tree)是n(n≥0)個節點的有限集。

當n=0時,稱為空樹。在任意一個非空樹中,有如下特點:

2)樹的遍歷?

(1)深度優先

前序:根節點、左子樹、右子樹。

中序:左子樹、根節點、右子樹。

後序:左子樹、右子樹、根節點。

實現方式:遞歸或棧。

(2)廣度優先

層序:一層一層遍歷。

實現方式:隊列。

7  二叉樹

1)什麼是二叉樹?

二叉樹(binary tree)是樹的一種特殊形式。二叉,顧名思義,這種樹的每個節點最多有2個孩子節點。注意,這裡是最多有2個,也可能只有1個,或者沒有孩子節點。

2)什麼是滿二叉樹?

一個二叉樹的所有非葉子節點都存在左右孩子,並且所有葉子節點都在同一層級上,那麼這個樹就是滿二叉樹。

3)什麼是完全二叉樹?

對一個有n個節點的二叉樹,按層級順序編號,則所有節點的編號為從1到n。如果這個樹所有節點和同樣深度的滿二叉樹的編號為從1到n的節點位置相同,則這個二叉樹為完全二叉樹。

8  二叉查找樹

1)什麼是二叉查找樹?

二叉查找樹在二叉樹的基礎上增加了以下幾個條件:

2)二叉查找樹的作用?

3)二叉樹的實現方式?

 

9  二叉堆

1)什麼是二叉堆?

二叉堆是一種特殊的完全二叉樹,它分為兩個類型:最大堆和最小堆。

2)二叉堆的基本操作?

(1)插入:插入最末,節點上浮。

(2)刪除:刪除頭節點,尾節點放到頭部,再下沉。

(3)構建二叉堆:二叉樹==》二叉堆,所有非葉子節點依次下沉。

3)二叉堆的實現方式?

數組:

五  常見排序算法

1  十大經典排序算法

2  冒泡排序

1)算法描述

冒泡排序是一種簡單的排序算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。 

2)實現步驟

3)優缺點

4)適用範圍

數據已經基本有序,且數據量較小的場景。

5)場景優化

(1)已經有序了還再繼續冒泡問題

(2)部分已經有序了,下一輪的時候但還是會被遍歷

(3)只有一個元素不對,但需要走完全部輪排序

 

3  歸併排序

1)算法描述

歸併排序是建立在歸併操作上的一種有效的排序算法。該算法是採用分治法的一個非常典型的應用。遞歸的把當前序列分割成兩半(分割),在保持元素順序的同時將上一步得到的子序列集成到一起(歸併),最終形成一個有序數列。

2)實現步驟

圖源:https://www.cnblogs.com/chengxiao/p/6194356.html

3)優缺點

優點:

性能好且穩定,時間複雜度為O(nlogn) 。

穩定排序,適用場景更多。

缺點:

4)適用範圍

大數據量且期望要求排序穩定的場景。

4  快速排序

1)算法描述

快速排序使用分治法策略來把一個序列分為較小和較大的2個子序列,然後遞歸地排序兩個子序列,以達到整個數列最終有序。

2)實現步驟

3)優缺點

優點:

缺點:

部分場景,排序性能最差為O(n^2)。

不穩定排序。

4)適用範圍

大數據量且不要求排序穩定的場景。

5)場景優化

(1)每次的基準元素都選中最大或最小元素

隨機選擇基準元素,而不是選擇第一個元素。

三數取中法,隨機選擇三個數,取中間數為基準元素。

(2)數列含有大量重複數據

(3)快排的性能優化

5  堆排序

1)算法描述

堆排序(Heapsort)是指利用堆這種數據結構所設計的一種排序算法。堆積是一個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。

2)實現步驟

將堆頂元素R[1]與最後一個元素R[n]交換,此時得到新的無序區(R1,R2,……Rn-1)和新的有序區(Rn),且滿足R[1,2…n-1]<=R[n]。

由於交換後新的堆頂R[1]可能違反堆的性質,因此需要對當前無序區(R1,R2,……Rn-1)調整為新堆,然後再次將R[1]與無序區最後一個元素交換,得到新的無序區(R1,R2….Rn-2)和新的有序區(Rn-1,Rn)。不斷重複此過程直到有序區的元素個數為n-1,則整個排序過程完成。

3)優缺點

優點:

性能較好,時間複雜度為O(nlogn)。

時間複雜度比較穩定。

輔助空間複雜度為O(1)。

缺點:

4)適用範圍

數據量大且數據呈流式輸入的場景。

5)為什麼實際情況快排比堆排快?

堆排序的過程可知,建立最大堆後,會將堆頂的元素和最後一個元素對調,然後讓那最後一個元素從頂上往下沉到恰當的位置,因為底部的元素一定是比較小的,下沉的過程中會進行大量的近乎無效的比較。所以堆排雖然和快排一樣複雜度都是O(NlogN),但堆排複雜度的常係數更大。

6  計數排序

1)算法描述

計數排序不是基於比較的排序算法,其核心在於將輸入的數據值轉化為鍵存儲在額外開闢的數組空間中。作為一種線性時間複雜度的排序,計數排序要求輸入的數據必須是有確定範圍的整數。

2)實現步驟

3)優缺點

優點:

缺點:

4)適用範圍

數列元素是整數,當k不是很大且序列比較集中時適用。

5)場景優化

(1)數字不是從0開始,會存在空間浪費的問題

7  桶排序

1)算法描述

桶排序是計數排序的升級版。它利用了函數的映射關係,高效與否的關鍵就在於這個映射函數的確定。實現原理:假設輸入數據服從均勻分布,將數據分到有限數量的桶裡,每個桶再分別排序(有可能再使用別的排序算法或是以遞歸方式繼續使用桶排序進行排序)。

2)實現步驟

3)優缺點

優點:

缺點:

4)適用範圍

數據服從均勻分布的場景。

8  性能對比

隨機生成區間0 ~ K之間的序列,共計N個數字,利用各種算法進行排序,記錄排序所需時間。

[1]《漫畫算法:小灰的算法之旅》

[2]《算法(第4版)》

[3]《算法圖解》

[4]《劍指Offer》

[5]十大經典排序算法(動圖演示)
https://www.cnblogs.com/onepixel/p/7674659.html

[6]維基百科
https://zh.wikipedia.org/wiki/Wikipedia:%E9%A6%96%E9%A1%B5


阿里雲開發者訓練營

免費的開發者私教課

阿里雲開發者社區重磅打造開發者訓練營,精選最受歡迎的五大訓練營,覆蓋人工智慧,雲原生,AI晶片,開發與運維四大熱門領域,阿里雲資深專家帶給你前所未有的「開發者私教課」,完成學習還有精美獎品贈送,名額有限,快來搶報!

點擊「閱讀原文」快快報名參加吧~

相關焦點

  • 前端學習數據結構與算法系列(一):初識數據結構與算法
    前言作為一個對算法沒有任何認知,非科班出身的前端程式設計師,如果想提高自己的能力,不再只寫業務代碼當一個應用工程師,算法是必須掌握的一門本領。算法也是一種思想,當你去讀一些優秀框架的源碼,如果對算法和數據結構一無所知,讀起來很困難,你無法理解人家為什麼要那樣寫,那樣寫的好處是什麼,接下來就跟大家分享下作為一個前端程式設計師,如何學習數據結構與算法。
  • 考研計算機 | 數據結構—結構算法
    2021計算機考研數據結構—結構算法算法的設計取決於數據(邏輯)結構,而算法的實現依賴於採用的存儲結構
  • JAVA必須掌握的數據結構和算法
    常見的數據結構鍊表LinkedHashSet LinkedList 底層數據結構由鍊表和哈希表組成。數據的添加和刪除都較為方便,就是訪問比較耗費時間。數組ArrayList 訪問數據十分簡單,而添加和刪除數據比較耗工夫堆堆是一種圖的樹形結構,被用於實現「優先隊列",優先隊列是一種數據結構,可以自由添加數據,但取出數據時要從最小值開始按順序取出
  • 算法與數據結構入門:棧與遞歸
    在此之前,我們介紹了動態規劃、深度優先搜索等基礎算法,但是,有部分好友評論說,難度太難了,我們知道動態規劃的自頂向下跟深度優先搜索一般都用遞歸實現,今天我們就先來講講算法與數據結構中,基礎中的基礎遞歸。講遞歸之前,我們先來了解下棧。
  • 數據結構和算法學習指南
    首先,這裡講的都是普通的數據結構和算法,咱不是搞競賽的,野路子出生,只解決常規的問題,以面試為最終目標。另外,以下是我個人的經驗的總結,沒有哪本算法書會寫這些東西,所以請讀者試著理解我的角度,別糾結於細節問題,因為這篇文章就是對數據結構和算法建立一個框架性的認識。
  • 騰訊T4竟然把《數據結構與算法》講明白了,附源碼筆記
    如果一個算法有缺陷,或不適合於某個問題,執行這個算法將不會解決這個問題。不同的算法可能用不同的時間、空間或效率來完成同樣的任務。一個算法的優劣可以用空間複雜度與時間複雜度來衡量。經歷過校招或者面過網際網路大廠的朋友應該知道,算法和數據結構是不可避免的。
  • 資料| 數據結構與算法 JavaScript 描述
    內容簡介 · · · · · ·通過本書的學習,讀者將能自如地選擇最合適的數據結構與算法,並在JavaScript開發中懂得權衡使用。此外,本書也概述了與數據結構與算法相關的JavaScript特性。數組和列表:最常用的數據結構。棧和隊列:與列表類似但更複雜的數據結構。鍊表:如何通過它們克服數組的不足。字典:將數據以鍵-值對的形式存儲。散列:適用於快速查找和檢索。集合:適用於存儲只出現一次的元素。二叉樹:以層級的形式存儲數據。圖和圖算法:網絡建模的理想選擇。
  • 新手入門 | 算法書籍推薦
    《數據結構與算法分析:C語言描述》內容簡介:書中詳細介紹了當前流行的論題和新的變化,討論了算法設計技巧,並在研究算法的性能、效率以及對運行時間分析的基礎上考查了一些高級數據結構,從歷史的角度和近年的進展對數據結構的活躍領域進行了簡要的概括。由於《數據結構與算法分析:C語言描述(原書第2版)》選材新穎,方法實用,題例豐富,取捨得當。
  • 數據結構與算法:聊一聊在面試中被常問的那幾個基礎算法的理解
    上一周的幾篇文章主要分享了有關數據結構相關的知識,有興趣的可以翻回去看一下。前面我也說到:數據結構和算法是一對"相愛相殺的"組合,所以接下來要分享下我個人對於一些算法的理解和實現。本文將主要分享基礎的查找和排序(代碼基於python)既然要開始分享算法,那必然要先介紹下算法相關的一些基本術語,如下。
  • 計算機專業應數據結構和算法至上?還是與業務掛鈎的技術至上?
    數據結構和算法:決定大廠面試成敗的關鍵Pascal之父尼古拉斯·沃斯曾靠一個公式「算法+數據結構=程序」獲得了冠有計算機界諾貝爾獎之稱的圖靈獎。從這個公式中不難看出,編程從本質上來說就是算法加數據結構,而算法是編程思想的核心部分。
  • 數據結構與算法?看這篇就夠了!!!
    真正讓程式設計師有區分度,企業招聘萬年不變的重點 —— 算法與數據結構但無論半路出家還是科班出身,除學生時代搞算法競賽的同學外真正用心學習過算法與數據結構太少太少對於後期想要學習算法與數據結構卻不得不面對以下問題:於是我們推出了「數據結構與算法365天特訓營」實時視頻直播
  • 算法與數據結構?看這篇就夠了
    真正讓程式設計師有區分度,企業招聘萬年不變的重點 —— 算法與數據結構但無論半路出家還是科班出身,除學生時代搞算法競賽的同學外真正用心學習過算法與數據結構太少太少對於後期想要學習算法與數據結構卻不得不面對以下問題:於是我們推出了「數據結構與算法365天特訓營」實時視頻直播
  • Python數據結構與算法分析
    給定一個問題,計算機科學家的目標是開發一個能夠逐步解決該問題的算法。算法是具有有限步驟的過程,依照這個過程便能解決問題。因此,算法是解決方案。在研究問題解決過程的同時,計算機科學也研究抽象。抽象思維使我們分別從邏輯視角和物理視角來看待問題和解決方案。2、為何學習數據結構及抽象數據類型?過程抽象將功能的實現細節隱藏起來,從而使用戶能從更高的視角來看待功能。
  • 我們為什麼要學習數據結構和算法?
    對於我們來說,數據結構和算法是那麼熟悉,又是那麼陌生。作為計科院的學生,大學裡都接觸過,但是進入社會以後,我們看起來很少會用到這個。這時候不僅會想到一件問題,學習數據結構和算法真的有用嗎?不學習這個就不能做開發了嗎?在當今的IT行業裡面,有些人不懂數據結構和算法,也能做一輩子的開發,這沒啥毛病,但是兄弟們,開發是開發,那可不是研發啊。
  • 小夕的算法入門之路
    小夕都快要成XX入門指導專業戶了QAQ,小夕是要寫人工智慧和計算機乾貨的啊喂~好吧,問小夕如何入門算法的小夥伴太多了,還是寫一篇文章吧。
  • JavaScript 數據結構與算法之美 - 十大經典排序算法匯總(上)
    筆者寫的 JavaScript 數據結構與算法之美系列用的語言是 JavaScript ,旨在入門數據結構與算法和方便以後複習。文中包含了十大經典排序算法的思想、代碼實現、一些例子、複雜度分析、動畫、還有算法可視化工具。
  • 面試經驗分享之數據結構、算法題
    前言面試 IT 企業的研發崗位,數據結構和算法顯然是必考的項目。俺只學過普通的數據結構課程,沒讀過 STL,也沒有過 ACM 的訓練和比賽經歷,在一開始面對這樣類型題目的時候,心裡還是十分忐忑的。大大小小几十場面試下來,自己在這方面總算有了一定的心得積累,在此拋磚引玉, 以饗讀者。
  • 數據結構快速盤點 - 非線性結構
    那麼有了線性結構,我們為什麼還需要非線性結構呢? 答案是為了高效地兼顧靜態操作和動態操作。大家可以對照各種數據結構的各種操作的複雜度來直觀感受一下。我剛才提到了樹是一種遞歸的數據結構,因此樹的遍歷算法使用遞歸去完成非常簡單,幸運的是樹的算法基本上都要依賴於樹的遍歷。 但是遞歸在計算機中的性能一直都有問題,因此掌握不那麼容易理解的"命令式地迭代"遍歷算法在某些情況下是有用的。如果你使用迭代式方式去遍歷的話,可以藉助上面提到的棧來進行,可以極大減少代碼量。
  • 數據結構和算法 四階段 72 篇總結!
    在所有基本功中,最核心的一定是數據結構與算法。王爭根據自己研讀數十本算法書籍和多年項目開發的經驗,精選了 20 個最實用數據結構和算法結合具體的軟體開發實例,由淺入深進行講解背後的設計思想,並適時總結一些實用「寶典」,保證你印象深刻,並且能夠迅速對應到實際工作場景中。
  • 【圖文並茂】408數據結構中的排序算法講解
    排序是數據結構中的重要知識點,也是考研中的必考內容,一般會在選擇題第11題考察,最常見的題目類型是給出一串記錄和經過若干趟排序之後的記錄,判斷可能屬於哪種排序算法