数据结构与算法设计C++描述
利用C++语言描述常用的数据结构,包括:线性表、链表、间接寻址、模拟指针、队列、树以及常用的算法设计方法(贪婪算法、分而治之算法、动态规划、回溯和分枝定界)。
007lizhen
这个作者很懒,什么都没留下…
展开
-
数据结构与算法C++描述(14)---二叉搜索树
1、二叉搜索树的概念二叉搜索树是一棵可能为空的二叉树,一棵非空的二叉搜索树有满足如下特征:二叉树中所有的键值都是唯一的;根节点所有左子树的键值(如果有的话)小于根节点的键值;根节点所有右子树的键值(如果有的话)大于根节点的键值;根节点的左右子树也都是二叉搜索树。三个二叉搜索树如下: 2、二叉搜索树的C++描述对于二叉搜索树,主要操作有插入一个元素(Insert)删除键值为k的元素(Del原创 2017-11-03 21:03:44 · 717 阅读 · 0 评论 -
数据结构与算法C++描述(13)---竞赛树及其在箱子装载问题中的应用
1、竞赛树的相关概念一般将竞赛树分为赢者树和输者树。所谓赢者树,就是对于n名选手,赢者树是一棵含n个外部节点,n-1个内部节点的完全二叉树,其中每个内部节点记录了相应赛局的赢家。同理,对于输者树,每个内部节点记录了相应赛局的输家。一个赢者树如下图所示。 上图中,黑色框中字母a,b,c,…,h为选手编号,下面的数字为选手得分。 为了利用计算机更方便的描述赢者树,假定每个赢者树都是完全二叉树。2原创 2017-11-01 20:48:19 · 2096 阅读 · 3 评论 -
数据结构与算法C++描述(12)---堆及最大堆
1、有关堆的相关概念最大堆(最小树):最大(最小)的完全二叉树。最大树(最小树):每个节点的值都大于(小于)或等于其子节点(如果有的话)值的数。注意,最大(小)数不一定是二叉树。完全二叉树:从满二叉树中删除k个元素,其编号为2h−i,1<=i<=k2^h-i,1<=i<=k,所得到的二叉树成为完全二叉树。 一个最大堆如下图所示: 2、最大堆的相关操作这里,最大堆的操作包括:堆顶元素的删除、向原创 2017-10-30 19:22:51 · 952 阅读 · 0 评论 -
数据结构与算法C++描述(11)---树及二叉树
1、 树的相关概念1.1 树的定义根据文献[1],树定义为:树(tree)t是一个非空的有限元素的集合,其中一个元素为根,余下的元素(如果有的话)组成t的子树(subtree)。 树一般用来描述具有层次结构的数据,比如家族关系、管理机构的上下级关系等。直观来说,见下图(图片引自网络侵删) 1.2 有关树的常用术语为了描述更为清晰,以下图的“联邦政府模型”树为例说明(图片来自参考文献[1])。原创 2017-10-28 09:01:33 · 867 阅读 · 0 评论 -
数据结构与算法C++描述(10-插曲)---函数名作形参
在文献[1]中,描述二叉树时利用了函数名作为形参。在此加以说明与解释。1.函数参数的传递方式我们都知道,函数参数的传递一般有:值传递、指针传递和引用传递。先来回顾一下:值传递时,先临时分配一块内存,将形参的值拷贝进去,在函数中利用临时分配的变量进行运算。当函数退出时,释放临时分配的内存,也就是说,不会影响原来的形参值。如下述程序及运行结果所示。void fun1(int a)原创 2017-10-26 11:25:18 · 848 阅读 · 0 评论 -
数据结构与算法C++描述(9)---字典
1.字典的概念字典是一些节点的集合,每个节点包含数据域和key(键值)域。字典可以通过公式化描述或链表描述的方式创建。本文将通过链表描述的方式创建字典,字典的键值是依次递增的,并对字典进行如下操作:字典的删除;添加一个字典元素;判断字典是否为空;搜索键值为k的元素值;获取字典中的元素个数;在键值为k的节点中插入元素x,允许键值k已存在;在键值为k的节点中插入元素x,不允许键值k存在,即原创 2017-10-25 10:25:45 · 4071 阅读 · 0 评论 -
数据结构与算法C++描述(8)---队列
1、队列的概念和堆栈一样,队列也是一种特殊的线性表。与堆栈不同的是,队列的插入和删除操作分别在线性表的两端进行,是一种先进先出的线性表。将添加新元素的那一端称为队尾(rear),删除元素的一端称为队首(front)。队列的相关操作见下图(图片来源于参考文献[1]) 上图中:图a)表示了一个具有3个元素的队列,其中front指向队首,rear指向队尾;图b)展示了队列的删除元素操作,将原先的原创 2017-10-23 21:30:57 · 811 阅读 · 0 评论 -
数据结构与算法C++描述(7)---堆栈及其在“火车车厢重排问题”中的应用
本文首先介绍堆栈的相关概念,接着利用C++语言实现堆栈类,最后利用堆栈来解决“火车车厢重排问题”。 1. 堆栈的概念参考文献[1]中对堆栈的解释:堆栈数据结构是通过对线性表的插入和删除操作进行限制而得到的插入和删除操作都必须在表的同一端完成),因此,堆栈是一个后进先出(last-in-first-out, LIFO)的数据结构。 由此可知,堆栈就是一种特殊的线性表,那么线性表的相关操作,如元原创 2017-10-21 14:51:04 · 4840 阅读 · 0 评论 -
数据结构与算法C++描述(6)---稀疏矩阵
1. 稀疏矩阵的概念当我们利用一个矩阵来描述一个实际问题时,往往矩阵中存在许多“0”值,如下图所示。试想,当矩阵维数非常大时,利用一个二维数组来存储此矩阵会浪费很多额外的空间。由此,在参考文献[1]中,借助于链表来存储稀疏矩阵。 通过行节点链表和头节点链表存储一个稀疏矩阵。其中:在稀疏矩阵的每一行中,若该行存在不为0的元素,则为改行创建一个行节点链表。链表中每个节点有3个域:矩阵元素值(值域原创 2017-10-19 17:03:49 · 2313 阅读 · 0 评论 -
数据结构与算法C++描述(5)---模拟指针及模拟链表
1、相关概念1.1、模拟指针的定义模拟指针可以理解为:在一个模拟空间中,存在一个指针数组,数组中的每个元素为指针类型,并且每个指针具有数据域和链接域(指向下一个数组中的指针)。1.2、模拟指针描述单链表、间接寻址描述单链表及普通单链表之间的区别:普通单链表中,各个节点没有索引值;间接寻址描述单链表时,各个节点间的索引值满足一定的数学关系;模拟指针描述单链表时,各个节点的索引值不用满足一定的数学原创 2017-10-12 22:39:30 · 1558 阅读 · 0 评论 -
数据结构与算法C++描述(4)---链表
上文“数据结构C++描述—线性表的基本操作”中所述的线性表是基于公式化描述来存储数据的,即它的存储位置之间满足一定的数学关系。而利用链表描述线性表时,某个元素的描述包含两部分:链接域(指向下一个或上一个节点)和数据域(存储当前元素的值)。因此,链表利用链接指针将各个数据连接起来。 链表包括: 1. 单链表:只有指向下一个元素的指针,最后一个节点链接域为NULL(或0)如下图所示(图片来源原创 2017-09-29 22:35:31 · 543 阅读 · 0 评论 -
数据结构与算法C++描述(3)---间接寻址
间接寻址就是线性表和链表的组合,它利用了线性表中的公式化描述,同时也利用了链表中的链接指针。。采用这种描述方法,可以保留公式化描述方法的许多优点——可以根据索引在ΘΘ( 1 )的时间内访问每个元素、可采用二叉搜索方法在对数时间内对一个有序表进行搜索等等。与此同时,也可以获得链表描述方法的重要特色——在诸如插入和删除操作期间不必对元素进行实际的移动。因此,大多数间接寻址链表操作的时间复杂性都与元素的总原创 2017-10-10 17:06:23 · 1004 阅读 · 0 评论 -
数据结构与算法C++描述(2)---数组
1、数组的定义数据对象的每个实例都是形如(index,value)的数据对集合,其中任意两对数据的index值都各不相同。当每个数据对的index为一个唯一确定的值时,该数据对象被称为一维数组;当每个数据对的index值为唯一确定的两个值时,该数据对象便为二维数组。。。。。。 C++本身是支持数组的,但无法保证数组下标的合法性。同时,C++也未能提供数组的输入、输出以及简单的算数运算(如数组赋值和原创 2017-10-18 12:05:45 · 605 阅读 · 0 评论 -
数据结构与算法C++描述(1)---线性表的基本操作
本文将利用公式化描述的方法,借助于C++语言,建立线性表,实现线性表的创建、删除、元素插入、线性表的合并与拆分等操作。 文中所有代码皆上传至我的码云1、 线性表的定义在参考文献[1]中,对线性表有如下定义:线性表(linear list)是这样的数据对象,其实例形式为:(e1,e2,…,en),其中n是有穷自然数。ei是表中的元素,n是表的长度。元素可以被视为原子,因为它们本身的结构与线性表的结构原创 2017-09-15 10:57:19 · 3228 阅读 · 0 评论