数据结构15: 有序表抽象数据类型
目录
一、什么是有序表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: 有序表抽象数据类型相关推荐
- 数据结构与算法(Python版)十六:有序表抽象数据类型及Python实现
抽象数据类型:有序表OrderedList 有序表是一种数据项依照其某可比性质(如整数大小. 字母表先后) 来决定在列表中的位置 越"小"的数据项越靠近列表的头, 越靠" ...
- 线性表抽象数据类型定义与顺序表操作
作业3-线性表抽象数据类型定义与顺序表操作 1-1 对于顺序存储的长度为N的线性表, 访问结点和增加结点的时间复杂度 分别对应为O(1)和O(N).(T) [解析]增加结点,不同位置复杂度不同,但平均 ...
- 数据结构与算法——6. 抽象数据类型:无序表与有序表及其链表实现
文章目录 一.无序表(unordered list)抽象数据类型 1. 无序表的定义 2. 采用链表实现无序表 (1)链表 (2)链表节点 (3)python实现链表节点 (4)python实现链表 ...
- python数据结构: 有序表
1. 有序表 ❖有序表是一种数据项依照其某可比性质(如整数大小.字母表先后)来决定在列表中的位置 ❖越"小"的数据项越靠近列表的头,越靠"前" 2.抽象数据类型 ...
- 数据结构:设计实现抽象数据类型“有理数”内容
题目:设计实现抽象数据类型"有理数" 内容:设计并上机实现抽象数据类型"有理数",有理数的基本操作包括:两个有理数的加.减.乘.除等(包括有理数的创建和输出). ...
- 数据结构与算法(Python版)十五:无序表抽象数据类型及Python实现
列表List:什么是列表? 在前面基本数据结构的讨论中, 我们采用Python List来实现了多种线性数据结构 列表List是一种简单强大的数据集结构,提供了丰富的操作接口 但并不是所有的编程语言都 ...
- 数据结构13:无序表抽象数据类型(链表)(一)
目录 一.什么是无序表 二.无序表的操作 三.采用链表实现无序表 四.链表实现 1.节点Node 2.无序表unorderedlist 一.什么是无序表 在前面基本数据结构的讨论中,采用python ...
- python数据结构——无序,有序列表抽象数据类型,链表
无序列表支持的操作 List()add(item)remove(item)search(item)#返回布尔值index(item)#返回下标isEmpty()length()append(item) ...
- 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 ...
最新文章
- vue经验(从别的文章里拼凑来的,不希望有人看,防止侵权)
- php数组实现堆栈的三个函数,while,do while,s函数的参数作用域,数组堆栈,常见的数组函数等学习2018/8/23...
- Amount Format in SAP Fiori Opportunity
- 用深度学习解决Bongard问题
- python 多线程 廖雪峰_python中多线程与多进程中的数据共享问题
- C#如何Json转字符串;字符串转Json;Newtonsoft.Json(Json.Net)
- python 列表函数
- 《从零开始学Swift》学习笔记(Day 39)——构造函数重载
- python爬虫:爬取医药数据库drugbank
- optisystem中器件的学习(4-Test Sets/Passives Library/Optical Switches)
- 哈工大自然语言处理实验1——汉语分词系统
- java-多线程编程
- snipaste滚动截图方法_不同级别的截图工具,快来按需领取吧
- lua能解决php什么问题,我们能用lua做什么
- 关于连接池、JDBC、DBUtils的一些知识
- 边云协同智能技术在电力领域的应用
- 计算机吉祥如意制作贺卡作业,贺卡制作教案
- 算法练习(21):Frog Jump
- spring cloud config 统一配置管理
- hadoop 1.0 基本概念了解