《数据结构和算法 python语言描述》学习笔记(三)————线性表

第一部分:内容概述

  • 线性表的概念和表的抽象数据类型
  • 顺序表的实现
  • 链接表
  • 链表的变形和操作
  • 表的应用

第二部分:学习笔记

  • 线性表的概念和表的抽象数据类型
       1. 在一个非空的线性表里,存在着唯一的一个首元素和唯一的一个尾元素(末元素)。除首元素之外,表的每个元素e都有且仅有一个前驱元素;除了尾元素之外的每个元素都有且仅有一个后继元素。
       2. 线性表的操作
        ① 首先,作为抽象类型的线性表是一组数据对象的集合,应该提供创建线性表对象的操作。
        ② 程序中可能需要检查一个表,获取它的各方面信息。
        ③ 需要动态改变表的内容,包括加入新元素或删除已有元素。
        ④ 一些涉及一个或两个表的操作。
        ⑤ 涉及对表中每一个元素进行的操作。
      3. 线性表的实现:基本考虑(2点要求2个实现模型)
        1)计算机内存的特点,以及保存元素和元素顺序信息的需要。
        2)各种重要操作的效率。
        1)将表中元素顺序地存放在一大块连续的存储区里,这样实现的表也称为顺序表(连续表)。
        2)将表元素存放在通过链接构造起来的一系列存储块里,这样实现的表称为链接表,简称链表。
      4. 表抽象数据类型
ADT List:									#一个表抽象数据类型
	List(self)								#表构造操作,创建一个新表
	is_empty(self)							#判断self是否为一个空表
	len(self)								#获得self长度
	propend(self,elem)						#将元素elem加入表中作为第一个元素
	append(self,elem)						#将元素elem加入表中作为最后一个元素
	insert(self,elem,i)						#将elem加入表中作为第i个元素,其他元素的顺序不变
	del_first(self)							#删除表中的首元素
	del_last(self)							#删除表中的尾元素
	del(self,i)								#删除表中第i个元素
	search(self,elem)						#查找元素elem在表中出现的位置,不出现时返回-1
	forall(self,op)							#对表中的每个元素执行操作op
  • 顺序表的实现
      1. Loc(ei) = l0 + c x i
      设有一个顺序表对象,其元素储存在一片元素存储区,该存储区的起始位置(内存地址)已知为l0。假定表元素标号从0开始(符合Python和许多编程语言的约定),元素e0自然应存储在内存位置 Loc(ei) = l0 。在假定表中一个元素所需的存储单元数为c = size,在这种情况下就有上述的元素ei的地址计算公式。
       2. 在建立一个顺序表时,一种可能是按建立时确定的元素个数分配存储(Python的tuple)。一种是可以变动的表,分配一块足以容纳当前需要记录的元素存储块,还应该保存一些空位,以满足增加元素的需要(Python的list)。
      3.顺序表基本操作的实现
        1)创建和访问操作
        ① 创建空表:O(1)复杂度
        ② 简单判断操作:O(1)复杂度
        ③ 访问给定下标i的元素:O(1)复杂度
        ④ 遍历操作:O(1)复杂度
        ⑤ 查找给定元素d(第一次出现)的位置:O(1)复杂度
        ⑥ 查找给定元素d在位置k之后的第一次出现的位置:O(n)复杂度
        2)变动操作:加入元素
        ① 尾段加入新数据项:O(1)复杂度
        ② 新数据存入元素存储区的第i个单元:最坏或平均情况O(i)复杂度
        3)变动操作:删除元素
        ① 尾段删除数据:O(1)复杂度
        ② 删除位置i的数据:O(1)复杂度
        ③ 基于条件的删除:O(n)复杂度
      4. 表的顺序实现的总结:
        优点:O(1)时间的(随机、直接的)按位置访问元素;元素在表里存储紧凑,除表元素存储区之外只需要O(1)空间存放少量辅助信息。
        缺点:需要很大片的连续内存空间;一旦确定了存储块的大小,可容纳单元个数并不随着插入/删除操作的进行二变化;可能会造成表内的存储浪费;在进行加入或删除操作时,通常需要移动许多元素,效率低;建立表时需要考虑元素存储区大小,而实际需求通常很难事先估计。
  • 链接表
      1. 基本思想
        ① 把表中的元素分别存储在一批独立的存储块(称为表的结点)里。
        ② 保证从组成表结构中的任一个结点可找到与其相关的下一个结点。
        ③ 在前一结点里用链接的方式显式地记录与下一结点之间的关联。
      2. 单链表
        ① 一个单链表由一些具体的表结点构成
        ② 每个结点是一个对象,有自己的标识,下面也常称其为该结点的链接。
        ③ 结点之间通过结点链接建立起单项的顺序联系。
        见代码1
      3. 链接表的操作
      1)基本链接操作
        ① 创建空链表  时间复杂度O(1)
        ② 删除链表  时间复杂度O(1)
        ③ 判断表是否为空  时间复杂度O(1)
        ④ 判断表是否满  时间复杂度O(1)
      2)加入元素
        ① 表首端插入  时间复杂度O(1)  见代码2
        ② 一般情况的元素插入  时间复杂度O(n)  见代码3
      3)删除元素
        ① 删除表首元素  时间复杂度O(1)  见代码4
        ② 一般情况的元素删除  时间复杂度O(n)  见代码4
      4)扫描、定位和遍历
        ① 由于单链表只有一个方向,开始情况下只有表头常量在掌握中,所以对表内容的一切检查都只能从表头变量开始,沿着表中链接逐步进行,称之为扫描。  见代码5
        ② 按下标定位  见代码6
        ③ 按元素定位  见代码7
        ④ 遍历  见代码8
      5)求表的长度   见代码9
代码1
class LNode:
	def __init__(self, elem, next_=None):
		self.elem = elem
		self.next 
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值