随笔分类 - 数据结构
摘要:折半查找,也称二分查找,在某些情况下相比于顺序查找,使用折半查找算法的效率更高。但是该算法的使用的前提是静态查找表中的数据必须是有序的。 例如,在{5,21,13,19,37,75,56,64,88 ,80,92}这个查找表使用折半查找算法查找数据之前,需要首先对该表中的数据按照所查的关键字进行排序
阅读全文
摘要:通过前面对静态查找表的介绍,静态查找表即为只做查找操作的查找表。 静态查找表既可以使用顺序表表示,也可以使用链表结构表示。虽然一个是数组、一个链表,但两者在做查找操作时,基本上大同小异。 本节以静态查找表的顺序存储结构为例做详细的介绍。 顺序查找的实现 静态查找表用顺序存储结构表示时,顺序查找的查找
阅读全文
摘要:在日常生活中,几乎每天都要进行一些查找的工作,在电话簿中查阅某个人的电话号码;在电脑的文件夹中查找某个具体的文件等等。本节主要介绍用于查找操作的数据结构——查找表。 查找表是由同一类型的数据元素构成的集合。例如电话号码簿和字典都可以看作是一张查找表。一般对于查找表有以下几种操作: 在查找表中查找某个
阅读全文
摘要:本章通过介绍不同的查找表,来讲解多种查找算法的实现,例如顺序查找、二分查找、分块查找等。同时本章中还会借用学过的树结构来实现查找具体数据的目的。
阅读全文
摘要:本节介绍一种解决系统中内存碎片过多而无法使用的方法——边界标识法。 在使用边界标识法的系统管理内存时,可利用空间表中的结点的构成如图 1: 图 1 结构构成 每个结点中包含 3 个区域,head 域、foot 域 和 space 域: space 域表示为该内存块的大小,它的大小通过 head 域中
阅读全文
摘要:通过前面的学习,介绍很多具体的数据结构的存储以及遍历的方式,过程中只是很表面地介绍了数据的存储,而没有涉及到更底层的有关的存储空间的分配与回收,从本节开始将做更深入地介绍。 在使用早期的计算机上编写程序时,有关数据存储在什么位置等这样的问题都是需要程序员自己来给数据分配内存。而现在的高级语言,大大的
阅读全文
摘要:动态内存管理 移动迷宫小游戏(升级版)动态内存管理 在计算机中,操作系统负责管理整个内存空间,主要概括为两个方面:内存的分配与回收。本章中会详细介绍计算机中用于管理存储空间的方法,以及如何对产生的内存碎片进行处理。
阅读全文
摘要:《移动迷宫》游戏简介:迷宫只有两个门,一个入口,一个出口。一个骑士骑马从入口走进迷宫,迷宫中设置有很多墙壁,对前进方向造成障碍。骑士需要在迷宫中寻找通路以到达出口。 本游戏的迷宫是“移动”的,每次骑士进入迷宫时,迷宫的入口、出口,甚至是迷宫中设置的障碍都是不同的。 设计思路 解决类似的问题,使用回溯
阅读全文
摘要:本节要讨论的是当给定 n(n>=0)个结点时,可以构建多少种形态不同的树。 如果两棵树中各个结点的位置都一一对应,可以说这两棵树相似。如果两棵树不仅相似,而且对应结点上的数据也相同,就可以说这两棵树等价。本节中,形态不同的树指的是互不相似的树。 前面介绍过,对于任意一棵普通树,通过孩子兄弟表示法的转
阅读全文
摘要:回溯法(八皇后问题) 回溯法,又被称为“试探法”。解决问题时,每进行一步,都是抱着试试看的态度,如果发现当前选择并不是最好的,或者这么走下去肯定达不到目标,立刻做回退操作重新选择。这种走不通就回退再走的方法就是回溯法。例如,在解决列举集合 {1,2,3} 中所有子集的问题中,就可以使用回溯法。从集合
阅读全文
摘要:赫夫曼树,别名“哈夫曼树”、“最优树”以及“最优二叉树”。学习哈夫曼树之前,首先要了解几个名词。 哈夫曼树相关的几个名词 路径:在一棵树中,一个结点到另一个结点之间的通路,称为路径。图 1 中,从根结点到结点 a 之间的通路就是一条路径。路径长度:在一条路径中,每经过一个结点,路径长度都要加 1 。
阅读全文
摘要:树的双亲表示法、孩子表示法和孩子兄弟表示法 在使用树结构描述实际问题时,大多数不是二叉树,更多的是普通的树结构,在存储之间具有普通树结构的数据时,经常使用的方法有3种: 双亲表示法 孩子表示法 孩子兄弟表示法 双亲表示法 取一块连续的内存空间,在存储每个结点的同时,各自都附加一个记录其父结点位置的变
阅读全文
摘要:通过前一节对线索二叉树的学习,其中,在遍历使用中序序列创建的线索二叉树时,对于其中的每个结点,即使没有线索的帮助下,也可以通过中序遍历的规律找到直接前趋和直接后继结点的位置。也就是说,建立的线索二叉链表可以从两个方向对结点进行中序遍历。通过前一节的学习,线索二叉链表可以从第一个结点往后逐个遍历。但是
阅读全文
摘要:通过前面对二叉树的学习,了解到二叉树本身是一种非线性结构,采用任何一种遍历二叉树的方法,都可以得到树中所有结点的一个线性序列。在这个序列中,除第一个结点外,每个结点都有自己的直接前趋;除最后一个结点外,每个结点都有一个直接后继。 图1 满二叉树 例如,图 1 采用先序遍历的方法得到的结点序列为:1
阅读全文
摘要:前边介绍了二叉树的先序、中序和后序的遍历算法,运用了栈的数据结构,主要思想就是按照先左子树后右子树的顺序依次遍历树中各个结点。 本节介绍另外一种遍历方式:按照二叉树中的层次从左到右依次遍历每层中的结点。具体的实现思路是:通过使用队列的数据结构,从树的根结点开始,依次将其左孩子和右孩子入队。而后每次队
阅读全文
摘要:递归算法底层的实现使用的是栈存储结构,所以可以直接使用栈写出相应的非递归算法。 先序遍历的非递归算法 从树的根结点出发,遍历左孩子的同时,先将每个结点的右孩子压栈。当遇到结点没有左孩子的时候,取栈顶的右孩子。重复以上过程。实现代码函数: // 先序遍历非递归算法 void PreOrderTrave
阅读全文
摘要:链式存储结构存储的二叉树,对树中结点进行逐个遍历时,由于是非线性结构,需要找到一种合适的方式遍历树中的每个结点。 递归思想遍历二叉树 之前讲过,树是由根结点和子树部分构建的,对于每一棵树来说,都可以分为 3 部分:左子树、根结点和右子树。所以,可以采用递归的思想依次遍历每个结点。根据访问结点时机的不
阅读全文
摘要:通过前一节的学习,了解了树的一些基本知识。二叉树是在树的基础上对本身的结构做了更高的限制: 二叉树本身是有序树。 二叉树中各结点的度最多是 2,可以是 0,1,2。 图1 二叉树 满二叉树和完全二叉树 如果二叉树中除了叶子结点,每个结点的度都为 2,那么此二叉树为满二叉树。例如图 1 就是一个满二叉
阅读全文
摘要:之前介绍的所有的数据结构都是线性存储结构。本章所介绍的树结构是一种非线性存储结构,存储的是具有“一对多”关系的数据元素的集合。 (A) (B) 图 1 树的示例 图 1(A) 是使用树结构存储的集合 {A,B,C,D,E,F,G,H,I,J,K,L,M} 的示意图。对于数据 A 来说,和数据 B、C
阅读全文
摘要:复制广义表数据结构中的树 树是数据结构中比较重要也是比较难理解的一类存储结构。本章主要主要围绕二叉树,对树的存储以及遍历做详细的介绍,同时还会涉及到有关树的实际应用,例如构建哈弗曼编码等。 由于树存储结构本身比较复杂,需要有耐心地去搞清楚每一节中的每个知识点,在学习时,建议从每节的问题出发,搞清楚文章的解题思路。 本章内容: 1. 数据结构中的树存储结构 2. 二叉树顺序存储和链式存储的C语...
阅读全文

浙公网安备 33010602011771号