資料結構的基本運算:
修改、插入、删除、查找、排序
1) 修改
通過數組的下标便可通路某個特定元素并修改之。
核心語句: V[i]=x;
顯然,順序表修改操作的時間效率是 O(1)
2)插入
線上性表的第i個位置前插入一個元素的示意圖如下
實作步驟:
将第n至第i 位的元素向後移動一個位置;
将要插入的元素寫到第i個位置;
表長加1。
注意:事先應判斷: 插入位置i 是否合法?表是否已滿?
應當有1≤i≤n+1 或 i=[1, n+1]
核心語句:
//c語言
for (n; j>=i; j--)
a[j+1]=a[ j ]; // 元素後移一個位置
a[ i ]=x; // 插入x
n++; // 表長加1
//python 實作
for (j, n, -1)
a[j+1]=a[ j ]; // 元素後移一個位置
a[ i ]=x; // 插入x
n++; // 表長加1
時間複雜度
a. 尾端加入元素,時間複雜度為O(1)
b. 非保序的加入元素(不常見),時間複雜度為O(1)
c. 保序的元素加入,時間複雜度為O(n)
3)删除
删除順序表中某個指定的元素的示意圖如下:
删除線性表的第i個位置上的元素
實作步驟:
- 将第i+1 至第n 位的元素向前移動一個位置;
-
表長減1
注意:事先需要判斷,删除位置i 是否合法?是否為空表?應當有1≤i≤n 或 i=[1, n]
核心語句:
//c語言
for ( j=i+1; j<=n; j++ )
a[j-1]=a[j]; // 元素前移一個位置
n--; // 表長減1
//python
for ( j, n )
a[j-1]=a[j]; // 元素前移一個位置
n--; // 表長減1
時間複雜度
a. 删除表尾元素,時間複雜度為O(1)
b. 非保序的元素删除(不常見),時間複雜度為O(1)
c. 保序的元素删除,時間複雜度為O(n)
順序表的運算效率分析
時間效率分析:
-
算法時間主要耗費在移動元素的操作上,是以 計算時間複雜度的基本操作(最深層語句頻度)
T(n)= O (移動元素次數) 而移動元素的個數取決于插入或删除元素的位置.
讨論1:若在長度為 n 的線性表的第 i 位前 插入一個元素,則向後移動元素的次數f(n)為:
f(n) =n – i + 1
思考:若插入在尾結點之後,則根本無需移動(特别快);
若插入在首結點之前,則表中元素全部要後移(特别慢);
應當考慮在各種位置插入(共n+1種可能)的平均移動次數才合理。
Python中的順序表
Python中的list和tuple兩種類型采用了順序表的實作技術,具有前面讨論的順序表的所有性質。
tuple是不可變類型,即不變的順序表,是以不支援改變其内部狀态的任何操作,而其他方面,則與list的性質類似。
list的基本實作技術
Python标準類型list就是一種元素個數可變的線性表,可以加入和删除元素,并在各種操作中維持已有元素的順序(即保序),而且還具有以下行為特征: