1. 程式人生 > >常用集合的底層資料結構

常用集合的底層資料結構

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. ArrayListLinkedList的底層奧祕

3.1 List初步分析

邏輯結構:線性結構

物理結構:ArrayList( 順序儲存結構), LinkedList(鏈式儲存結構)

兩者之間的區別:

ArrayList:

LinkedList: 

3.2  順序儲存結構--順序表

在計算機記憶體中以陣列的形式儲存,是指用一組地址連續的儲存單元依次儲存資料元素的結構。

 元素在記憶體中是以順序儲存的,記憶體的區域是一個連續的區塊。

典型的實現:陣列

結合ArrayList:演示操作

3.3 鏈式儲存結構--連結串列

  連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:一個是儲存資料元素的資料域,另一個是儲存下一個結點地址的指標域。 相比於線性表順序結構,連結串列比較方便插入和刪除操作。

       連結串列中是離散的、單獨的空間,通過邏輯上的指標聯絡起來,形成一個整體。

理解連結串列的插入和刪除。

3.4 根據上面的圖:分析ArrayListLinkedList的區別

3.5 【難度5星】思考

如何用java實現MyArrayList , MyLinkedList

4. TreeSet,TreeMap

4.1 SetMap的關係

4.2 set結構分析

邏輯結構是:set本質是集合機構,不過,如果,我增加比較特性後,

物理結構:鏈式結構(TreeSet), 特殊的線性結構(HashSet)

4.3 Tree(樹)的介紹

二叉樹:最多隻有兩個兒子(子樹)。

排序二叉樹:有順序。就是按照所有的左子樹,小於父節點,所有的右子樹,大於父節點。

TreeSet,底層的實現,就是一種特殊的排序二叉樹(紅黑樹)

遊戲:猜數字

1到100之間,先任意選定一個值,對方進行猜測,根據對方的回答,反饋:正確,大了,小了三種結果。問對方最多需要猜幾次?

擴充套件:

為了儲存效率,二叉樹,需要調整.如果,左子樹與右子樹的高度差超過1,就會啟動調整過程,可能改變根節點。

1,2,3,4,5,6,7,8,9

4.4 HashSetHashMap中的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的