抽象数据类型:有序表OrderedList

有序表是一种数据项依照其某可比性质(如整数大小、 字母表先后) 来决定在列表中的位置

越“小”的数据项越靠近列表的头, 越靠“前“

OrderedList所定义的操作如下:

  • OrderedList():创建一个空的有序表
  • add(item):在表中添加一个数据项,并保持整体顺序,此项原不存在
  • remove(item):从有序表中移除一个数据项,此项应存在,有序表被修改
  • search(item):在有序表中查找数据项,返回是否存在
  • isEmpty():是否空表
  • size():返回表中数据项的个数
  • index(item):返回数据项在表中的位置,此项应存在
  • pop():移除并返回有序表中最后一项,表中应至少存在一项
  • pop(pos):移除并返回有序表中指定位置的数据项,此位置应存在

在实现有序表的时候, 需要记住的是, 数据项的相对位置, 取决于它们之间的“大小”比较

由于Python的扩展性,下面对数据项的讨论并不仅适用于整数,可适用于所有定义了__gt__方法(即’>'操作符)的数据类型

以整数数据项为例, (17, 26, 31, 54, 77, 93)的链表形式如图

同样采用链表方法实现

Node定义相同

OrderedList也设置一个head来保存链表表头的引用

对于isEmpty/size/remove这些方法,与节点的次序无关 , 所以其实现跟UnorderedList是一样的。

search/add方法则需要有修改

search方法

在无序表的search中, 如果需要查找的数据项不存在, 则会搜遍整个链表, 直到表尾

对于有序表来说, 可以利用链表节点有序排列的特性, 来为search节省不存在数据项的查找时间

一旦当前节点的数据项大于所要查找的数据项,则说明链表后面已经不可能再有要查找的数据项,可以直接返回False

如我们要在下图查找数据项45

代码如下:

def search(self, item):current = self.headfound = Falsestop = Falsewhile current != None and not found and not stop:if current.getData() == item:found = Trueelse:if current.getData() > item:stop = Trueelse:current = current.getNext()return found

add方法

相比无序表, 改变最大的方法是add, 因为add方法必须保证加入的数据项添加在合适的位置, 以维护整个链表的有序性

比如在(17, 26, 54, 77, 93)的有序表中,加入数据项31,我们需要沿着链表,找到第一个比31大的数据项54,将31插入到54的前面

由于涉及到的插入位置是当前节点之前, 而链表无法得到“前驱”节点的引用

所以要跟remove方法类似, 引入一个previous的引用, 跟随当前节点current

一旦找到首个比31大的数据项, previous就派上用场了

代码如下:

def add(self, item):current = self.headprevious = Nonestop = Falsewhile current != None and not stop:if current.getData() > item:stop = Trueelse:previous = currentcurrent = current.getNext()temp = Node(item)if previous == None:temp.setNext(self.head)self.head = tempelse:temp.setNext(current)previous.setNext(temp)

对于链表复杂度的分析, 主要是看相应的方法是否涉及到链表的遍历

对于一个包含节点数为n的链表

  • isEmpty是O(1),因为仅需要检查head是否为None
  • size是O(n),因为除了遍历到表尾,没有其它办法得知节点的数量
  • search/remove以及有序表的add方法,则是O(n),因为涉及到链表的遍历,按照概率其平均操作的次数是n/2
  • 无序表的add方法是O(1),因为仅需要插入到表头

链表实现的List, 跟Python内置的列表数据类型, 在有些相同方法的实现上的时间复杂度不同

主要是因为Python内置的列表数据类型是基于顺序存储来实现的, 并进行了优化

数据结构与算法(Python版)十六:有序表抽象数据类型及Python实现相关推荐

  1. 数据结构与算法笔记(十六)—— 二叉搜索树

    一.二叉搜索树定义 二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree). 二叉搜索树是具有有以下性质的二叉树: 若左子树不为空,则左子树上所有节点的 ...

  2. 【Java数据结构与算法】第十六章 图

    第十六章 图 文章目录 第十六章 图 一.图 1.介绍 2.基本术语 3.邻接矩阵 4.邻接表和逆邻接表 5.十字链表 二.深度优先遍历 三.广度优先遍历 四.代码实现 一.图 1.介绍 图相较于前面 ...

  3. 《数据结构与算法》(十六)- “查找”详解

    目录 前言 1. 查找概论 2. 顺序表查找 2.1 顺序表查找算法 2.2 顺序表找优化 3. 有序表查找 3.1 折半查找 3.2 插值查找 3.3 斐波那契查找 4. 线性索引查找 4.1 稠密 ...

  4. 数据结构15: 有序表抽象数据类型

    目录 一.什么是有序表orderedlist ? 二.orderedlist定义的操作 1.search方法 2.add方法 3.所有代码 四.链表实现的算法分析 一.什么是有序表orderedlis ...

  5. 数据结构与算法(Python版)十五:无序表抽象数据类型及Python实现

    列表List:什么是列表? 在前面基本数据结构的讨论中, 我们采用Python List来实现了多种线性数据结构 列表List是一种简单强大的数据集结构,提供了丰富的操作接口 但并不是所有的编程语言都 ...

  6. 高度平衡二叉树的构建_数据结构与算法系列(十六)平衡二叉树的构建实现过程演示...

    我们在上一篇文章中分享了平衡二叉树的定义和实现原理,这一节我们来演示如何通过代码实现平衡二叉树,最后分析下平衡二叉树的算法复杂度. 实例演示 在开始之前,我们先通过一个对比来加强理解,在没有介绍平衡二 ...

  7. Python爬虫十六式 - 第四式: 使用Xpath提取网页内容

    Xpath:简单易用的网页内容提取工具 学习一时爽,一直学习一直爽 !   Hello,大家好,我是Connor,一个从无到有的技术小白.上一次我们说到了 requests 的使用方法.到上节课为止, ...

  8. Python 爬虫十六式 - 第六式:JQuery的假兄弟-pyquery

    PyQuery:一个类似jquery的python库 学习一时爽,一直学习一直爽   Hello,大家好,我是 Connor,一个从无到有的技术小白.上一次我们说到了 BeautifulSoup 美味 ...

  9. Python爬虫十六式 - 第三式:Requests的用法

    Requests: 让 HTTP 服务人类 学习一时爽,一直学习一直爽   Hello,大家好,我是Connor,一个从无到有的技术小白.今天我们继续来说我们的 Python 爬虫,上一次我们说到了 ...

最新文章

  1. 在XUnit中用Moq怎样模拟EntityFramework Core下的DbSet
  2. Oracle表的并行度
  3. linux的NetworkManager服务(转)
  4. 深度学习《图像卷积》
  5. python最新版安装图集_通过python简单的实现了plist、json图集的切割
  6. 7 Managing Users and Securing the Database
  7. git clone 拉取github上面的代码报错:fatal: Authentication failed for xxx解决
  8. SpringBoot注册组件之@Configuration@Bean注解作用及注意点
  9. 转换字符串的字符成单个字符并用逗号分隔
  10. Java 编程需要注意的细节
  11. 深入解析Windows操作系统之第一章:概念与工具
  12. 匈牙利算法解决指派问题(java版)
  13. N个例子让你彻底理解java接口回调
  14. Arduino作为编程器读写BIOS、bootloader、uboot或者breed
  15. iOSButton文字和图片摆放的个字方式
  16. 渗透测试技巧:python+burp快速编写网站测试脚本
  17. iOS 11.0新功能
  18. hdu 1507 Uncle Tom's Inherited Land*
  19. 【食品化学与营养】第一章 绪论 笔记
  20. AMD EPYC 7763/7T83/7713/7H12/7742 双路 8卡GPU服务器aleo

热门文章

  1. 三聚氰胺最新价格,创2017年以来价格新低
  2. 搜狐云景openapi初探
  3. 学习笔记-应用编程与网络编程-2(文件属性+附代码)
  4. 今日春分 | 11种食物+3个穴位,春养肝的方法你知道吗?
  5. 手写迷你版HashMap
  6. ubuntu 磁盘管理工具 ---- GParted 图形化分区工具
  7. 计算机网络二层技术——链路聚合原理及其配置(有这一篇就足够了)
  8. c语言win32课程表,用C语言怎么编出来课程表
  9. ROS源码学习 二、线程池
  10. e5408fc4a618ed2a663d0306def2cec3 (学生实验,谢谢)