色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

數據結構和算法學習筆記(1)

jf_78858299 ? 來源:labuladong ? 作者:labuladong ? 2023-04-06 16:08 ? 次閱讀

這是好久之前的一篇文章學習數據結構的框架思維的修訂版。之前那篇文章收到廣泛好評,沒看過也沒關系,這篇文章會涵蓋之前的所有內容,并且會舉很多代碼的實例,談談如何使用框架思維,并且給對于算法無從下手的朋友給一點具體可執行的刷題建議。

首先,這里講的都是普通的數據結構和算法,咱不是搞競賽的,野路子出生,只解決常規的問題,以面試為最終目標。另外,以下是我個人的經驗的總結,沒有哪本算法書會寫這些東西,所以請讀者試著理解我的角度,別糾結于細節問題,因為這篇文章就是對數據結構和算法建立一個框架性的認識。

從整體到細節,自頂向下,從抽象到具體的框架思維是通用的,不只是學習數據結構和算法,學習其他任何知識都是高效的。

先說數據結構,然后再說算法。

一、數據結構的存儲方式

數據結構的存儲方式只有兩種: 數組(順序存儲)和鏈表(鏈式存儲)

這句話怎么理解,不是還有散列表、棧、隊列、堆、樹、圖等等各種數據結構嗎?

我們分析問題,一定要有遞歸的思想,自頂向下,從抽象到具體。你上來就列出這么多,那些都屬于「上層建筑」,而數組和鏈表才是「結構基礎」。因為那些多樣化的數據結構,究其源頭,都是在鏈表或者數組上的特殊操作,API 不同而已。

比如說 「隊列 「棧」 這兩種數據結構既可以使用鏈表也可以使用數組實現。用數組實現,就要處理擴容縮容的問題;用鏈表實現,沒有這個問題,但需要更多的內存空間存儲節點指針。

「圖」 的兩種表示方法,鄰接表就是鏈表,鄰接矩陣就是二維數組。鄰接矩陣判斷連通性迅速,并可以進行矩陣運算解決一些問題,但是如果圖比較稀疏的話很耗費空間。鄰接表比較節省空間,但是很多操作的效率上肯定比不過鄰接矩陣。

「散列表」 就是通過散列函數把鍵映射到一個大數組里。而且對于解決散列沖突的方法,拉鏈法需要鏈表特性,操作簡單,但需要額外的空間存儲指針;線性探查法就需要數組特性,以便連續尋址,不需要指針的存儲空間,但操作稍微復雜些。

「樹」 ,用數組實現就是「堆」,因為「堆」是一個完全二叉樹,用數組存儲不需要節點指針,操作也比較簡單;用鏈表實現就是很常見的那種「樹」,因為不一定是完全二叉樹,所以不適合用數組存儲。為此,在這種鏈表「樹」結構之上,又衍生出各種巧妙的設計,比如二叉搜索樹、AVL 樹、紅黑樹、區間樹、B 樹等等,以應對不同的問題。

了解 Redis 數據庫的朋友可能也知道,Redis 提供列表、字符串、集合等等幾種常用數據結構,但是對于每種數據結構,底層的存儲方式都至少有兩種,以便于根據存儲數據的實際情況使用合適的存儲方式。

綜上,數據結構種類很多,甚至你也可以發明自己的數據結構,但是底層存儲無非數組或者鏈表, 二者的優缺點如下

數組由于是緊湊連續存儲,可以隨機訪問,通過索引快速找到對應元素,而且相對節約存儲空間。但正因為連續存儲,內存空間必須一次性分配夠,所以說數組如果要擴容,需要重新分配一塊更大的空間,再把數據全部復制過去,時間復雜度 O(N);而且你如果想在數組中間進行插入和刪除,每次必須搬移后面的所有數據以保持連續,時間復雜度 O(N)。

鏈表因為元素不連續,而是靠指針指向下一個元素的位置,所以不存在數組的擴容問題;如果知道某一元素的前驅和后驅,操作指針即可刪除該元素或者插入新元素,時間復雜度 O(1)。但是正因為存儲空間不連續,你無法根據一個索引算出對應元素的地址,所以不能隨機訪問;而且由于每個元素必須存儲指向前后元素位置的指針,會消耗相對更多的儲存空間。

二、數據結構的基本操作

對于任何數據結構,其基本操作無非遍歷 + 訪問,再具體一點就是:增刪查改。

數據結構種類很多,但它們存在的目的都是在不同的應用場景,盡可能高效地增刪查改 。話說這不就是數據結構的使命么?

如何遍歷 + 訪問?我們仍然從最高層來看,各種數據結構的遍歷 + 訪問無非兩種形式:線性的和非線性的。

線性就是 for/while 迭代為代表,非線性就是遞歸為代表。再具體一步,無非以下幾種框架:

數組遍歷框架,典型的線性迭代結構:

void traverse(int[] arr) {
    for (int i = 0; i < arr.length; i++) {
        // 迭代訪問 arr[i]
    }
}

鏈表遍歷框架,兼具迭代和遞歸結構:

/* 基本的單鏈表節點 */
class ListNode {
    int val;
    ListNode next;
}

void traverse(ListNode head) {
    for (ListNode p = head; p != null; p = p.next) {
        // 迭代訪問 p.val
    }
}

void traverse(ListNode head) {
    // 遞歸訪問 head.val
    traverse(head.next)
}

二叉樹遍歷框架,典型的非線性遞歸遍歷結構:

/* 基本的二叉樹節點 */
class TreeNode {
    int val;
    TreeNode left, right;
}

void traverse(TreeNode root) {
    traverse(root.left)
    traverse(root.right)
}

你看二叉樹的遞歸遍歷方式和鏈表的遞歸遍歷方式,相似不?再看看二叉樹結構和單鏈表結構,相似不?如果再多幾條叉,N 叉樹你會不會遍歷?

二叉樹框架可以擴展為 N 叉樹的遍歷框架:

/* 基本的 N 叉樹節點 */
class TreeNode {
    int val;
    TreeNode[] children;
}

void traverse(TreeNode root) {
    for (TreeNode child : root.children)
        traverse(child)
}

N 叉樹的遍歷又可以擴展為圖的遍歷,因為圖就是好幾 N 叉棵樹的結合體。你說圖是可能出現環的?這個很好辦,用個布爾數組 visited 做標記就行了,這里就不寫代碼了。

所謂框架,就是套路。不管增刪查改,這些代碼都是永遠無法脫離的結構,你可以把這個結構作為大綱,根據具體問題在框架上添加代碼就行了,下面會具體舉例

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

    關注

    23

    文章

    4629

    瀏覽量

    93188
  • 數據結構
    +關注

    關注

    3

    文章

    573

    瀏覽量

    40190
  • 數組
    +關注

    關注

    1

    文章

    417

    瀏覽量

    26001
收藏 人收藏

    評論

    相關推薦

    數據結構算法分析(Java版)(pdf)

    數據結構算法分析(Java版)(pdf)http://www.ibeifeng.com/read.php?tid=4812&u=73481【中文】Java數據結構算法中文第
    發表于 12-20 21:22

    數據結構算法分析

    數據結構算法分析
    發表于 06-05 10:46

    請問學習stm32以及ucos ii ucgui需要學習數據結構算法之類的知識嗎?

    學習stm32以及ucos ii ucgui是否需要學習數據結構算法之類的知識。
    發表于 06-09 23:22

    數據結構教程,下載

    1. 數據結構的基本概念 2. 算法數據結構3. C語言的數據類型及其算法描述要點4.
    發表于 05-14 17:22 ?0次下載
    <b class='flag-5'>數據結構</b>教程,下載

    數據結構算法習題

    數據結構算法習題,ACM專用,刷題初期按照這個地方刷很好
    發表于 03-03 18:25 ?0次下載

    數據結構算法

    全國C語言考試公共基礎知識點——數據結構算法,該資料包含了有關數據結構算法的全部知識點。
    發表于 03-30 14:27 ?0次下載

    數據結構算法分析

    一部淺顯易懂的介紹數據結構算法的書籍。
    發表于 07-14 17:12 ?0次下載

    算法數據結構——接口

    第三章為算法數據結構,本文為3.2.3 接口。
    的頭像 發表于 09-19 17:41 ?8570次閱讀
    <b class='flag-5'>算法</b>與<b class='flag-5'>數據結構</b>——接口

    java數據結構學習

    數據結構是對計算機內存中的數據的一種安排,數據結構包括 數組, 鏈表, 棧, 二叉樹, 哈希表等,算法則對對這些結構中的
    發表于 11-29 09:46 ?804次閱讀

    什么是算法?順序結構的定義如何?算法與順序結構的詳細資料概述

    計算機程序=算法數據結構 計算機程序設計=算法數據結構 +程序設計方法學
    發表于 08-30 08:00 ?0次下載
    什么是<b class='flag-5'>算法</b>?順序<b class='flag-5'>結構</b>的定義如何?<b class='flag-5'>算法</b>與順序<b class='flag-5'>結構</b>的詳細資料概述

    為什么要學習數據結構數據結構的應用詳細資料概述免費下載

    本文檔的主要內容詳細介紹的是為什么要學習數據結構數據結構的應用詳細資料概述免費下載包括了:數據結構在串口通信當中的應用,數據結構在按鍵監測
    發表于 09-11 17:15 ?13次下載
    為什么要<b class='flag-5'>學習</b><b class='flag-5'>數據結構</b>?<b class='flag-5'>數據結構</b>的應用詳細資料概述免費下載

    什么是數據結構?為什么要學習數據結構數據結構的應用實例分析

    本文檔的主要內容詳細介紹的是什么是數據結構?為什么要學習數據結構數據結構的應用實例分析包括了:數據結構在串口通信當中的應用,
    發表于 09-26 15:45 ?14次下載
    什么是<b class='flag-5'>數據結構</b>?為什么要<b class='flag-5'>學習</b><b class='flag-5'>數據結構</b>?<b class='flag-5'>數據結構</b>的應用實例分析

    大牛分享平時如何學習數據結構算法

    數據結構算法的地位對于一個程序員來說不言而喻。今天這篇文章不是來勸你們學習數據結構算法的,也不是來和你們說
    的頭像 發表于 11-02 11:25 ?3001次閱讀

    JavaScrit數據結構算法(第2版)

    JavaScrit數據結構算法(第2版)教材下載。
    發表于 06-01 15:35 ?0次下載

    數據結構算法學習筆記(2)

    首先,這里講的都是普通的數據結構算法,咱不是搞競賽的,野路子出生,只解決常規的問題,以面試為最終目標。另外,以下是我個人的經驗的總結,沒有哪本算法書會寫這些東西,所以請讀者試著理解我的角度,別糾結于細節問題,因為這篇文章就是對
    的頭像 發表于 04-06 16:08 ?626次閱讀
    <b class='flag-5'>數據結構</b>和<b class='flag-5'>算法學習</b><b class='flag-5'>筆記</b>(2)
    主站蜘蛛池模板: 99日影院在线播放 | 果冻传媒在线播放 免费观看 | 处女座历史名人 | 偷窥美女3 | 国产精品成久久久久三级四虎 | 亚洲成年人影院 | 武侠古典久久亚洲精品 | 最近中文字幕在线看免费完整版 | 日韩欧美中文字幕在线二视频 | 国产在线视频分类精品 | 动漫女主被扒开双腿羞辱 | 国产白丝JK被疯狂输出视频 | 欧美97色伦综合网 | 久久国产精品福利影集 | u15女少天堂写真 | 古代荡乳尤物H妓女调教 | 国产在线综合色视频 | 玖玖热视频一区二区人妻 | 亚洲欧美一区二区久久 | 2021全国精品卡一卡二 | 国产成人a一在线观看 | 66美女人体 | 少妇系列之白嫩人妻 | 嫩草国产精品99国产精品 | 嫩草影院永久在线一二三四 | 国产探花在线精品一区二区 | 亚洲不卡视频在线 | 狠狠色丁香久久婷婷综合_中 | adc影院在线 | 欧美大jiji| 亚洲欧美高清在线 | 播色屋97超碰在人人 | 杨幂被视频在线观看 | 国产专区亚洲欧美另类在线 | 免费的黄直播 | 国产高清亚洲日韩字幕一区 | 美国兽皇zoo在线播放 | 久久视频这里只精品99re8久 | 久爱在线中文在观看 | 亚洲 自拍 欧洲 视频二区 | 美女的隐私蜜桃传媒免费看 |