天天看点

数据结构与算法(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就是一种元素个数可变的线性表,可以加入和删除元素,并在各种操作中维持已有元素的顺序(即保序),而且还具有以下行为特征: