順序表(SequenceList)
阿新 • • 發佈:2020-07-21
順序表在計算機記憶體中以陣列的形式進行儲存
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)
- 由於順序表的底層是陣列實現的,陣列的長度是固定的,所以在順序表的過程中涉及到了容器的擴容問題,這樣會導致順序表的時間複雜度並不是線性關係,如果順序表在某個結點處涉及到了擴容,耗時也將增多