基于Python的顺序表的运算及应用

一、实验内容

  1. 顺序表创建(注意:顺序表中数据元素的输入形式)。★
  2. 顺序表的基本操作(插入、删除、修改等基本操作及算法实现)。★★
  3. 在顺序表基本运算的基础上实现相关应用算法。★★★

二、实验步骤

1.顺序表的定义

  1. data数组存放线性表元素
  2. data数组的容量(存放最多的元素个数)为capacity。
  3. 线性表中实际数据元素个数size
class SqList:
    def __init__(self):						    #构造函数
        self.initcapacity=5           		    #初始容量设置为10
        self.capacity=self.initcapacity			#容量设置为初始容量
        self.data=[None]*self.capacity			#设置顺序表的空间
        self.size=0

2. 顺序表的扩容

算法描述:

  1. 令olddata指向原data列表;
  2. 为data重新分配新的空间newcapacity;
  3. 将olddata中的所有元素复制到data中。

参考代码:

    def resize(self, newcapacity):			    #改变顺序表的容量为newcapacity
        assert newcapacity>=0					#检测参数正确性的断言
        olddata=self.data
        self.data=[None]*newcapacity
        self.capacity=newcapacity
        for i in range(self.size):
            self.data[i]=olddata[i]

3. 整体创建顺序表(或:表尾添加单个元素创建顺序表)

算法描述:

  1. 依次将a中的元素添加到data数组的末尾
  2. 出现上溢出时按实际元素个数size的两倍扩大容量

参考代码:

    def CreateList(self, a):                    # 由数组a中元素整体建立顺序表
        for i in range(0, len(a)):
            if self.size == self.capacity:      # 出现上溢出时
                self.resize(2 * self.size)      # 扩大容量
            self.data[self.size] = a[i]
            self.size += 1                      # 添加后元素个数增加1

4. 顺序表的长度

算法描述:

  1. 返回顺序表的长度

参考代码:

    def getsize(self):                          # 求线性表长度
        return self.size

5. 顺序表的输出

算法描述:

  1. 依次输出顺序表中的所有元素值

参考代码:

    def display(self):                          # 输出线性表
        for i in range(0, self.size):
            print(self.data[i], end=' ')
        print()

6. 顺序表的插入

算法描述:

  1. 先将data[i...n-1]的每个元素均后移一个位置(从data[n-1]元素开始移动)。
  2. 腾出一个空位置data[i]插入新元素e,最后将长度size增1。
  3. 在插入元素时若出现上溢出,则按两倍size扩大容量。

参考代码:

    def insert(self, i, e):  # 在线性表中序号i位置插入元素e
        assert 0 <= i <= self.size  # 检测参数i正确性的断言
        if self.size == self.capacity:  # 满时倍增容量
            self.resize(2 * self.size)
        for j in range(self.size, i, -1):  # 将data[i]及后面元素后移一个位置
            self.data[j] = self.data[j - 1]
        self.data[i] = e  # 插入元素e
        self.size += 1  # 长度增1

7. 顺序表的删除

算法描述:

  1. 将data[i+1...n-1]的元素均前移一个位置(从data[n+1]元素开始移动)。
  2. 覆盖元素data[i],最后将长度size减1。
  3. 若当前容量大于初始容量并且实际长度仅为当前容量的1/4(缩容条件),则将当前容量减半。

参考代码:

    def delete(self, i):  # 在线性表中删除序号i的元素
        assert 0 <= i <= self.size - 1  # 检测参数i正确性的断言
        for j in range(i, self.size - 1):
            self.data[j] = self.data[j + 1]  # 将data[i]之后的元素前移一个位置
        self.size -= 1  # 长度减1
        if self.capacity > self.initcapacity and self.size <= self.capacity / 4:
            self.resize(self.capacity // 2)  # 满足缩容条件则容量减半

8. 顺序表的逆置

算法描述:

  1. 用i从前向后、用j从后向前遍历L
  2. 当两者没有相遇时交换它们指向的元素

参考代码:

    def reverse(self):
        i=0
        j=self.size-1
        while i

(建议:在顺序表的应用中,也可以写同一应用的多种实现方式,并对比分析不同的实现方式的优劣。)

9. 主函数

if __name__ == '__main__':

    L=SqList()

    a=[1, 2, 3, 4, 5]

    L.CreateList(a)

    print ("L: ",end=''), L.display()

    print("Length: ", L.getsize())

    print("\nL: ", end=''), L.display()

    L.delete(2)

    print ("delete(2) L: ",end=''), L.display()

    print("\nL: ", end=''), L.display()

    L.insert(2, 23)

    print ("insert(2, 23) L: ",end=''), L.display()

    print("\nL: ", end=''), L.display()

    L.reverse()

    print ("reverse L: ",end=''), L.display()

10. 算法运行结果及分析

1.整体创建运行结果:

基于Python的顺序表的运算及应用_第1张图片

 

2.删除运行结果:

基于Python的顺序表的运算及应用_第2张图片

 

3.插入运行结果:

基于Python的顺序表的运算及应用_第3张图片

 

4.顺序表的逆置

基于Python的顺序表的运算及应用_第4张图片

 

算法分析:

顺序表的创建、输出:T(n)=O(n)  (一重迭代)

        顺序表的长度:T(n)=O(n)

        顺序表的删除、插入:T(n)=O(n)  (主要花费在元素的移动上)

        顺序表的逆置:T(n)=O(n)、S(n)=O(1)

说明:顺序表的相关操作很多,上面只列举了插入、删除和逆置。

完整代码:

class SqList:
    def __init__(self):						    #构造函数
        self.initcapacity=5           		    #初始容量设置为10
        self.capacity=self.initcapacity			#容量设置为初始容量
        self.data=[None]*self.capacity			#设置顺序表的空间
        self.size=0

    def resize(self, newcapacity):			    #改变顺序表的容量为newcapacity
        assert newcapacity>=0					#检测参数正确性的断言
        olddata=self.data
        self.data=[None]*newcapacity
        self.capacity=newcapacity
        for i in range(self.size):
            self.data[i]=olddata[i]

    def CreateList(self, a):                    # 由数组a中元素整体建立顺序表
        for i in range(0, len(a)):
            if self.size == self.capacity:      # 出现上溢出时
                self.resize(2 * self.size)      # 扩大容量
            self.data[self.size] = a[i]
            self.size += 1                      # 添加后元素个数增加1

    def getsize(self):                          # 求线性表长度
        return self.size

    def reverse(self):
        i=0
        j=self.size-1
        while i self.initcapacity and self.size <= self.capacity / 4:
            self.resize(self.capacity // 2)  # 满足缩容条件则容量减半

if __name__ == '__main__':
    L=SqList()
    a=[1, 2, 3, 4, 5]
    L.CreateList(a)
    print ("L: ",end=''), L.display()
    print("Length: ", L.getsize())

    print("\nL: ", end=''), L.display()
    L.delete(2)
    print ("delete(2) L: ",end=''), L.display()

    print("\nL: ", end=''), L.display()
    L.insert(2, 23)
    print ("insert(2, 23) L: ",end=''), L.display()

    print("\nL: ", end=''), L.display()
    L.reverse()
    print ("reverse L: ",end=''), L.display()

代码为个人理解编写,若有错误请大佬指正!

你可能感兴趣的:(算法,python,数据结构)