稀疏陣列、佇列的概念與實踐

?沙漠駱駝發表於2020-04-18

一、前言

資料結構包括:線性結構和非線性結構。

1.1 線性結構

  • 線性結構是最常見的資料結構,其特點是資料元素與下標之間存在一一對應的關係;
  • 線性結構有兩種不同的儲存結構,即順序儲存結構(陣列)和鏈式儲存結構(連結串列)。順序儲存的的線性表稱為順序表,順序表中儲存的資料在儲存空間上是連續的;鏈式儲存的線性表稱為連結串列,連結串列中的資料在儲存空間上不一定是連續的,元素節點中存放資料元素以及相鄰元素的地址資訊。
  • 線性結構常見的有:陣列、佇列、連結串列和棧。

1.2 非線性結構

  • 非線性結構包括:二維陣列、多維陣列、廣義表、圖結構和樹結構。

二、稀疏陣列的概念與實踐

當一個二維陣列存在大量無意義的資料時,可以選擇稀疏陣列來儲存該陣列。

2.1 實際需求

在五子棋程式的實現中,存在存檔退出和續上盤的功能。

因為該二維陣列的預設值是0,因此記錄了很多沒有意義的資料,故可以使用稀疏陣列來儲存該陣列。

2.2 基本介紹

2.2.1 稀疏陣列的處理方式是
  • 記錄陣列有幾行、幾列,有多少個不同的值;
  • 把具有不同值得元素的行列及值記錄在一個小規模的陣列中,從而實現縮小二維陣列的規模。
2.2.2 應用舉例

轉換過後的陣列說明:

  • [0]列:表示原二維陣列有6行7列,其中有8個資料值不是預設值。
  • [1]列:表示原二維陣列0行3列位置的資料值是22。其後的資料表示方式與此相似。
2.2.3 程式碼實現
2.2.3.1 思路分析

  • 二維陣列 轉 稀疏陣列的思路
  1. 遍歷 原始的二維陣列,得到有效資料的個數 sum
  2. 根據sum 就可以建立 稀疏陣列 sparseArr int[sum + 1] [3]
  3. 將二維陣列的有效資料資料存入到 稀疏陣列
  • 稀疏陣列轉原始的二維陣列的思路
  1. 先讀取稀疏陣列的第一行,根據第一行的資料,建立原始的二維陣列,比如上面的 chessArr2 = int [11][11]
  2. 在讀取稀疏陣列後幾行的資料,並賦給 原始的二維陣列 即可.
2.2.3.2 code

程式碼實現:https://github.com/goSilver/daydayup/blob/master/datastructure/src/hanshunping/chapter03/SparseArray.java

三、佇列的概念及實踐

3.1 佇列簡介

  • 佇列是一個有序列表,可以用陣列或是連結串列來實現;
  • 遵循先入先出的原則;

3.2 陣列模擬佇列思路

佇列是有序的,使用陣列機構來模擬佇列時,需要對陣列作以下宣告:

  • maxSize是該佇列的最大容量;

  • 因為佇列的輸入、輸出分別是從前後兩頭來處理,因此需要兩個變數front及rear來分別記錄佇列前後端的下標。front代表佇列頭,隨著資料輸出而改變;rear代表佇列尾,隨著資料輸入而變化。如下圖:

  • 當我們將資料存入佇列是需要兩個步驟:首先判斷佇列是否已滿,若指標rear小於佇列的最大容量maxSize-1,則可以存入,否則不可以存入資料;第二步將尾指標往後移一位(rear++)。

  • 在取資料的時候需要判斷佇列是否為空,若front==rear則表示佇列為空。

3.2.1 code

程式碼實現:https://github.com/goSilver/daydayup/blob/master/datastructure/src/hanshunping/chapter03/arrayqueue/ArrayQueueDemo.java

3.3 使用陣列模擬環形佇列優化

對於3.2中的實現,存在一個問題就是陣列只能使用一次就不能複用了,這裡可以使用一個簡單的演算法,改進成一個環形的陣列。(取模)
思路說明:

  • front變數的含義做一個調整:front直接指向佇列的第一個元素,front的初始值變為0;
  • rear變數的含義做一個調整:rear指向佇列的最後一個元素的後一個位置,因為需要空出一個空間作為約定,rear的初始值為0;
  • 當佇列滿時,條件是(rear + 1) % maxSize = front 【滿】;
  • 佇列為空時,rear == front 【空】;
  • 佇列中有效的資料個數:(rear + maxSize - front) % maxSize
3.3.1 code

程式碼實現:https://github.com/goSilver/daydayup/blob/master/datastructure/src/hanshunping/chapter03/arrayqueue/CircleArrayQueueDemo.java

相關文章