目录

一、什么是有序表orderedlist ?

二、orderedlist定义的操作

1、search方法

2、add方法

3、所有代码

四、链表实现的算法分析


一、什么是有序表orderedlist ?

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

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

二、orderedlist定义的操作

有序表数据定义的操作如下:

List(): 创建一个空的有序表
add(item): 添加一个数据项到列表中,并保持整体的顺序,假设item原先不存在与列表中
remove(item): 从列表中移除item,这时列表被修改,item原先应该存在于列表中
search(item): 在列表中查找item,返回的是bool类型值
isEmpty(): 返回列表是否为空
size(): 返回列表包含了多少数据项
index(item): 返回数据项在列表中的位置,此项应该存在
pop(): 从列表末尾移除数据项,假设原列表至少一个数据项
pop(pos): 移除位置pos的数据项

三、有序表OrderedList的实现

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

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

我们同样采用链表的形式实现,首先也是设置一个head来保存链表表头的引用。

class Orderedlist:def __init__(self):self.head = None

对于isEmpty/size/remove这些方法,与节点的次序无关,所以它们的实现跟underedlist是一样的。但是search和add方法需要修改。

1、search方法

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

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

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

如下图中要查找数据项45:

代码实现:

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

2、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 is None:        # 第一个节点就比要插入的数据大temp.setNext(self.head)self.head = tempelse:temp.setNext(current)   # 和下一行不能反了previous.setNext(temp)

3、所有代码

class Node():def __init__(self, initdata):self.data = initdataself.next = Nonedef getData(self):return self.data  # 返回的数据项def getNext(self):return self.next  # 返回nextdef setData(self, newdata):self.data = newdata  # 设置新的数据项def setNext(self, newnext):self.next = newnextclass Orderedlist:def __init__(self):self.head = Nonedef 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 is None:        # 第一个节点就比要插入的数据大temp.setNext(self.head)self.head = tempelse:temp.setNext(current)   # 和下一行不能反了previous.setNext(temp)def size(self):current = self.headcount = 0while current != None:count += 1current = current.getNext()return countdef search(self, item):current = self.headfound = Falsestop = Falsewhile current != None and not found and not stop:print(current.getData())if current.getData() == item:found = Trueelse:if current.getData() > item:stop = Trueelse:current = current.getNext()return founddef remove(self, item):current = self.headprevious = Nonefound = Falsewhile not found:if current.getData() == item:found = Trueelse:previous = currentcurrent = current.getNext()if previous == None:       # current是首个节点的情况self.head = current.getNext()else:previous.setNext(current.getNext())

四、链表实现的算法分析

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

当链表包含的节点数为n时:

  • isEmpty是O(1),因为仅需要检查head是否为None
  • size是O(n),因为必须遍历到表尾
  • search/remove以及有序表的add方法,则是O(n),因为涉及到表的遍历,按照概率其平均操作的次数是n/2
  • 无序表的add方法是O(1),因为仅需要插入到表头。

链表实现的List,跟python内置的列表数据类型,在有些方法的实现上时间复杂度不同,主要是因为python内置的列表数据类型是基于顺序存储来实现的,并进行了优化。

数据结构15: 有序表抽象数据类型相关推荐

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

    抽象数据类型:有序表OrderedList 有序表是一种数据项依照其某可比性质(如整数大小. 字母表先后) 来决定在列表中的位置 越"小"的数据项越靠近列表的头, 越靠" ...

  2. 线性表抽象数据类型定义与顺序表操作

    作业3-线性表抽象数据类型定义与顺序表操作 1-1 对于顺序存储的长度为N的线性表, 访问结点和增加结点的时间复杂度 分别对应为O(1)和O(N).(T) [解析]增加结点,不同位置复杂度不同,但平均 ...

  3. 数据结构与算法——6. 抽象数据类型:无序表与有序表及其链表实现

    文章目录 一.无序表(unordered list)抽象数据类型 1. 无序表的定义 2. 采用链表实现无序表 (1)链表 (2)链表节点 (3)python实现链表节点 (4)python实现链表 ...

  4. python数据结构: 有序表

    1. 有序表 ❖有序表是一种数据项依照其某可比性质(如整数大小.字母表先后)来决定在列表中的位置 ❖越"小"的数据项越靠近列表的头,越靠"前" 2.抽象数据类型 ...

  5. 数据结构:设计实现抽象数据类型“有理数”内容

    题目:设计实现抽象数据类型"有理数" 内容:设计并上机实现抽象数据类型"有理数",有理数的基本操作包括:两个有理数的加.减.乘.除等(包括有理数的创建和输出). ...

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

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

  7. 数据结构13:无序表抽象数据类型(链表)(一)

    目录 一.什么是无序表 二.无序表的操作 三.采用链表实现无序表 四.链表实现 1.节点Node 2.无序表unorderedlist 一.什么是无序表 在前面基本数据结构的讨论中,采用python ...

  8. python数据结构——无序,有序列表抽象数据类型,链表

    无序列表支持的操作 List()add(item)remove(item)search(item)#返回布尔值index(item)#返回下标isEmpty()length()append(item) ...

  9. Python数据结构——对有序表二分查找

    list= [1, 5, 6, 9, 10, 51, 62, 65, 70] 查找5时: [1, 5, 6, 9, 10, 51, 62, 65, 70]        low=0    high=9 ...

最新文章

  1. vue经验(从别的文章里拼凑来的,不希望有人看,防止侵权)
  2. php数组实现堆栈的三个函数,while,do while,s函数的参数作用域,数组堆栈,常见的数组函数等学习2018/8/23...
  3. Amount Format in SAP Fiori Opportunity
  4. 用深度学习解决Bongard问题
  5. python 多线程 廖雪峰_python中多线程与多进程中的数据共享问题
  6. C#如何Json转字符串;字符串转Json;Newtonsoft.Json(Json.Net)
  7. python 列表函数
  8. 《从零开始学Swift》学习笔记(Day 39)——构造函数重载
  9. python爬虫:爬取医药数据库drugbank
  10. optisystem中器件的学习(4-Test Sets/Passives Library/Optical Switches)
  11. 哈工大自然语言处理实验1——汉语分词系统
  12. java-多线程编程
  13. snipaste滚动截图方法_不同级别的截图工具,快来按需领取吧
  14. lua能解决php什么问题,我们能用lua做什么
  15. 关于连接池、JDBC、DBUtils的一些知识
  16. 边云协同智能技术在电力领域的应用
  17. 计算机吉祥如意制作贺卡作业,贺卡制作教案
  18. 算法练习(21):Frog Jump
  19. spring cloud config 统一配置管理
  20. hadoop 1.0 基本概念了解

热门文章

  1. php根据日期判断星座if函数,js根据日期判断星座的代码
  2. appvlv中偶有不爽
  3. 什么是AAC音频格式 AAC-LC 和 AAC-HE的区别是什么
  4. 蓝桥杯真题 数列求值(超范围)(好好审题啊喂)
  5. Synology NAS群晖DS218play 运行内存测试
  6. 前端追梦人Cytoscape.js教程
  7. css--概述、选择器
  8. Task4 建模调参
  9. 上手机器学习前,先来学习下Python相关的环境配置吧~
  10. sqlite多行插入_在SQLite中插入多行