1. 程式人生 > >順序表算法設計筆記

順序表算法設計筆記

blog tdi 將不 個數 新的 滿足 刪除 16px 時間復雜度

1、已知長度為 n 的線性表 A 采用順序存儲結構。設計一個時間復雜度為O(n)、空間復雜度為O(1)的算法,該算法刪除線性表中所有值為 x 的元素數據元素。

以下兩種方法都不滿足要求:

  • 如果刪除一個值為 x 的元素都進行移動, 其時間復雜度為O(n^2),時間復雜度為O(1).
  • 如果借助一個新的順序表, 存放將A中所有不為x的元素,其時間復雜度O(n), 空間復雜度為O(n)。

解法一:設刪除 A 中所有值等於 x 元素後的順序表為A1, 顯然A1包含在 A 中, 為此A1重用 A 的空間。

思路:掃描順序表 A,重建 A 只包含不等於 x 的元素, 代碼如下:

 1 #include <stdio.h>
 2
3 // 線性表 4 typedef struct { 5 int arr[10]; 6 int length; 7 } seq_list; 8 9 void delnodel(seq_list* list, int x) 10 { 11 int k = 0; 12 int i; 13 for (i=0; i<list->length; i++){ 14 if (list->arr[i] != x){ 15 list->arr[k] = list->arr[i]; 16 k++;
17 } 18 } 19 }

解法二: 用 k 記錄順序表 A 中遍歷過元素中等於 x 的元素個數。

思路:將不為 x 的元素前移 k 個位置, 最後修改 A 的長度, 代碼如下:

 1 #include <stdio.h>
 2 
 3 // 線性表
 4 typedef struct {
 5     int arr[10];
 6     int length;
 7 } seq_list;
 8 
 9 void delnode2(seq_list* list, int x)
10 {
11     // 記錄以遍歷的 x 的個數
12     int k = 0
; 13 int i = 0; 14 while (i < list->length){ 15 if (list->arr[i] == x){ 16 k++; 17 } else { 18 list->arr[i-k] = list->arr[i]; // 移動 k 個位置 19 } 20 i++; 21 } 22 list->length -= k; // 更新長度 23 }

上面的兩個解法本質上是幹的事情是一樣的, 將元素移動 n 個位置覆蓋掉不等於x的元素,兩個算法中 n 是相等的,一個通過記錄不等於x的元素個數知道n;一個通過記錄等於x的元素個數知道n;等於x的 + 不等於x的 = 長度;

順序表算法設計筆記