在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

一堂數據結構和算法的基礎課

算法與數據結構 ? 來源:阿里技術 ? 2020-09-03 10:28 ? 次閱讀

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

一 前言

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

解決特定問題。

深度優化程序性能的基礎。

學習一種思想:如何把現實問題轉化為計算機語言表示。

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

了解常見數據結構和算法,溝通沒有障礙。

活學活用:遇到問題時知道要用什么數據結構和算法去優化。

二 數據結構基礎

1 什么是數據結構?

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

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

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

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

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

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

線性:元素之間的關系是一對一的,如棧、隊列。

非線性:每個元素可能連接0或多個元素,如樹、圖。

三 算法基礎

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 有哪些常見算法?

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

字符串:暴力匹配、BM、KMP、Trie等。

查找:二分查找、遍歷查找等。

排序:冒泡排序、快排、計數排序、堆排序等。

搜索:TFIDF、PageRank等。

聚類分析:期望最大化、k-meanings、k-數位等。

深度學習:深度信念網絡、深度卷積神經網絡、生成式對抗等。

異常檢測:k最近鄰、局部異常因子等。

......

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

四 常見數據結構

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)隊列的應用

消息隊列

多線程的等待隊列

網絡爬蟲的待爬URL隊列

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時,稱為空樹。在任意一個非空樹中,有如下特點:

有且僅有一個特定的稱為根的節點。

當n>1時,其余節點可分為m(m>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)實現步驟

比較相鄰的元素。如果第一個比第二個大,就交換它們兩個。

對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對,這樣在最后的元素應該會是最大的數。

針對所有的元素重復以上的步驟,除了最后一個。

重復步驟1~3,直到排序完成。

3)優缺點

優點:實現和理解簡單。

缺點:時間復雜度是O(n^2),排序元素多時效率比較低。

4)適用范圍

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

5)場景優化

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

本輪排序中,元素沒有交換,則isSorted為true,直接跳出大循環,避免后續無意義的重復。

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

記錄有序和無序數據的邊界,有序的部分在下一輪就不用遍歷了。

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

雞尾酒排序:元素的比較和交換是雙向的,就像搖晃雞尾酒一樣。

3 歸并排序

1)算法描述

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

2)實現步驟

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

把長度為n的輸入序列分成兩個長度為n/2的子序列。

對這兩個子序列分別采用歸并排序。

將兩個排序好的子序列合并成一個最終的排序序列。

3)優缺點

優點:

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

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

缺點:

非原地排序,空間復雜度高。

4)適用范圍

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

4 快速排序

1)算法描述

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

2)實現步驟

從數列中挑出一個元素,稱為 “基準值”(pivot)。

重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的后面(相同的數可以到任一邊)。在這個分區退出之后,該基準就處于數列的中間位置。這個稱為分區(partition)操作。

遞歸地對【小于基準值元素的子數列】和【大于基準值元素的子數列】進行排序。

3)優缺點

優點:

性能較好,時間復雜度最好為O(nlogn),大多數場景性能都接近最優。

原地排序,時間復雜度優于歸并排序。

缺點:

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

不穩定排序。

4)適用范圍

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

5)場景優化

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

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

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

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

大于、小于、等于基準值。

(3)快排的性能優化

雙軸快排:2個基準數,例子:Arrays.sort() 。

5 堆排序

1)算法描述

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

2)實現步驟

將初始待排序關鍵字序列(R1,R2….Rn)構建成最大堆,此堆為初始的無序區。

將堆頂元素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)實現步驟

找出待排序的數組中最大元素。

構建一個數組C,長度為最大元素值+1。

遍歷無序的隨機數列,每一個整數按照其值對號入座,對應數組下標的值加1。

遍歷數組C,輸出數組元素的下標值,元素的值是幾就輸出幾次。

3)優缺點

優點:

性能完爆比較排序,時間復雜度為O(n+k),k為數列最大值。

穩定排序。

缺點:

適用范圍比較狹窄。

4)適用范圍

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

5)場景優化

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

數列的最小值作為偏移量,以數列最大值-最小值+1作為統計數組的長度。

7 桶排序

1)算法描述

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

2)實現步驟

創建桶,區間跨度=(最大值-最小值)/(桶的數量-1)。

遍歷數列,對號入座。

每個桶內進行排序,可選擇快排等。

遍歷所有的桶,輸出所有元素。

3)優缺點

優點:

最優時間復雜度為O(n),完爆比較排序算法。

缺點:

適用范圍比較狹窄。

時間復雜度不穩定。

4)適用范圍

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

8 性能對比

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 算法
    +關注

    關注

    23

    文章

    4700

    瀏覽量

    94796
  • 數據結構
    +關注

    關注

    3

    文章

    573

    瀏覽量

    40609
  • 排序算法
    +關注

    關注

    0

    文章

    53

    瀏覽量

    10213

原文標題:快速入門數據結構和算法

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數據結構】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    嵌入式開發入門指南:從零開始學習嵌入式

    特定功能的計算機系統,廣泛應用于智能家居、工業控制、醫療設備、車載系統等領域。 2. 學習嵌入式開發的前置知識熟悉C語言編程掌握基本的數據結構算法了解數字電路與微控制器原理熟悉Linux操作系統
    發表于 05-15 09:29

    程序設計與數據結構

    的地址)出發,采用推導的方式,深入淺出的分析了廣大C程序員學習和開發中遇到的難點。 2. 從方法論的高度對C語言在數據結構算法方面的應用進行了深入講解和闡述。 3. 講解了絕大多數C程序員開發
    發表于 05-13 16:45

    給孩子一堂自然:氣象站如何讓科學觸手可及?

    氣象站
    奕帆科技
    發布于 :2025年05月06日 14:57:01

    迅鐳激光亮相第十五屆鋼結構行業發展論壇

    此前,4月11日至12日,第十五屆鋼結構行業發展論壇成功在京舉行。500余位鋼結構行業專家、學者、企業家齊聚一堂,共商行業發展新趨勢。迅鐳激光作為鋼結構行業智能制造的杰出代表受邀參會,
    的頭像 發表于 04-19 10:32 ?321次閱讀

    寧暢亮相2025中國數據中心液冷技術大會

    日前,2025中國數據中心液冷技術大會在杭州落下帷幕,國內主流數據中心與液冷技術企業齊聚一堂,共同探討“液冷深融合”話題。
    的頭像 發表于 04-16 09:12 ?479次閱讀

    從人工巡到智能督導:廣凌智能督導巡系統功能解析

    傳統課堂管理面臨效率瓶頸時,廣凌科技(廣凌股份)帶著創新答案走進教育數字化轉型現場——智能督導巡系統,套深度融合人工智能與大數據技術的全場景解決方案正悄然重塑教學質量監控體系。這套系統并非簡單
    的頭像 發表于 04-15 17:00 ?349次閱讀
    從人工巡<b class='flag-5'>堂</b>到智能督導:廣凌智能督導巡<b class='flag-5'>課</b>系統功能解析

    0-模擬電子技術基礎課緒論(童詩白、華成英主編)

    介紹了電子技術的發展,模擬信號與模擬電路,電子信息系統的組成,如何學習這門等。
    發表于 03-28 16:08

    低噪聲二次電源模擬電路設計:聚焦于電源模塊的優化

    基于電源模塊的低噪聲二次電源模擬電路設計 引言 模擬電子技術作為門入門性質的技術基礎課,其內容與后續的大量專業都直接關聯,因此各理工類院校所有涉及電類的專業都將其作為后續專業的重
    的頭像 發表于 02-13 10:09 ?4025次閱讀
    低噪聲二次電源模擬電路設計:聚焦于電源模塊的優化

    《HarmonyOS第一課》煥新升級,賦能開發者快速掌握鴻蒙應用開發

    云梯 《HarmonyOS第一課》分為基礎、中級、高級及主題課程四大模塊,為不同層次開發者量身定制學習路徑。 基礎課程針對初級開發者,使其能夠在指導下讓開發者快速入門。傳授HarmonyOS基本概念
    發表于 01-02 14:24

    DDC264配置寄存器數據寫入和320 DCLK時鐘脈沖后的回讀數據結構是什么?

    配置寄存器數據寫入和320 DCLK時鐘脈沖后的回讀數據結構是什么? 根據注和表9,16位配置寄存器數據,4位修訂ID, 300位校驗模式,怎么可能有1024 TOTAL READBACK BITS, format = 0
    發表于 11-19 07:58

    視覺軟件HALCON的數據結構

    在研究機器視覺算法之前,我們需要先了解機器視覺應用中涉及的基本數據結構。Halcon數據結構主要有圖像參數和控制參數兩類參數。圖像參數包括:image、region、XLD,控制參數包括:string、integer、real、
    的頭像 發表于 11-14 10:20 ?1110次閱讀
    視覺軟件HALCON的<b class='flag-5'>數據結構</b>

    架構師日記-從數據庫發展歷程到數據結構設計探析

    數據庫發展史 起初,數據的管理方式是文件系統,數據存儲在文件中,數據管理和維護都由程序員完成。后來發展出樹形
    的頭像 發表于 09-25 11:20 ?1085次閱讀
    架構師日記-從<b class='flag-5'>數據</b>庫發展歷程到<b class='flag-5'>數據結構</b>設計探析

    嵌入式常用數據結構有哪些

    在嵌入式編程中,數據結構的選擇和使用對于程序的性能、內存管理以及開發效率都具有重要影響。嵌入式系統由于資源受限(如處理器速度、內存大小等),因此對數據結構的選擇和使用尤為關鍵。以下是嵌入式編程中常用的幾種數據結構,結合具體特點和
    的頭像 發表于 09-02 15:25 ?944次閱讀

    天合光能至尊打造共享共贏的光儲生態橋梁

    盛宴精彩紛呈,百余位光儲專家、業界學者、合作伙伴、EPC經銷商、投融資機構等行業精英匯聚一堂,座無虛席,探索廣東分布式光儲新質生產力。?
    的頭像 發表于 08-23 17:13 ?1223次閱讀

    神經網絡算法結構有哪些類型

    神經網絡算法是深度學習的基礎,它們在許多領域都有廣泛的應用,如圖像識別、自然語言處理、語音識別等。神經網絡的結構有很多種類型,每種類型都有其獨特的特點和應用場景。以下是對神經網絡算法結構
    的頭像 發表于 07-03 09:50 ?836次閱讀
    主站蜘蛛池模板: 黄网站免费大全 | 日韩欧美色图 | 国产超爽人人爽人人做 | 人人艹人人草 | 扒开双腿疯狂进出爽爽爽 | 视频在线欧美 | 色婷婷婷婷 | 色播激情五月 | 日本特级淫片免费 | 青青导航 | 狠狠干亚洲色图 | 国产亚洲精品成人a在线 | 日本www网站 | 啪啪网站色大全免费 | 中国性猛交xxxx乱大交 | 成人的天堂视频一区二区三区 | 色多多高清在线观看视频www | xx日本69| 免费在线播放毛片 | 婷婷丁香在线 | 三级视频网站在线观看 | 四虎永久网址 | 国产成人夜间影院在线观看 | 91视频看看 | 亚洲区 欧美区 | 美女三级网站 | 免费网站看黄 | 国产精品青草久久 | 天天综合在线视频 | 亚洲国产综合人成综合网站00 | 狠狠色噜噜狠狠狠狠999米奇 | 国产小视频在线看 | 精品国产香港三级 | 国产三级中文字幕 | 视频在线免费观看 | 天堂bt在线网bt | 最近高清在线视频观看免费 | 国产精品黄页网站在线播放免费 | 夜夜夜爽bbbb性视频 | 国产精品福利午夜h视频 | 亚洲爱爱网站 |