1. 程式人生 > >資料結構之線性表的順序儲存結構

資料結構之線性表的順序儲存結構

1.線性表
定義:線性表是零個或多個數據元素的有限序列。
兩種物理結構:順序儲存結構和鏈式儲存結構。

2.線性表的順序儲存結構
定義:是指用一段地址連續的資料單元依次儲存線性表的資料元素。說白了就是在記憶體中佔用一塊空間,然後將相同資料型別的元素依次存入。

線上性表的定義中,指出是用一段地址連續的資料單元儲存線性表中的元素,由於存入的是相同型別的資料元素,所以可以使用陣列來充當這段地址連續的資料單元。在實現線性表的順序儲存時,首先應該先建立這塊地址連續的資料單元。

要使用陣列作為載體來儲存線性表,就涉及到了兩個長度,一個是陣列的長度,是在記憶體中佔用的空間,應該提前定義好陣列的長度即佔用空間的記憶體大小,這個空間大小是固定不變的。且陣列下標是從0開始。另一個是線性表的長度,線性表的長度是線性表中資料元素的長度,隨著資料元素的插入和刪除,線性表的長度是可變的。且線性表的長度是從1開始計數。

程式碼實現線性表的順序儲存結構的建立,插入和刪除。

線性表建立實現的演算法思路:
    1. 首先在記憶體中佔用一塊空間,作為一段地址連續的資料儲存單元,使用一維陣列來實現,即定義一個大小固定的一維陣列。
    2. 建立線性表,即向陣列中新增元素,新增元素的同時記錄線性表的長度。

線性表i位置插入資料元素的演算法思路:
    1. 既然是線上性表的i位置插入資料元素,首先需要判斷i的大小是否超出線性表的長度範圍。
    2. 在i位置插入資料元素,那麼i位置之後的資料元素都需要向後移動一位,可以從陣列末尾開始迴圈直到i,將相應位置的值後移一位。
    3. 將i位置的值修改為插入值。

線性表i位置刪除資料元素的演算法思路:
    1. 與插入的第一步相同,先判斷i的大小是否超出線性表的長度範圍。
    2. 在i位置刪除資料元素,i位置之後的資料元素都需要向前移動一位,陣列從i-1位置開始起迴圈至線性表末尾,將相應位置的值向前移動一位。

程式碼實現:

package com.java.ListInsert;
/*
 * 線性表的順序儲存結構的插入和刪除
 * 陣列作為線性表的載體
 * */
public class LineList {
    
           static int maxLen=20;
    static int[] arrayData=new int[maxLen];
    private static int len=0;
    
    //陣列中新增元素
    public static void add(int e){
        arrayData[len]=e;
        len++;
    }
    
    //建立順序儲存結構的線性表
    public static void lineList(int length){
        if(length<maxLen){
            for(int i=0;i<length;i++){
                add(i);
            }
        }else{
            System.out.println("新增元素溢位!");
        }
    }
    
    //線性表的順序儲存結構i的位置插入元素,線性表從1開始,陣列從0開始
    public static void insert(int i,int element){
        int m;
        if(i<1 || i>len){
            System.out.println("插入位置溢位!");
        }else{
            for(m=maxLen-1;m>=i;m--){
                arrayData[m]=arrayData[m-1];
            }
            arrayData[i-1]=element;
            len++;
            for(int j=0;j<arrayData.length;j++){
                System.out.print(arrayData[j]);
            }
        }
        System.out.println("");
    }
    
    //刪除線性表順序儲存結構i位置的元素
    public static void delete(int i){
        int m;
        if(i<1 || i>len){
            System.out.println("刪除位置出錯");
        }else{
            for(m=i-1;m<maxLen-1;m++){
                arrayData[m]=arrayData[m+1];
            }
            for(int j=0;j<arrayData.length;j++){
                System.out.print(arrayData[j]);
            }
            len--;
        }
    }
    
    public static void main(String[] args){
        lineList(10);
        insert(10,5);
        delete(11);
    }
}

3.順序儲存結構的地址計算方法
儲存器中的每個單元都有自己的編號,這個編號叫地址。

假設每個資料元素佔用的是c個記憶體單元,那麼第i+1個數據元素的儲存單元和第i個數據元素的儲存單元的位置滿足如下關係:LOC(Ai+1)=LOC(Ai)+c,因此可以推出第i個數據元素的儲存單元和第一個元素儲存單元的位置關係:LOC(Ai)=LOC(A1)+(i-1)*c。

3.1 存取的時間複雜度分析
由上面這個公式可以輕易地推算出每個資料元素的位置地址,那麼我們對於線性表中每個位置的資料元素的進行讀入和取出操作的時間對於計算機而言來說都是相同的,是一個常數,用演算法的時間複雜度概念來說,它的存取時間效能為O(1),通常把具有這種特點的儲存結構稱為隨機存取結構。

3.2 插入和刪除的時間複雜度分析
最好的情況就是在表尾插入或刪除一個數據元素,這時不需要移動其他資料元素,時間複雜度為O(n)。最壞的情況
是在第一個位置插入或刪除一個數據元素,時間複雜度為O(n)。從所有的元素來看,位置越靠前,移動次數越多,位置越靠後,移動次數越少,平均移動次數和中間的資料元素移動的次數是相同的,為(n-1)/2。所以插入和刪除的平均時間複雜度為O(n)。

4.線性表順序儲存結構的優缺點
優點:
    1. 不需要為表中元素之間的邏輯關係增加額外的儲存儲存空間;
    2. 可以快速地存取表中任意位置的資料元素(存取時間複雜度為O(1));
缺點:
    1. 插入和刪除需要移動大量的資料元素(插入刪除時間複雜度為O(n));
    2. 難以確定儲存空間的容量;