天天看點

資料結構與算法(Python)[超詳細版本] 01-2 線性表-順序表的操作(或實作)

資料結構的基本運算:

修改、插入、删除、查找、排序

1) 修改

通過數組的下标便可通路某個特定元素并修改之。

核心語句: V[i]=x;

顯然,順序表修改操作的時間效率是 O(1)

2)插入

線上性表的第i個位置前插入一個元素的示意圖如下

資料結構與算法(Python)[超詳細版本] 01-2 線性表-順序表的操作(或實作)

實作步驟:

将第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)删除

删除順序表中某個指定的元素的示意圖如下:

資料結構與算法(Python)[超詳細版本] 01-2 線性表-順序表的操作(或實作)

删除線性表的第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就是一種元素個數可變的線性表,可以加入和删除元素,并在各種操作中維持已有元素的順序(即保序),而且還具有以下行為特征: