数据结构与算法(Python版)十五:无序表抽象数据类型及Python实现
列表List:什么是列表?
在前面基本数据结构的讨论中, 我们采用Python List来实现了多种线性数据结构
列表List是一种简单强大的数据集结构,提供了丰富的操作接口
但并不是所有的编程语言都提供了List数据类型,有时候需要程序员自己实现。
一种数据项按照相对位置存放的数据集
特别的,被称为“无序表unordered list”,其中数据项只按照存放位置来索引,如第1个、第2个……、最后一个等。(为了简单起见,假设表中不存在重复数据项)
如一个考试分数的集合“54, 26, 93, 17,77和31”
如果用无序表来表示, 就是[54, 26, 93,17, 77, 31]
无序表List的操作如下:
- List():创建一个空列表
- add(item):添加一个数据项到列表中,假设
- item原先不存在于列表中
- remove(item):从列表中移除item,列表被修改, item原先应存在于表中
- search(item):在列表中查找item,返回布尔类型值
- isEmpty():返回列表是否为空
- size():返回列表包含了多少数据项
- append(item):添加一个数据项到表末尾,假设item原先不存在于列表中
- index(item):返回数据项在表中的位置
- insert(pos, item):将数据项插入到位置pos,假设item原先不存在与列表中,同时原列表具有足够多个数据项,能让item占据位置pos
- pop():从列表末尾移除数据项,假设原列表至少有1个数据项
- pop(pos):移除位置为pos的数据项,假设原列表存在位置pos
采用链表实现无序表
为了实现无序表数据结构, 可以采用链接表的方案。
虽然列表数据结构要求保持数据项的前后相对位置, 但这种前后位置的保持, 并不要求数据项依次存放在连续的存储空间
如下图, 数据项存放位置并没有规则, 但如果在数据项之间建立链接指向, 就可以保持其前后相对位置
第一个和最后一个数据项需要显式标记出来,一个是队首,一个是队尾,后面再无数据了。
链表实现:节点Node
链表实现的最基本元素是节点Node
每个节点至少要包含2个信息: 数据项本身,以及指向下一个节点的引用信息注意next为None的意义是没有下一个节点了,这个很重要
代码
class Node:def __init__(self, initdata):self.data = initdataself.next = Nonedef getData(self):return self.datadef getNext(self):return self.nextdef setData(self, newdata):self.data = newdatadef setNext(self, newnext):self.next = newnext
可以采用链接节点的方式构建数据集来实现无序表
链表的第一个和最后一个节点最重要如果想访问到链表中的所有节点,就必须从第一个节点开始沿着链接遍历下去
所以无序表必须要有对第一个节点的引用信息
设立一个属性head,保存对第一个节点的引用空表的head为None
随着数据项的加入, 无序表的head始终指向链条中的第一个节点
注意!无序表mylist对象本身并不包含数据项(数据项在节点中)其中包含的head只是对首个节点Node的引用判断空表的isEmpty()很容易实现
接下来, 考虑如何实现向无序表中添加数据项, 实现add方法。
由于无序表并没有限定数据项之间的顺序
新数据项可以加入到原表的任何位置
按照实现的性能考虑, 应添加到最容易加入的位置上。
由链表结构我们知道
要访问到整条链上的所有数据项
都必须从表头head开始沿着next链接逐个向后查找
所以添加新数据项最快捷的位置是表头,整个链表的首位置
add方法
链接次序很重要!add方法实现代码如下:
def add(self, item):temp = Node(item)temp.setNext(self.head)self.head = temp
size:从链条头head开始遍历到表尾同时用变量累加经过的节点个数。
def size(self):current = self.headcount = 0while current != None:count = count + 1current = current.getNext()return count
从链表头head开始遍历到表尾, 同时判断当前节点的数据项是否目标
def search(self, item):current = self.headfound = Falsewhile current != None and not found:if current.getData() == item:found = Trueelse:current = current.getNext()return found
remove(item)方法
首先要找到item, 这个过程跟search一样, 但在删除节点时, 需要特别的技巧
current指向的是当前匹配数据项的节点而删除需要把前一个节点的next指向current的下一个节点,所以我们在search current的同时,还要维护前一个(previous)节点的引用
找到item之后, current指向item节点,previous指向前一个节点, 开始执行删除, 需要区分两种情况:
current是首个节点;或者是位于链条中间的节点
def remove(self, item):current = self.headprevious = Nonefound = Falsewhile not found:if current.getData() == item:found = Trueelse:previous = currentcurrent = current.getNext()if previous == None:self.head = current.getNext()else:previous.setNext(current.getNext())
完整代码如下:
class UnorderedList:def __init__(self):self.head = Nonedef add(self, item):temp = Node(item)temp.setNext(self.head)self.head = tempdef size(self):current = self.headcount = 0while current != None:count = count + 1current = current.getNext()return countdef search(self, item):current = self.headfound = Falsewhile current != None and not found:if current.getData() == item:found = 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:self.head = current.getNext()else:previous.setNext(current.getNext())
数据结构与算法(Python版)十五:无序表抽象数据类型及Python实现相关推荐
- 数据结构与算法(Python版)十六:有序表抽象数据类型及Python实现
抽象数据类型:有序表OrderedList 有序表是一种数据项依照其某可比性质(如整数大小. 字母表先后) 来决定在列表中的位置 越"小"的数据项越靠近列表的头, 越靠" ...
- 【Java数据结构与算法】第十五章 B树、B+树和B*树
第十五章 B树.B+树和B*树 文章目录 第十五章 B树.B+树和B*树 一.B树 1.引入 2.介绍 二.B+树 1.引入 2.介绍 三.B*树 1.介绍 一.B树 1.引入 为什么数据库索引要使用 ...
- 数据结构与算法笔记(十五)—— 散列(哈希表)
一.前沿 1.1.直接寻址表 当关键字的全域U比较小时,直接寻址是一种简单而有效的技术.假设某应用要用到一个动态集合,其中每个元素都有一个取自全域U={0,1,-,m-1)的关键字,此处m是一个不很大 ...
- 数据结构13:无序表抽象数据类型(链表)(一)
目录 一.什么是无序表 二.无序表的操作 三.采用链表实现无序表 四.链表实现 1.节点Node 2.无序表unorderedlist 一.什么是无序表 在前面基本数据结构的讨论中,采用python ...
- 《数据结构与算法》(十五)- 图的应用:有向无环图
目录 前言 1. 拓扑排序 1.1 拓扑排序介绍 1.2 拓扑排序算法 2. 关键路径 2.1 关键路径算法的原理 2.2 关键路径算法 3. 总结 原文地址:https://program-park ...
- 全网最全原理讲解!数据结构与算法java版第五版叶核亚答案
开头 对于一个Java程序员而言,能否熟练掌握并发编程是判断他优秀与否的重要标准之一.因为并发编程是Java语言中最为晦涩的知识点,它涉及操作系统.内存.CPU.编程语言等多方面的基础能力,更为考验一 ...
- python灰度图片格式_[Python图像处理] 十五.图像的灰度线性变换
[Python图像处理] 十五.图像的灰度线性变换 发布时间:2019-03-28 00:08, 浏览次数:619 , 标签: Python 该系列文章是讲解Python OpenCV图像处理知识,前 ...
- 数据结构(C语言)第二版 第五章课后答案
数据结构(C语言)第二版 第五章课后答案 1~5 A D D C A 6~10 C C B D C 11~15 B C A C A 1.选择题 (1)把一棵树转换为二叉树后,这棵二叉树的形态是(A) ...
- 数据结构与算法笔记(十六)—— 二叉搜索树
一.二叉搜索树定义 二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree). 二叉搜索树是具有有以下性质的二叉树: 若左子树不为空,则左子树上所有节点的 ...
最新文章
- cell 滑动实现旋转动画效果
- RxSwift学习--核心逻辑再探
- redis批量操作及性能分析
- angular 代码高亮_angular 搜索/查找关键字高亮
- SLF4J: Failed to load class org.slf4j.impl.StaticLoggerBinder
- 稳定的存储环境决定业务正常运作
- 帮你深度探寻Spring循环依赖源码实现!面经解析
- google海底光缆图_谷歌地图资讯-2013版“海底光缆地图”发布
- Java疯狂讲义读书笔记第十章
- uploadify php使用,如何在ThinkPHP中使用Uploadify对图片进行上传
- 机器学习——概率模型
- CIO40: IT中年男修身修性修心之王阳明
- 新功能!微信可以开“小号”了
- 杨百翰大学计算机科学,2019上海软科世界一流学科排名计算机科学与工程专业排名杨百翰大学排名第401-500...
- 【红外遥控器】基于FPGA的学习型红外遥控器verilog开发
- 开通公众号啦:java4all
- H5表单validity各个属性对应
- HTML黑白触摸变彩色,使用HTML5 转换彩色图片为黑白色知识讲解.doc
- Retrofit2网络请求的path部分的“/”斜杠乱码为“百分号2F”,请求结果为400的请求无效
- 17道Python面试题,让你在求职中无往不利
热门文章
- JavaScript之DOM(中)
- 不会英语可以学计算机编程吗,不会英语的人应该怎么学编程
- Java实现阿姆斯特朗数
- android 调用oracle,Android 调用WCF实例详解
- cisco anyconnect 下载(windows、macos、iOS、Android、linux)
- 点击按钮返回数组 ages 中所有元素都大于输入框指定数值的元素和 $set()
- 图片破损打不开如何修复?一招轻松恢复损坏图片!
- Arduino ESP8266读取土壤湿度传感器 ADC
- POE 供电设备原理详解
- 容器化 Spring Boot 代码的 9 个技巧