05 2018 档案

摘要:本栏目专门用来分享与数据结构和算法有关的源码,这些源码都是用心整理的,并且附带了注释、思路解析以及精美图片。重要的是,这些源码都是免费的。 稀疏矩阵的三元组表示(带源码+解析) 头结点和头指针在链表中的作用 链表节点的插入,链表插入节点 哈夫曼(赫夫曼,哈弗曼)编码算法(带源码+解析) 二叉树遍历算 阅读全文
posted @ 2018-05-23 11:12 程序员进阶笔记 阅读(1211) 评论(0) 推荐(0)
摘要:链表翻转,简单地理解,就是将链表的头部结点变为链表的尾部结点,与此同时将原链表的尾部结点变成头部结点。如下图所示: 图 1 链表翻转示意图 提示:H 为头指针,图示中的链表无头结点,头指针直接指向首元结点。 将链表进行翻转的方法有多种,本节给大家介绍两种实现方法。 方法一 实现链表翻转最直接的方法就 阅读全文
posted @ 2018-05-23 11:11 程序员进阶笔记 阅读(1458) 评论(0) 推荐(1)
摘要:基数排序不同于之前所介绍的各类排序,前边介绍到的排序方法或多或少的是通过使用比较和移动记录来实现排序,而基数排序的实现不需要进行对关键字的比较,只需要对关键字进行“分配”与“收集”两种操作即可完成。 例如对无序表{50,123,543,187,49,30,0,2,11,100}进行基数排序,由于每个 阅读全文
posted @ 2018-05-23 10:53 程序员进阶笔记 阅读(1435) 评论(0) 推荐(0)
摘要:本节介绍一种不同于插入排序和选择排序的排序方法——归并排序,其排序的实现思想是先将所有的记录完全分开,然后两两合并,在合并的过程中将其排好序,最终能够得到一个完整的有序表。 例如对于含有 n 个记录的无序表,首先默认表中每个记录各为一个有序表(只不过表的长度都为 1),然后进行两两合并,使 n 个有 阅读全文
posted @ 2018-05-23 10:47 程序员进阶笔记 阅读(981) 评论(0) 推荐(0)
摘要:本节介绍三种选择排序算法,分别为:简单选择排序、树形选择排序和堆排序。 简单选择排序 该算法的实现思想为:对于具有 n 个记录的无序表遍历 n-1 次,第 i 次从无序表中第 i 个记录开始,找出后序关键字中最小的记录,然后放置在第 i 的位置上。例如对无序表{56,12,80,91,20}采用简单 阅读全文
posted @ 2018-05-23 10:39 程序员进阶笔记 阅读(5606) 评论(0) 推荐(2)
摘要:上节介绍了如何使用起泡排序的思想对无序表中的记录按照一定的规则进行排序,本节再介绍一种排序算法——快速排序算法(Quick Sort)。 C语言中自带函数库中就有快速排序——qsort函数 ,包含在 <stdlib.h> 头文件中。 快速排序算法是在起泡排序的基础上进行改进的一种算法,其实现的基本思 阅读全文
posted @ 2018-05-23 09:45 程序员进阶笔记 阅读(2037) 评论(0) 推荐(0)
摘要:起泡排序,别名“冒泡排序”,该算法的核心思想是将无序表中的所有记录,通过两两比较关键字,得出升序序列或者降序序列。 例如,对无序表{49,38,65,97,76,13,27,49}进行升序排序的具体实现过程如图 1 所示: 图 1 第一次起泡 如图 1 所示是对无序表的第一次起泡排序,最终将无序表中 阅读全文
posted @ 2018-05-23 09:38 程序员进阶笔记 阅读(14577) 评论(0) 推荐(3)
摘要:希尔排序,又称“缩小增量排序”,也是插入排序的一种,但是同前面几种排序算法比较来看,希尔排序在时间效率上有很大的改进。 在使用直接插入排序算法时,如果表中的记录只有个别的是无序的,多数保持有序,这种情况下算法的效率也会比较高;除此之外,如果需要排序的记录总量很少,该算法的效率同样会很高。希尔排序就是 阅读全文
posted @ 2018-05-23 09:35 程序员进阶笔记 阅读(2843) 评论(0) 推荐(0)
摘要:前面章节中所介绍到的三种插入排序算法,其基本结构都采用数组的形式进行存储,因而无法避免排序过程中产生的数据移动的问题。如果想要从根本上解决只能改变数据的存储结构,改用链表存储。表插入排序,即使用链表的存储结构对数据进行插入排序。在对记录按照其关键字进行排序的过程中,不需要移动记录的存储位置,只需要更 阅读全文
posted @ 2018-05-23 09:31 程序员进阶笔记 阅读(7593) 评论(0) 推荐(1)
摘要:2-路插入排序算法是在折半插入排序的基础上对其进行改进,减少其在排序过程中移动记录的次数从而提高效率。 具体实现思路为:另外设置一个同存储记录的数组大小相同的数组 d,将无序表中第一个记录添加进 d[0] 的位置上,然后从无序表中第二个记录开始,同 d[0] 作比较:如果该值比 d[0] 大,则添加 阅读全文
posted @ 2018-05-23 09:26 程序员进阶笔记 阅读(574) 评论(0) 推荐(0)
摘要:上一节介绍了直接插入排序算法的理论实现和具体的代码实现,如果你善于思考就会发现该算法在查找插入位置时,采用的是顺序查找的方式,而在查找表中数据本身有序的前提下,可以使用折半查找来代替顺序查找,这种排序的算法就是折半插入排序算法。 该算法的具体代码实现为: 折半插入排序算法相比较于直接插入排序算法,只 阅读全文
posted @ 2018-05-23 09:23 程序员进阶笔记 阅读(1179) 评论(0) 推荐(0)
摘要:插入排序算法是所有排序方法中最简单的一种算法,其主要的实现思想是将数据按照一定的顺序一个一个的插入到有序的表中,最终得到的序列就是已经排序好的数据。 直接插入排序是插入排序算法中的一种,采用的方法是:在添加新的记录时,使用顺序查找的方式找到其要插入的位置,然后将新记录插入。 很多初学者所说的插入排序 阅读全文
posted @ 2018-05-23 09:20 程序员进阶笔记 阅读(793) 评论(0) 推荐(0)
摘要:排序算法 本章详细介绍多种排序算法:插入排序算法、快速排序算法、选择排序算法、归并排序和基数排序等,不仅介绍算法的理论实现,还有可运行的完整代码以及讨论各自的时间复杂度。 本章内容:1. 插入排序算法2. 折半插入排序算法(折半排序算法)3. 2-路插入排序算法4. 表插入排序算法5. 希尔排序算法 阅读全文
posted @ 2018-05-23 09:16 程序员进阶笔记 阅读(384) 评论(0) 推荐(0)
摘要:上一节介绍了有关哈希表及其构造过程的相关知识,本节将介绍如何利用哈希表实现查找操作。 在哈希表中进行查找的操作同哈希表的构建过程类似,其具体实现思路为:对于给定的关键字 K,将其带入哈希函数中,求得与该关键字对应的数据的哈希地址,如果该地址中没有数据,则证明该查找表中没有存储该数据,查找失败:如果哈 阅读全文
posted @ 2018-05-21 16:09 程序员进阶笔记 阅读(945) 评论(0) 推荐(0)
摘要:前面介绍了静态查找表以及动态查找表中的一些查找方法,其查找的过程都无法避免同查找表中的数据进行比较,查找算法的效率很大程度取决于同表中数据的查找次数。而本节所介绍的哈希表可以通过关键字直接找到数据的存储位置,不需要进行任何的比较,其查找的效率相较于前面所介绍的查找算法是更高的。 哈希表的构建 在初中 阅读全文
posted @ 2018-05-21 16:05 程序员进阶笔记 阅读(2862) 评论(0) 推荐(0)
摘要:红黑树(R-B TREE,全称:Red-Black Tree),本身是一棵二叉查找树,在其基础上附加了两个要求: 树中的每个结点增加了一个用于存储颜色的标志域; 树中没有一条路径比其他任何路径长出两倍,整棵树要接近于“平衡”的状态。 这里所指的路径,指的是从任何一个结点开始,一直到其子孙的叶子结点的 阅读全文
posted @ 2018-05-21 15:45 程序员进阶笔记 阅读(831) 评论(0) 推荐(1)
摘要:上一节介绍如何使用二叉排序树实现动态查找表,本节介绍另外一种实现方式——平衡二叉树。平衡二叉树,又称为 AVL 树。实际上就是遵循以下两个特点的二叉树: 每棵子树中的左子树和右子树的深度差不能超过 1; 二叉树中每棵子树都要求是平衡二叉树; 其实就是在二叉树的基础上,若树中每棵子树都满足其左子树和右 阅读全文
posted @ 2018-05-21 15:03 程序员进阶笔记 阅读(1111) 评论(0) 推荐(0)
摘要:前几节介绍的都是有关静态查找表的相关知识,从本节开始介绍另外一种查找表——动态查找表。 动态查找表中做查找操作时,若查找成功可以对其进行删除;如果查找失败,即表中无该关键字,可以将该关键字插入到表中。动态查找表的表示方式有多种,本节介绍一种使用树结构表示动态查找表的实现方法——二叉排序树(又称为“二 阅读全文
posted @ 2018-05-21 14:51 程序员进阶笔记 阅读(11237) 评论(0) 推荐(0)
摘要:前面章节所介绍的有关在静态查找表中对特定关键字进行顺序查找、折半查找或者分块查找,都是在查找表中各关键字被查找概率相同的前提下进行的。 例如查找表中有 n 个关键字,表中每个关键字被查找的概率都是 1/n。在等概率的情况,使用折半查找算法的性能最优。 而在某些情况下,查找表中各关键字被查找的概率是不 阅读全文
posted @ 2018-05-21 14:39 程序员进阶笔记 阅读(2904) 评论(0) 推荐(1)
摘要:本节介绍一种在顺序查找的基础上对其进行改进的算法——分块查找算法。 分块查找,也叫索引顺序查找,算法实现除了需要查找表本身之外,还需要根据查找表建立一个索引表。例如图 1,给定一个查找表,其对应的索引表如图所示: 图 1 查找表及其对应的索引表 图 1 中,查找表中共 18 个查找关键字,将其平均分 阅读全文
posted @ 2018-05-21 14:29 程序员进阶笔记 阅读(13871) 评论(0) 推荐(2)
摘要:折半查找,也称二分查找,在某些情况下相比于顺序查找,使用折半查找算法的效率更高。但是该算法的使用的前提是静态查找表中的数据必须是有序的。 例如,在{5,21,13,19,37,75,56,64,88 ,80,92}这个查找表使用折半查找算法查找数据之前,需要首先对该表中的数据按照所查的关键字进行排序 阅读全文
posted @ 2018-05-21 09:45 程序员进阶笔记 阅读(22582) 评论(0) 推荐(3)
摘要:通过前面对静态查找表的介绍,静态查找表即为只做查找操作的查找表。 静态查找表既可以使用顺序表表示,也可以使用链表结构表示。虽然一个是数组、一个链表,但两者在做查找操作时,基本上大同小异。 本节以静态查找表的顺序存储结构为例做详细的介绍。 顺序查找的实现 静态查找表用顺序存储结构表示时,顺序查找的查找 阅读全文
posted @ 2018-05-21 09:40 程序员进阶笔记 阅读(9256) 评论(1) 推荐(0)
摘要:在日常生活中,几乎每天都要进行一些查找的工作,在电话簿中查阅某个人的电话号码;在电脑的文件夹中查找某个具体的文件等等。本节主要介绍用于查找操作的数据结构——查找表。 查找表是由同一类型的数据元素构成的集合。例如电话号码簿和字典都可以看作是一张查找表。一般对于查找表有以下几种操作: 在查找表中查找某个 阅读全文
posted @ 2018-05-21 09:36 程序员进阶笔记 阅读(491) 评论(0) 推荐(0)
摘要:本章通过介绍不同的查找表,来讲解多种查找算法的实现,例如顺序查找、二分查找、分块查找等。同时本章中还会借用学过的树结构来实现查找具体数据的目的。 阅读全文
posted @ 2018-05-21 09:34 程序员进阶笔记 阅读(438) 评论(0) 推荐(0)
摘要:本节介绍一种解决系统中内存碎片过多而无法使用的方法——边界标识法。 在使用边界标识法的系统管理内存时,可利用空间表中的结点的构成如图 1: 图 1 结构构成 每个结点中包含 3 个区域,head 域、foot 域 和 space 域: space 域表示为该内存块的大小,它的大小通过 head 域中 阅读全文
posted @ 2018-05-21 09:32 程序员进阶笔记 阅读(1619) 评论(0) 推荐(0)
摘要:开发配置 OpenCV的例程中已经带有了人脸检测的例程,位置在:OpenCV\samples\facedetect.cpp文件,OpenCV的安装与这个例子的测试可以参考我之前的博文Linux 下编译安装OpenCV。 网上能够找到关于OpenCV人脸检测的例子也比较多,大多也都是基于这个例程来更改 阅读全文
posted @ 2018-05-19 13:50 程序员进阶笔记 阅读(3080) 评论(0) 推荐(0)
摘要:通过前面的学习,介绍很多具体的数据结构的存储以及遍历的方式,过程中只是很表面地介绍了数据的存储,而没有涉及到更底层的有关的存储空间的分配与回收,从本节开始将做更深入地介绍。 在使用早期的计算机上编写程序时,有关数据存储在什么位置等这样的问题都是需要程序员自己来给数据分配内存。而现在的高级语言,大大的 阅读全文
posted @ 2018-05-17 09:58 程序员进阶笔记 阅读(756) 评论(0) 推荐(0)
摘要:动态内存管理 移动迷宫小游戏(升级版)动态内存管理 在计算机中,操作系统负责管理整个内存空间,主要概括为两个方面:内存的分配与回收。本章中会详细介绍计算机中用于管理存储空间的方法,以及如何对产生的内存碎片进行处理。 阅读全文
posted @ 2018-05-17 09:50 程序员进阶笔记 阅读(367) 评论(0) 推荐(0)
摘要:TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元 阅读全文
posted @ 2018-05-16 16:01 程序员进阶笔记 阅读(3433) 评论(0) 推荐(0)
摘要:JSON全称为JavaScript ObjectNotation,它是一种轻量级的数据交换格式,易于阅读、编写、解析。jsoncpp是c++解析JSON串常用的解析库之一。 jsoncpp中主要的类: Json::Value:可以表示所有支持的类型,如:int , double ,string , 阅读全文
posted @ 2018-05-16 15:52 程序员进阶笔记 阅读(720) 评论(0) 推荐(0)
摘要:《移动迷宫》游戏简介:迷宫只有两个门,一个入口,一个出口。一个骑士骑马从入口走进迷宫,迷宫中设置有很多墙壁,对前进方向造成障碍。骑士需要在迷宫中寻找通路以到达出口。 本游戏的迷宫是“移动”的,每次骑士进入迷宫时,迷宫的入口、出口,甚至是迷宫中设置的障碍都是不同的。 设计思路 解决类似的问题,使用回溯 阅读全文
posted @ 2018-05-16 15:21 程序员进阶笔记 阅读(1670) 评论(0) 推荐(0)
摘要:本节要讨论的是当给定 n(n>=0)个结点时,可以构建多少种形态不同的树。 如果两棵树中各个结点的位置都一一对应,可以说这两棵树相似。如果两棵树不仅相似,而且对应结点上的数据也相同,就可以说这两棵树等价。本节中,形态不同的树指的是互不相似的树。 前面介绍过,对于任意一棵普通树,通过孩子兄弟表示法的转 阅读全文
posted @ 2018-05-16 15:07 程序员进阶笔记 阅读(4096) 评论(0) 推荐(0)
摘要:回溯法(八皇后问题) 回溯法,又被称为“试探法”。解决问题时,每进行一步,都是抱着试试看的态度,如果发现当前选择并不是最好的,或者这么走下去肯定达不到目标,立刻做回退操作重新选择。这种走不通就回退再走的方法就是回溯法。例如,在解决列举集合 {1,2,3} 中所有子集的问题中,就可以使用回溯法。从集合 阅读全文
posted @ 2018-05-16 15:05 程序员进阶笔记 阅读(1154) 评论(0) 推荐(0)
摘要:赫夫曼树,别名“哈夫曼树”、“最优树”以及“最优二叉树”。学习哈夫曼树之前,首先要了解几个名词。 哈夫曼树相关的几个名词 路径:在一棵树中,一个结点到另一个结点之间的通路,称为路径。图 1 中,从根结点到结点 a 之间的通路就是一条路径。路径长度:在一条路径中,每经过一个结点,路径长度都要加 1 。 阅读全文
posted @ 2018-05-16 14:34 程序员进阶笔记 阅读(17120) 评论(2) 推荐(3)
摘要:树的双亲表示法、孩子表示法和孩子兄弟表示法 在使用树结构描述实际问题时,大多数不是二叉树,更多的是普通的树结构,在存储之间具有普通树结构的数据时,经常使用的方法有3种: 双亲表示法 孩子表示法 孩子兄弟表示法 双亲表示法 取一块连续的内存空间,在存储每个结点的同时,各自都附加一个记录其父结点位置的变 阅读全文
posted @ 2018-05-16 14:12 程序员进阶笔记 阅读(15398) 评论(1) 推荐(3)
摘要:通过前一节对线索二叉树的学习,其中,在遍历使用中序序列创建的线索二叉树时,对于其中的每个结点,即使没有线索的帮助下,也可以通过中序遍历的规律找到直接前趋和直接后继结点的位置。也就是说,建立的线索二叉链表可以从两个方向对结点进行中序遍历。通过前一节的学习,线索二叉链表可以从第一个结点往后逐个遍历。但是 阅读全文
posted @ 2018-05-16 11:55 程序员进阶笔记 阅读(600) 评论(0) 推荐(0)
摘要:通过前面对二叉树的学习,了解到二叉树本身是一种非线性结构,采用任何一种遍历二叉树的方法,都可以得到树中所有结点的一个线性序列。在这个序列中,除第一个结点外,每个结点都有自己的直接前趋;除最后一个结点外,每个结点都有一个直接后继。 图1 满二叉树 例如,图 1 采用先序遍历的方法得到的结点序列为:1 阅读全文
posted @ 2018-05-16 11:37 程序员进阶笔记 阅读(1148) 评论(0) 推荐(0)
摘要:前边介绍了二叉树的先序、中序和后序的遍历算法,运用了栈的数据结构,主要思想就是按照先左子树后右子树的顺序依次遍历树中各个结点。 本节介绍另外一种遍历方式:按照二叉树中的层次从左到右依次遍历每层中的结点。具体的实现思路是:通过使用队列的数据结构,从树的根结点开始,依次将其左孩子和右孩子入队。而后每次队 阅读全文
posted @ 2018-05-16 10:22 程序员进阶笔记 阅读(2512) 评论(0) 推荐(0)
摘要:递归算法底层的实现使用的是栈存储结构,所以可以直接使用栈写出相应的非递归算法。 先序遍历的非递归算法 从树的根结点出发,遍历左孩子的同时,先将每个结点的右孩子压栈。当遇到结点没有左孩子的时候,取栈顶的右孩子。重复以上过程。实现代码函数: // 先序遍历非递归算法 void PreOrderTrave 阅读全文
posted @ 2018-05-16 09:53 程序员进阶笔记 阅读(1121) 评论(0) 推荐(1)
摘要:链式存储结构存储的二叉树,对树中结点进行逐个遍历时,由于是非线性结构,需要找到一种合适的方式遍历树中的每个结点。 递归思想遍历二叉树 之前讲过,树是由根结点和子树部分构建的,对于每一棵树来说,都可以分为 3 部分:左子树、根结点和右子树。所以,可以采用递归的思想依次遍历每个结点。根据访问结点时机的不 阅读全文
posted @ 2018-05-16 09:21 程序员进阶笔记 阅读(1280) 评论(0) 推荐(1)
摘要:通过前一节的学习,了解了树的一些基本知识。二叉树是在树的基础上对本身的结构做了更高的限制: 二叉树本身是有序树。 二叉树中各结点的度最多是 2,可以是 0,1,2。 图1 二叉树 满二叉树和完全二叉树 如果二叉树中除了叶子结点,每个结点的度都为 2,那么此二叉树为满二叉树。例如图 1 就是一个满二叉 阅读全文
posted @ 2018-05-16 09:16 程序员进阶笔记 阅读(2460) 评论(0) 推荐(0)
摘要:之前介绍的所有的数据结构都是线性存储结构。本章所介绍的树结构是一种非线性存储结构,存储的是具有“一对多”关系的数据元素的集合。 (A) (B) 图 1 树的示例 图 1(A) 是使用树结构存储的集合 {A,B,C,D,E,F,G,H,I,J,K,L,M} 的示意图。对于数据 A 来说,和数据 B、C 阅读全文
posted @ 2018-05-16 09:12 程序员进阶笔记 阅读(834) 评论(0) 推荐(0)
摘要:复制广义表数据结构中的树 树是数据结构中比较重要也是比较难理解的一类存储结构。本章主要主要围绕二叉树,对树的存储以及遍历做详细的介绍,同时还会涉及到有关树的实际应用,例如构建哈弗曼编码等。 由于树存储结构本身比较复杂,需要有耐心地去搞清楚每一节中的每个知识点,在学习时,建议从每节的问题出发,搞清楚文章的解题思路。 本章内容: 1. 数据结构中的树存储结构 2. 二叉树顺序存储和链式存储的C语... 阅读全文
posted @ 2018-05-16 09:09 程序员进阶笔记 阅读(969) 评论(0) 推荐(0)
摘要:对于任意一个非空广义表来说,都是由两部分组成:表头和表尾。反之,只要确定的一个广义表的表头和表尾,那么这个广义表就可以唯一确定下来。复制一个广义表,也是不断的复制表头和表尾的过程。如果表头或者表尾同样是一个广义表,依旧复制其表头和表尾。所以,复制广义表的过程,其实就是不断的递归,复制广义表中表头和表 阅读全文
posted @ 2018-05-15 13:37 程序员进阶笔记 阅读(1405) 评论(0) 推荐(0)
摘要:广义表的长度 通过前一节对广义表的介绍,例子中给出了几个广义表的长度。例如:空表的长度为 0,只含有一个原子的广义表长度为 1,等等。广义表的长度指的是广义表中数据元素的数量。这里需要指明的是,一个广义表中,一个原子算做是一个元素,一个子表也只算做一个元素。在 LS = (a1,a2,…,an) 中 阅读全文
posted @ 2018-05-15 13:31 程序员进阶笔记 阅读(23510) 评论(0) 推荐(2)
摘要:广义表,又称为列表。记作: LS = (a1,a2,…,an) ;( LS 为广义表的名称, an 表示广义表中的数据)。 广义表可以看作是线性表的推广。两者区别是:线性表中的数据元素只能表示单个数据元素;广义表中的单个数据元素 ai ,既可以是单个元素,也可以是广义表。 原子和子表 在广义表中,单 阅读全文
posted @ 2018-05-15 13:24 程序员进阶笔记 阅读(3997) 评论(1) 推荐(1)
摘要:矩阵之间能够进行加法运算的前提条件是:各矩阵的行数和列数必须相等。 在行数和列数都相等的情况下,矩阵相加的结果就是矩阵中对应位置的值相加所组成的矩阵,例如: 图1 矩阵相加 十字链表法 之前所介绍的都是采用顺序存储结构存储三元组,在类似于矩阵的加法运算中,矩阵中的数据元素变化较大(这里的变化主要为: 阅读全文
posted @ 2018-05-15 10:46 程序员进阶笔记 阅读(4579) 评论(0) 推荐(1)
摘要:矩阵相乘的前提条件是:乘号前的矩阵的列数要和乘号后的矩阵的行数相等。且矩阵的乘法运算没有交换律,即 A*B 和 B*A 是不一样的。 例如,矩阵A:矩阵B:由于矩阵 A 的列数和矩阵 B 的行数相等,可以进行 A*B 运算(不能进行 B*A 运算)。计算方法是:用矩阵A的第 i 行和矩阵B中的每一列 阅读全文
posted @ 2018-05-14 15:13 程序员进阶笔记 阅读(3674) 评论(0) 推荐(0)
摘要:矩阵的转置实际上就是将数据元素的行标和列标互换,即 T(i,j) = M(j,i) 。例如: 图1 矩阵的转置 相应地,三元组表转变为: 图2 三元组表 矩阵的转置,经历了三个步骤: 矩阵的行数 n 和列数 m 的值交换; 将三元组中的i和j调换; 转换之后的表同样按照行序(置换前的列序)为主序,进 阅读全文
posted @ 2018-05-14 15:03 程序员进阶笔记 阅读(18247) 评论(0) 推荐(1)
摘要:如果矩阵中有很多数值相同的数据元素,在存储时,可以考虑对其进行适当的压缩存储。 有必要压缩存储的矩阵大致分为两大类: 矩阵中含有大量的相同数值,称为特殊矩阵(例如对称矩阵和上下三角矩阵)。 矩阵中只有极少量的元素是非 0 元素,称为稀疏矩阵。 两类矩阵压缩存储的方法: 特殊矩阵中,对于相同的数据元素 阅读全文
posted @ 2018-05-14 13:45 程序员进阶笔记 阅读(4149) 评论(0) 推荐(0)
摘要:数组,所有的程序设计语言学习之初都有它的身影。根据数组中存储的数据元素之间的逻辑关系,可以将数组分为 : 一维数组、二维数组、…、n维数组。 n维数组中,维数 n 的判断依据是:根据数组中为确定元素所在位置使用的最少的下标个数。例如,二维数组中想唯一确定一个元素的位置,至少需要使用 2 个下标, a[1][1]代表二维数组中行坐标为 1,列坐标为 1 的数据元素的值。 数组VS顺序表 数组和顺... 阅读全文
posted @ 2018-05-14 13:41 程序员进阶笔记 阅读(1916) 评论(0) 推荐(0)
摘要:本章主要介绍了数组和广义表的相关知识。数组章节,重点理解矩阵压缩存储的方式,在此基础上,学习矩阵的转置、乘法、和加法运算的实现;学习广义表时重点理解用递归的思想求广义表的深度和复制广义表。 本章内容: 1. 数据结构之多维数组 2. 矩阵压缩存储(十字链表、三元组顺序表、行逻辑 3. 矩阵转置算法及代码实现(三元组顺序表) 4. 矩阵乘法(行逻辑链接的顺序表)及代码实现 5. 矩阵加法(基于十字... 阅读全文
posted @ 2018-05-14 12:04 程序员进阶笔记 阅读(825) 评论(0) 推荐(0)
摘要:完整实现代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 1000 //KMP算法中的next数组 void Next(char *T, int *next){ int i=1; next[1]=0; 阅读全文
posted @ 2018-05-14 11:36 程序员进阶笔记 阅读(814) 评论(0) 推荐(0)
摘要:通过上一节的介绍,学习了串的普通模式匹配算法,大体思路是:模式串从主串的第一个字符开始匹配,每匹配失败,主串中记录匹配进度的指针 i 都要进行 i-j+1 的回退操作(这个过程称为“指针回溯”),同时模式串向后移动一个字符的位置。一次次的循环,直到匹配成功或者程序结束。 "KMP"算法相比于"BF" 阅读全文
posted @ 2018-05-14 11:05 程序员进阶笔记 阅读(20389) 评论(4) 推荐(5)
摘要:判断两个串之间是否存在主串与子串的关系,这个过程称为串的模式匹配。 在串的模式匹配过程,子串 T 通常被叫做“模式串”。 普通的模式匹配(“BF”算法) 判断两个串是否存在子串与主串的关系,最直接的算法就是拿着模式串,去和主串从头到尾一一比对,这就是“BF”算法的实现思想。将提供的模式串(例如 “a 阅读全文
posted @ 2018-05-13 20:21 程序员进阶笔记 阅读(1929) 评论(0) 推荐(0)
摘要:数据结构中的字符串 字符串BF算法(普通模式匹配算法) 数据结构中提到的串,即字符串,由 n 个字符组成的一个整体( n >= 0 )。这 n 个字符可以由字母、数字或者其他字符组成。 例如,S = ”BEIJING” ,S 代表这个串的串名,BEIJING 是串的值。 双引号不是串的值,作用只是为了将串和其他结构区分开。 特殊的串 空串:含有零个字符的串。例如:S = “”(双引号中没有任... 阅读全文
posted @ 2018-05-13 19:40 程序员进阶笔记 阅读(3300) 评论(2) 推荐(0)
摘要:字符串(数据结构中的串) 变态的停车场管理系统字符串的存储结构 本章介绍了字符串的三种存储结构,同时介绍了有关进行串的模式匹配的两种算法——普通模式匹配算法以及快速模式匹配算法。 建议读者在掌握普通模式匹配算法的基础上学习快速模式匹配算法,这样会理解地更深刻。 本章内容: 1. 数据结构中的字符串 2. BF算法(普通模式匹配算法)及C语言实现 3. KMP算法(快速模式匹配算... 阅读全文
posted @ 2018-05-13 14:12 程序员进阶笔记 阅读(615) 评论(0) 推荐(0)
摘要:小时候在刚开始接触扑克牌的时候,最初学会的扑克游戏就是类似于“推小车”这样的无脑游戏,本节带领大家使用学过的知识编写推小车卡牌游戏。 “推小车”扑克牌游戏适合 2-3 个人玩,游戏规则也超级简单:将一副扑克牌平均分成两份,每人拿一份,每个人手中的扑克牌全部反面朝上,叠成一摞。游戏进行时,每个人轮流拿 阅读全文
posted @ 2018-05-13 11:27 程序员进阶笔记 阅读(2407) 评论(0) 推荐(0)
摘要:队列(Queue)字符串 实践是检验真理的唯一标准,学习也是如此。本章对栈和队列做了详细的讲解,为了让大家能够学以致用,特推出一个项目供大家练习(包含了本章所有的重要知识点)。 本项目比较烧脑,要求对栈和队列有一定深度的了解,虽有完整代码供大家参考,但是建议先自行完成,然后参照本节给出的完整代码。 阅读全文
posted @ 2018-05-13 11:20 程序员进阶笔记 阅读(4954) 评论(0) 推荐(1)
摘要:队列是线性表的一种,在操作数据元素时,和栈一样,有自己的规则:使用队列存取数据元素时,数据元素只能从表的一端进入队列,另一端出队列,如图1。 图1 队列示意图 称进入队列的一端为“队尾”;出队列的一端为“队头”。数据元素全部由队尾陆续进队列,由队头陆续出队列。 队列的先进先出原则 队列从一端存入数据 阅读全文
posted @ 2018-05-13 11:05 程序员进阶笔记 阅读(14856) 评论(0) 推荐(0)
摘要:在编写代码的时候,经常会用到两种括号:圆括号 “()” 和大括号 “{}” 。不管使用哪种括号,程序编译没有问题的其中一个重要因素就是所使用的括号是否能够匹配上. 在编写程序时,括号可以嵌套,即: “({()})” 这种形式,但 “({)” 或者 “({}” 都不符合要求。括号匹配项目要求:给出任意 阅读全文
posted @ 2018-05-13 09:41 程序员进阶笔记 阅读(9334) 评论(0) 推荐(0)
摘要:进制转换器项目要求:用户提供需要转换的数据和该数据的进制,以及要转换的进制,进制转换器提供给用户最终的正确转换的结果。 转换器实例 例如,用户提供了一个十进制数:10,要求将此数据以二进制形式转换,则通过进制转换器转换的最终结果应该:1010。 提示:此进制转换器可以在 2-36 进制之间对数据进行 阅读全文
posted @ 2018-05-13 09:28 程序员进阶笔记 阅读(1380) 评论(0) 推荐(0)
摘要:栈,线性表的一种特殊的存储结构。与学习过的线性表的不同之处在于栈只能从表的固定一端对数据进行插入和删除操作,另一端是封死的。 图1 栈结构示意图 由于栈只有一边开口存取数据,称开口的那一端为“栈顶”,封死的那一端为“栈底”(类似于盛水的木桶,从哪进去的最后还得从哪出来)。 栈的“先进后出”原则 使用 阅读全文
posted @ 2018-05-13 09:14 程序员进阶笔记 阅读(1886) 评论(0) 推荐(0)
摘要:数据结构栈(Stack)和队列(Queue)详解 本章讲解了两种特殊的线性表结构——栈和队列。读者要重点理解栈的“先进后出”原则和队列的“先进先出”原则,体会两种特殊的线性表结构的应用场景。 本章内容: 1. 栈(Stack)的概念和应用及C语言实现 2. 数据结构实践项目之进制转换器 3. 括号匹配算法及C语言实现 4. 队列(Queue):“先进先出”的数据结构 5. 数据结构实践项目之... 阅读全文
posted @ 2018-05-12 17:04 程序员进阶笔记 阅读(663) 评论(0) 推荐(0)
摘要:俄罗斯轮盘赌,想必很多人都听说过,一种残忍的赌博游戏。游戏的道具是一把左轮手枪,其规则也很简单:在左轮手枪中的 6 个弹槽中随意放入一颗或者多颗子弹,在任意旋转转轮之后,关上转轮。游戏的参加者轮流把手枪对着自己,扣动扳机:中枪或是怯场,即为输的一方;坚持到最后的即为胜者。 本节实践项目同轮盘赌类似, 阅读全文
posted @ 2018-05-12 16:38 程序员进阶笔记 阅读(2619) 评论(0) 推荐(0)
摘要:之前接触到的链表都只有一个指针,指向直接后继,整个链表只能单方向从表头访问到表尾,这种结构的链表统称为 “单向链表”或“单链表”。 如果算法中需要频繁地找某结点的前趋结点,单链表的解决方式是遍历整个链表,增加算法的时间复杂度,影响整体效率。为了快速便捷地解决这类问题,在单向链表的基础上,给各个结点额 阅读全文
posted @ 2018-05-12 11:23 程序员进阶笔记 阅读(1473) 评论(0) 推荐(0)
摘要:链表的使用,还可以把链表的两头连接,形成了一个环状链表,称为循环链表。 和它名字的表意一样,只需要将表中最后一个结点的指针指向头结点,就形成了一个环。 图1 循环链表 循环链表和动态链表相比,唯一的不同就是循环链表首尾相连,其他都完全一样。 实际应用:约瑟夫环问题 约瑟夫环问题,是一个经典的循环链表 阅读全文
posted @ 2018-05-12 11:04 程序员进阶笔记 阅读(3032) 评论(0) 推荐(0)
摘要:本节继续介绍线性表的另外一种链式表示——静态链表。(前面介绍的链表称为 动态链表 )。逻辑结构上相邻的数据元素,存储在指定的一块内存空间中,数据元素只允许在这块内存空间中随机存放,这样的存储结构生成的链表称为静态链表。 静态链表和动态链表的区别:静态链表限制了数据元素存放的位置范围;动态链表是整个内 阅读全文
posted @ 2018-05-12 10:50 程序员进阶笔记 阅读(8459) 评论(0) 推荐(0)
摘要:逻辑结构上一个挨一个的数据,在实际存储时,并没有像顺序表那样也相互紧挨着。恰恰相反,数据随机分布在内存中的各个位置,这种存储结构称为线性表的链式存储。 由于分散存储,为了能够体现出数据元素之间的逻辑关系,每个数据元素在存储的同时,要配备一个指针,用于指向它的直接后继元素,即每一个数据元素都指向下一个 阅读全文
posted @ 2018-05-11 17:41 程序员进阶笔记 阅读(36087) 评论(0) 推荐(1)
摘要:逻辑结构上呈线性分布的数据元素在实际的物理存储结构中也同样相互之间紧挨着,这种存储结构称为线性表的顺序存储结构。 也就是说,逻辑上具有线性关系的数据按照前后的次序全部存储在一整块连续的内存空间中,之间不存在空隙,这样的存储结构称为顺序存储结构。 使用顺序存储结构存储的数据,第一个元素所在的地址就是这 阅读全文
posted @ 2018-05-11 17:25 程序员进阶笔记 阅读(7051) 评论(0) 推荐(1)
摘要:本章讲解了最基本的数据结构——线性表。从逻辑上讲,线性表中的数据是依次排列的,就像小学生排队过马路一样,彼此手拉手,每份数据的前面和后面各有一份数据,从整体上看连成了“一条线”。 线性表的概念:1分钟了解什么是线性表 线性表是数据结构中最简单的数据存储结构,可以理解为“线性的表”。线性,是说数据在逻 阅读全文
posted @ 2018-05-11 17:11 程序员进阶笔记 阅读(1306) 评论(0) 推荐(0)
摘要:算法,即解决问题的方法。同一个问题,使用不同的算法,虽然得到的结果相同,但是耗费的时间和资源是不同的。 就比如要拧一个螺母,使用扳手还是钳子是有区别的,虽然使用钳子也能拧螺母,但是没有扳手好用。“条条大路通罗马”,解决问题的算法有多种,这就需要判断哪个算法“更好”。 算法VS程序 很多人误以为程序就 阅读全文
posted @ 2018-05-11 17:07 程序员进阶笔记 阅读(1417) 评论(0) 推荐(0)
摘要:本节开始将带领大家系统地学习数据结构,作为一门计算机专业大二学生的必修课程,该课程面对的目标人群为初步具备基本编程能力和编程思想的程序员(大一接触了 C 语言或者 C++)。通过系统地学习数据结构,可以提高程序员分析问题和解决问题的能力。 首先,先来揭开数据结构的神秘面纱,看看什么是数据结构。 数据 阅读全文
posted @ 2018-05-11 16:20 程序员进阶笔记 阅读(3020) 评论(0) 推荐(2)