常用集合的底層資料結構
1.1 瞭解三個介面: List, Set, Map
1.2 要求掌握的6個具體實現類
List: ArrayList, LinkedList
Set: HashSet, TreeSet
Map: HashMap, TreeMap
【面試】增加兩個實現類:Vector, HashTable
題1: ArrayList和Vector的區別?
題2:HashMap和HashTable的區別?
1.3 程式碼技能
a. set, list, map的迭代訪問(重點:Map集合的迭代)
1.4 理解上的技能(技術選型)
舉例,什麼場景下,使用那個集合,為什麼?
a. 學生管理系統
b. 排隊管理系統
c. 雙色球中獎號碼管理系統
2. 從集合到資料結構
2.1 前言---從6個集合的名字開始
List: ArrayList, LinkedList
Set: HashSet, TreeSet
Map: HashMap, TreeMap
獲得4個數據結構:Array(陣列), Linked(連結串列), Tree(紅黑樹-特別的排序二叉樹), Hash(雜湊表)
2.2 資料結構的介紹
a. 重要性
* 資料結構是:演算法(程式)編寫的基礎;類似於專案開發中,資料庫中表的作用。
* 計算機專業,最核心的課程。考研必考科目。
* 進入好公司的敲門磚。
b. 資料結構的分類
傳統上,我們把資料結構分為邏輯結構和物理結構。
2.3 資料結構的分類
2.3.1 邏輯結構
指反映資料元素之間的邏輯關係的資料結構,其中的邏輯關係是指資料元素之間的前後關係,而與他們在計算機中的儲存位置無關。邏輯結構分為以下四類:
a.集合結構
集合結構中的資料元素同屬於一個集合,他們之間是並列的關係,除此之外沒有其他關係。如下圖,可以很好的表示集合結構中的元素之間的關係:
b.線性結構
線性結構中的元素存在一對一的相互關係。如下圖,可以很好的表示線性結構中的元素之間的關係:
c.樹形結構
樹形結構中的元素存在一對多的相互關係。如下圖,可以很好的表示樹形結構中的元素之間的關係:
d.圖形結構
圖形結構中的元素存在多對多的相互關係。如下圖,可以很好的表示圖形結構中的元素之間的關係:
2.3.2 物理結構
物理結構又叫儲存結構,指資料的邏輯結構在計算機儲存空間的存放形式。通俗的講,物理結構研究的是資料在儲存器中存放的形式。 儲存器主要針對於記憶體而言,像硬碟、軟盤、光碟等外部儲存器的資料組織通常用檔案結構來描述。
A. 分類
資料在記憶體中的儲存結構,也就是物理結構,分為兩種:順序儲存結構和鏈式儲存結構。
順序儲存結構:
是把資料元素存放在地址連續的儲存單元裡,其資料間的邏輯關係和物理關係是一致的。陣列就是順序儲存結構的典型代表。
鏈式儲存結構:
是把資料元素存放在記憶體中的任意儲存單元裡,也就是可以把資料存放在記憶體的各個位置。這些資料在記憶體中的地址可以是連續的,也可以是不連續的。
B. 區別
和順序儲存結構不同的是,鏈式儲存結構的資料元素之間是通過指標來連線的,我們可以通使用指標來找到某個資料元素的位置,然後對這個資料元素進行一些操作。
C. 舉例
打個比方說一下順序儲存結構和鏈式儲存結構的區別:
比如去銀行取錢:
順序儲存結構相當於,所有的客戶按照先來後到的順序有序的的坐在大廳的椅子上(注意:是有順序的坐著哦)。
鏈式儲存結構相當於,所有的客戶只要一到銀行,大堂經理就給他們每人一個號碼,然後他們可以隨便坐在哪個椅子上(隨便坐,不需要按照什麼順序坐),只需要等待工作人員廣播叫號即可。
2.4 總結:
邏輯結構是面向問題的(存在我們的大腦),而物理結構是面向計算機的(存在於我們的計算機記憶體)。
邏輯結構: 集合結構,線性結構, 樹形結構, 圖形結構
面向問題,對於現實問題的抽象。
考慮場景:
菜市場的人:
銀行排隊的人:
企業的領導架構:
複雜的娛樂圈:
物理結構:順序儲存結構和鏈式儲存結構
資料在儲存器中存放的形式。(夢想要落地,我們大腦對現實的抽象,要用程式碼落實下來,就需要把資料儲存到記憶體裡面,即夢想要落地)
3. ArrayList和LinkedList的底層奧祕
3.1 List初步分析
邏輯結構:線性結構
物理結構:ArrayList( 順序儲存結構), LinkedList(鏈式儲存結構)
兩者之間的區別:
ArrayList:
LinkedList:
3.2 順序儲存結構--順序表
在計算機記憶體中以陣列的形式儲存,是指用一組地址連續的儲存單元依次儲存資料元素的結構。
元素在記憶體中是以順序儲存的,記憶體的區域是一個連續的區塊。
典型的實現:陣列
結合ArrayList:演示操作
3.3 鏈式儲存結構--連結串列
連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:一個是儲存資料元素的資料域,另一個是儲存下一個結點地址的指標域。 相比於線性表順序結構,連結串列比較方便插入和刪除操作。
連結串列中是離散的、單獨的空間,通過邏輯上的指標聯絡起來,形成一個整體。
理解連結串列的插入和刪除。
3.4 根據上面的圖:分析ArrayList和LinkedList的區別
3.5 【難度5星】思考
如何用java實現MyArrayList , MyLinkedList
4. TreeSet,TreeMap
4.1 Set和Map的關係
4.2 set結構分析
邏輯結構是:set本質是集合機構,不過,如果,我增加比較特性後,
物理結構:鏈式結構(TreeSet), 特殊的線性結構(HashSet)
4.3 Tree(樹)的介紹
二叉樹:最多隻有兩個兒子(子樹)。
排序二叉樹:有順序。就是按照所有的左子樹,小於父節點,所有的右子樹,大於父節點。
TreeSet,底層的實現,就是一種特殊的排序二叉樹(紅黑樹)
遊戲:猜數字
1到100之間,先任意選定一個值,對方進行猜測,根據對方的回答,反饋:正確,大了,小了三種結果。問對方最多需要猜幾次?
擴充套件:
為了儲存效率,二叉樹,需要調整.如果,左子樹與右子樹的高度差超過1,就會啟動調整過程,可能改變根節點。
1,2,3,4,5,6,7,8,9
4.4 HashSet和HashMap中的Hash(雜湊)
4.4.1定義
【百度百科】散列表(Hash table,也叫雜湊表),是根據關鍵碼值(Key value)而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到陣列中一個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做散列表。
4.4.2 ArrayList的不足
根據下標的查詢效率高,但是,根據存入物件的值來查詢,效率就很低。但是,在實際中,往往都是根據儲存物件的某個值,來查詢。
例如:通訊錄管理:李剛:13812340000
5. 實戰總結
a. 工作中,優先考慮ArrayList, LinkedList(兩個隨便).
b. 不要用set
c. 如果,能夠用Map,毫不猶豫使用HashMap.
相關推薦
常用集合的底層資料結構
1.1 瞭解三個介面: List, Set, Map 1.2 要求掌握的6個具體實現類 List: ArrayList, LinkedList Set: HashSet, TreeSet Map: HashMap, TreeMap 【面試】增加兩個實現類:Vecto
Redis 的底層資料結構(整數集合)
當一個集合中只包含整數,並且元素的個數不是很多的話,redis 會用整數集合作為底層儲存,它的一個優點就是可以節省很多記憶體,雖然字典結構的效率很高,但是它的實現結構相對複雜並且會分配較多的記憶體空間。 而我們的整數集合(intset)可以做到使用較少的記憶體空間卻達到和字典一樣效率的實現,但也是前提的,集合
MySQL索引底層資料結構
MySQL索引底層資料結構 索引到底是什麼 聯合索引結構 聚集索引和非聚集索引 根本區別 MyISAM和InnoDB的索引 MyISAM索引檔案和資料檔案是分離的(非聚集) 主鍵索引 普通索引 InnoDB索引實現(聚集) 主鍵索引 普通索引
redis 系列9 物件型別(字串,雜湊,列表,集合,有序集合)與資料結構關係
原文: redis 系列9 物件型別(字串,雜湊,列表,集合,有序集合)與資料結構關係 一.概述 在前面章節中,主要了解了 Redis用到的主要資料結構,包括:簡單動態字串、連結串列(雙端連結串列)、字典、跳躍表、 整數集合、壓縮列表(後面再瞭解)。Redis沒有直接使用這些資料結構來實現鍵
Java中HashMap底層資料結構
HashMap也是我們使用非常多的Collection,它是基於雜湊表的 Map 介面的實現,以key-value的形式存在。在HashMap中,key-value總是會當做一個整體來處理,系統會根據hash演算法來來計算key-value的儲存位置,我們總是可以通過key快速地存、取value。下
ElasticSearch最佳入門實踐(六十二)type底層資料結構
type,是一個index中用來區分類似的資料的,類似的資料,但是可能有不同的fields,而且有不同的屬性來控制索引建立、分詞器 field的value,在底層的lucene中建立索引的時候,全部是opaque bytes型別,不區分型別的 lucene是沒有
C#的集合類(資料結構)
本文由本人簡書搬遷至此,並做小幅修改。 先上 C#官方文件 。 .NET Framework 提供了一些常用的、標準的 集合類(資料結構) 它們被定義在以下名稱空間中。 !###注意###,Unity目前(2017.3.1f1)穩定執行在.net3.5環境中, 所以.net3.5以上功能基本
Redis底層資料結構--SDS
這是一種用於儲存二進位制資料的一種結構, 具有動態擴容的特點. 其實現位於src/sds.h與src/sds.c中, 其關鍵定義如下: typedef char *sds; /* Note: sdshdr5 is never used, we just access the flags byt
Redis底層資料結構--連結串列
這是普通的連結串列實現, 連結串列結點不直接持有資料, 而是通過void *指標來間接的指向資料. 其實現位於 src/adlist.h與src/adlist.c中, 關鍵定義如下: typedef struct listNode { struct listNode *prev
Redis底層資料結構dict
dict是Redis底層資料結構中實現最為複雜的一個數據結構, 其功能類似於C++標準庫中的std::unordered_map, 其實現位於 src/dict.h 與 src/dict.c中, 其關鍵定義如下: typedef struct dictEntry {
索引底層資料結構和演算法
索引是高效、排序好的資料結構。 為什麼不用hash結構,hash雖然單個快,但是範圍慢; 陣列結構的,查詢慢,需要遍歷。 二叉樹結構的,如果資料是從小到大的插入就會屬於單邊資料,一樣速度慢。 紅黑樹結構,雖然能夠實現自動的平衡樹,但是如果資料量非常大的時候,還是會出
Redis常用場景、資料結構、讀寫一致、快取穿透、快取雪崩等
一、分散式系統為什麼要用Redis 1、效能 我們在碰到需要執行耗時特別久,且結果不頻繁變動的 SQL,就特別適合將執行結果放入快取。這樣,後面的請求就去快取中讀取,使得請求能夠迅速響應。 2、併發 在大併發的情況下,所有的請求直接訪問資料庫,資料庫
STL底層資料結構
C++ STL 的實現: 1.vector 底層資料結構為陣列 ,支援快速隨機訪問 2.list &nbs
JAVA (集合和資料結構)
Collection和Collections的區別: 1、java.util.Collection 是一個集合介面。它提供了對集合物件進行基本操作的通用介面方法。Collection介面在Java 類庫中有很多具體的實現。Collection介面的意義是為各種具體的集合提供了最大化的統一操作
ArrayList 和 LinkedList的底層資料結構
LinkedList的實現較為簡單: 底層使用雙向連結串列實現、保留了頭尾兩個指標 、LinkedList的其他操作基本都是基於上面那六個函式實現的,另外LinkedList也有 failFast 機制,這個機制主要在迭代器中使用。 陣列和連結串列各自的特
java基礎09-單列集合、資料結構、比較器
主要內容: List 集合 、Set 集合 、資料結構 一、List介面 List介面是Collection介面下面的一個子介面。 1).這個介面滿足以下特點: 1. 有序。(有序不是順序,有序怎麼存就怎麼取) 2. 有索引 (可以根據索引獲取元素) 3.
深入理解MySQL索引底層資料結構與演算法
一 理解索引的特性 索引是幫助MySQL高效獲取資料的排好序的資料結構 索引儲存在檔案裡 二 索引的各種儲存結構及其優缺點 在開始講這一小節之前,我們先來看一下在資料庫沒有加索引的情況下,SQL中
Mysql索引底層資料結構與演算法
1,索引到底是什麼 2,索引底層資料結構與演算法 3,索引最左字首原理 索引到底是什麼 •索引是幫助MySQL高效獲取資料的排好序的資料結構 索引的本質 MySQL官方對索引的定義為:索引(Index)是幫助MySQL高效獲取資料的資料結構。提取句子主幹,就可
【HashMap】HashMap底層資料結構
HashMap:散列表集合,實現了Map介面,Map又實現了Iterator介面。遍歷Map可以用Iteratoer實現,也可以用Entry(HashMap內部類)實現 兩種實現方式: while(iterator.hasNext) for(map.Entry entr
Redis 底層資料結構
Redis底層使用了6種資料結構來實現上層的各種資料結構,本文將對這6種資料結構分別進行簡單的介紹。本文中的圖片來自《Redis設計與實現第二版》。 Redis資料結構和底層資料結構的對應關係如下: 簡單動態字串 Redis沒有直接使用C字串來儲存字串值,而是自己實現了名為SDS的