1. 程式人生 > 實用技巧 >順序表(SequenceList)

順序表(SequenceList)

順序表在計算機記憶體中以陣列的形式進行儲存

1. 順序表的API設計

2. 順序表的程式碼實現

import java.util.Objects;

public class SequenceList<T> {
    //記錄當前陣列中元素的個數
    private int N;
    //儲存元素的陣列
    private T[] eles;
    //構造方法
    public SequenceList(int capacity) {
    this.eles = (T[]) new Object[capacity];
    this.N = 0;
    }
    //將順序表清空
    public void clear(){
        this.N = 0;
    }
    //判斷當前線性表是否為空表
    public boolean isEmpty(){
        return N==0;
    }
    //獲取線性表的長度
    public int length(){
        return N;
    }
    //獲取指定位置處的元素
    public T get(int i){
        return eles[i];
    }
    //向順序表中新增元素
    public void insert(T t){
        if (N==eles.length){
            resize(2*eles.length);
        }
        eles[N++] = t;
    }
    //向i索引處插入t元素
    public void insert(int i,T t){
        if (N==eles.length){
            resize(2*eles.length);
        }
        //先把i索引處的元素以及後面的元素一次向後移動一位
        for (int index = N-1;index>=i;index--){
            eles[index] = eles[index-1];
        }
        //再把t元素放到i索引處
        eles[i] = t;
        N++;
    }
    //刪除指定位置處的元素,並返回該元素
    public T remove(int i){
        //記錄索引i處的值
        T current =  eles[i];
        //將索引i後面的元素一次向前移動一位
        for (int index = i;index<N-1;index++){
            eles[index] = eles[index+1];
        }
        N--;
        if (N<eles.length/4){
            resize(eles.length/2);
        }
        return current;
    }
    //查詢t元素第一次出現的位置
    public int indexOf(T t){
        for (int i = 0;i<N;i++){
            if (eles[i].equals(t)){
                return i;
            }
        }
        //-1代表沒有找到
        return -1;
    }
    //根據傳入的引數,重置elsi的大小
    public void resize(int newSize){
        //定義一個臨時陣列,指向原陣列
        T[] temp = eles;
        //建立新陣列
        eles = (T[]) new Objects[newSize];
        //把原陣列的資料拷貝到新陣列即可
        for (int i = 0;i<N;i++){
            eles[i] = temp[i];
        }
    }
}

3. 順序表的時間複雜度

  • 當對順序表進行查詢操作時只需要一次操作就可以,所以時間複雜度為O(1)
  • 當對順序表進行插入操作時,需要把i元素以及後面的元素移動一次,隨著數量的增大,移動的元素也將越來越大,時間複雜度為O(n)
  • 當對順序表進行刪除操作時,需要把i元素以及後面的元素移動一次,當數量很大時,移動的元素也將很大,時間複雜度為O(n)
  • 由於順序表的底層是陣列實現的,陣列的長度是固定的,所以在順序表的過程中涉及到了容器的擴容問題,這樣會導致順序表的時間複雜度並不是線性關係,如果順序表在某個結點處涉及到了擴容,耗時也將增多