
C++(数据结构与算法)
文章平均质量分 79
董哥的黑板报
90后程序员!
展开
-
C++(数据结构与算法):01---软件测试(黑盒测试、白盒测试)
一、什么是测试由于采用严格的数学证明方法来证明一个程序的正确性是非常困难的(哪怕是一个很小的程序),所以我们想转而求助于程序测试 (program test)过程来实施这项工作 所谓程序测试是指在目标计算机上利用输入数据,也称 之为测试数据( test data)来实际运行该程序,把程序的实际行为与所期望的行为进行比较 如果两种行为不同,就可判定程序中有问题存在。然而,不幸的是,即使两种行...原创 2019-11-21 21:49:47 · 2040 阅读 · 8 评论 -
C++(数据结构与算法):02---程序性能之(空间复杂度)
一、空间复杂度介绍程序的空间复杂性(space complexity)是指运行完一个程序所需要的内存大小对一个程序的空间复杂性感兴趣的主要原因如下:①如果程序将要运行在一个多用户计算机系统中,可能需要指明分配给该程序所需的内存大小 ②对任何一个计算机系统,都想要知道是否有足够可用的内存来运行该程序 ③一个问题可能有若干个内存需求各不相同的解决方案。比如,对于你的计算机来说,某 个C...原创 2019-11-21 22:51:13 · 1149 阅读 · 0 评论 -
C++(数据结构与算法):03---程序性能之(时间复杂度)
一、时间复杂度介绍程序的空间复杂性(space complexity)是指运行完一个程序所需要的内存大小对一个程序的时间复杂性感兴趣的主要原因如下:①有些计算机需要用户提供程序运行时间的上限,一旦达到这个上限,程序将被强制结束。 一种简易的办法是简单地指定时间上限为几千年。然而这种办法可能会造成严重的财政问题, 因为如果由于数据问题导致你的程序进入一个死循环,你可能需要为你所使用的机时...原创 2019-11-22 12:15:37 · 834 阅读 · 0 评论 -
C++(数据结构与算法):04---渐近记法:大O记法、Ω记法、Θ记法、小o记法
待续原创 2019-11-22 12:20:00 · 738 阅读 · 0 评论 -
C++(数据结构与算法):05---性能测量
待续原创 2019-11-22 12:24:26 · 405 阅读 · 0 评论 -
C++(数据结构与算法):06---线性表介绍
一、线性表介绍线性表(linear list)也称有序表(ordered list),它的每一个实例都是元素的一个有序集合 下面是一些线性表的例子: ①一个班级的学生姓名的字母顺序排列的列表 ②奥林匹克男子篮球比赛的金牌获得者按年代次序排列的列表 二、设计线性表的抽象数据类型(ADT)抽象数据类型的说明独立于任何程序语言的扫描,我们根据抽象数据类型然后采用具体的程序语言去实现...原创 2019-11-22 12:37:12 · 757 阅读 · 0 评论 -
C++(数据结构与算法):07---线性表的实现(数组形式)
一、线性表的介绍见文章:https://blog.youkuaiyun.com/qq_41453285/article/details/103198772二、数组实现线性表的方法方式一从数组的头端实现 例如有一个数组element[10],我们可以将元素{5,2,4,8,1}从其索引0处作为线性表的头开始实现,线性表的方向从左至右方式二从数组的尾端实现 接方式一,我们将数组e...原创 2019-11-22 21:39:17 · 2213 阅读 · 2 评论 -
C++(数据结构与算法):08---线性表的实现(单数组中实现多重表)
看图片吧原创 2019-11-22 22:33:13 · 408 阅读 · 0 评论 -
C++(数据结构与算法):09---线性表的实现(vector形式)
一、用vector实现线性表vector基础知识可以见文章:https://blog.youkuaiyun.com/qq_41453285/article/details/86624816 前面的文章(https://blog.youkuaiyun.com/qq_41453285/article/details/103198828)我们使用数组的方式实现了线性表,本文我们可以使用vector来实现线性表二、代码实...原创 2019-11-23 19:17:37 · 894 阅读 · 0 评论 -
C++(数据结构与算法):10---线性表的实现(单链表形式)
一、用单链表实现线性表前面的文章(https://blog.youkuaiyun.com/qq_41453285/article/details/103198828、https://blog.youkuaiyun.com/qq_41453285/article/details/103208499)我们分别使用数组、vector的方式实现了线性表,本文我们可以使用单链表来实现线性表二、编码实现线性表类实现(cl...原创 2019-11-25 15:55:06 · 951 阅读 · 0 评论 -
C++(数据结构与算法):11---线性表的实现(循环链表形式)
一、循环链表介绍下面有两条措施,它们可以使链表的应用代码简介和高效: ①把线性表描述成一个单向循环链表(简称循环链表),而不是单链表 ②在链表的前面增加一个节点,称为头结点。只要将单向链表的尾节点和头结点连接起来,单链表就成为循环链表 下图是循环链表的示意图:二、编码实现使用头结点的链表非常普遍,这样可以使程序更简洁、运行速度更快 假定类circularListWith...原创 2019-11-25 20:16:35 · 491 阅读 · 0 评论 -
C++(数据结构与算法):12---线性表应用之(箱子排序、基数排序、凸包、并查集)
待续原创 2019-11-25 23:22:56 · 514 阅读 · 0 评论 -
C++(数据结构与算法):13---数组
一、数组的抽象数据类型(ADT)有关数组的操作如下: ①取值:对一个给定的索引,取对应数对中的值 ②存值:把一个新数加到数对集合中 二、行主映射,列主映射令n是一个k维数组的元素个数。该数组的序列化需要借助一个映射函数,把数组的一个索引[i1]、[i2]、[i3]、[ik]映射到[0,n-1]范围中的一个数map(i1,i2,i3...,ik),把索引为[i1][i2][i3...原创 2019-11-26 20:01:16 · 755 阅读 · 0 评论 -
C++(数据结构与算法):14---矩阵介绍
一、矩阵介绍一个矩m*b的矩阵是一个m行、n列的表,如下图所示:m和n是矩阵的维数 矩阵与二维数组不同,矩阵的索引从1开始二、矩阵的运算矩阵最常见的操作是:矩阵转置、矩阵相加、矩阵相乘矩阵转置一个m*n的矩阵M转置之后是一个n*m的矩阵,它们的关系是:矩阵相加两个矩阵仅当维数相同(行数、列数分别相同)时才可以相加 两个m*n的矩阵A和B相加之后是一个m*n...原创 2019-11-26 20:16:37 · 2028 阅读 · 0 评论 -
C++(数据结构与算法):15---矩阵的实现(数组形式)
一、矩阵知识见文章:https://blog.youkuaiyun.com/qq_41453285/article/details/103258010二、数组实现矩阵我们不使用二维数组来实现矩阵,而是将矩阵映射到一个一位数组中三、代码设计异常类定义class illegalParamterValue{private: string message;public: illega...原创 2019-11-26 22:51:41 · 1165 阅读 · 0 评论 -
C++(数据结构与算法):16---特殊矩阵的实现(对角矩阵、三对角矩阵、下三角矩阵、上三角矩阵、对称矩阵)
一、特殊矩阵(方阵)方阵:是指行数与列数相同的矩阵 一些常用的特殊方阵如下: 对角矩阵:M是一个对角矩阵,当且仅当i!=l时,M(i,j)=0 三对角矩阵:M是一个三对角矩阵,当且仅当|i-j|>1时,M(i,j)=0 下三角矩阵:M是一个下三角矩阵,当且仅当i<j时,M(i,j)=0 上三角矩阵:M是一个上三角矩阵,当且仅当i>j时,M(i,j)=0 对...原创 2019-11-26 22:54:44 · 7258 阅读 · 1 评论 -
C++(数据结构与算法):18---栈介绍
一、栈的特点也是线性表的一种 把线性表的插入和删除操作限制在同一端进行。因此,栈是一个后进先出(last-in-first-out,LIFO)的数据结构二、栈的定义栈是一种特殊的线性表,其插入(也称入栈或压栈)和删除(也称出栈或弹栈)操作都在表的同一端进行。这一端称为栈顶(top),另一端称为栈底(buttom)三、栈的应用现实中的栈函数调用中的栈(递归)...原创 2019-11-30 21:47:34 · 578 阅读 · 0 评论 -
C++(数据结构与算法):19---栈的实现(数组形式)
数组描述栈因为栈是一种插入和删除操作都被限制在一端进行的线性表 如果把数组线性表的右端定义为栈顶,那么入栈和出栈操作对应的就是线性表在最好情况下的插入和删除操作。结果两个操作的时间都为O(1)一、继承与arrayList、stack来实现arrayList类是我们在前面介绍线性表所使用的类,见文章:https://blog.youkuaiyun.com/qq_41453285/article/de...原创 2019-12-05 22:26:37 · 499 阅读 · 0 评论 -
C++(数据结构与算法):20---栈的实现(链表形式)
一、链表实现若用链表实现,我们将考虑使用链表的左端还是右端来作为栈顶 如果使用链表右端作为栈顶,那么栈操作top、push、pop的实现需要调用链表方法get(size()-1)、insert(size(),theElement)和rease(size()-1)。每一个链表方法需要用时O(size()) 如果使用链表左端作为栈顶,那么栈操作调用链表方法get(0)、insert(0,th...原创 2019-12-08 10:19:29 · 527 阅读 · 0 评论 -
C++(数据结构与算法):21---栈应用之(括号匹配、汉诺塔、列车车厢重排、开关盒布线、离线等价类、迷宫老鼠)
待续原创 2019-12-08 10:20:26 · 607 阅读 · 0 评论 -
C++(数据结构与算法):22---队列介绍
一、队列的特点队列和占一样,也是线性表的一种 队列的插入和删除操作分别在线性表的两端进行。因此,队列是一个先进先出(first-in-first-out,FIFO)的数据结构 STL的队列是一种用数组描述的队列数据结构二、队列的定义队列是一种特殊的线性表,其插入(也称入队)和删除(也称出出队)操作分别在表的不同端进行。插入元素的那一端称为队尾(back或rear),删除元素的那一端称...原创 2019-12-08 10:44:29 · 433 阅读 · 0 评论 -
C++(数据结构与算法):23---队列的实现(数组形式)
一、数组描述的3种形式形式①假定采用下面的公式把队列的元素映射到一个数组queue中location(i)=i这个公式用在数组描述的线性表和栈中很有效,有以下的形式: 队列的第i个元素存储在queue[i]中,i>=0 令arrayLength为队列的长度 queueFront、queueBack分别为队首和队尾元素的位置 queueFront=0,array...原创 2019-12-08 16:32:35 · 592 阅读 · 0 评论 -
C++(数据结构与算法):38---树应用之(设置信号放大器、并查集)
待续原创 2019-12-20 21:08:45 · 1434 阅读 · 0 评论 -
C++(数据结构与算法):24---队列的实现(链表形式)
一、链表实现的两种方式根据链接的方向不同,有两种记录方式: 从头到尾链接 从尾到头链接 从头到尾链接插入操作如下所示:删除操作如下所示:从尾到头链接插入操作如下所示:删除操作如下所示:二、编码实现从下面的介绍可以看出,两种方式的插入操作复杂度一样,删除时从头到尾链接的方式复杂度较低,因此我们采用从头到尾链接的方式实现代码 代码实现...原创 2019-12-08 19:52:00 · 559 阅读 · 0 评论 -
C++(数据结构与算法):25---队列应用之(列车车厢重排、电路布线、图元识别、工厂仿真)
待续原创 2019-12-08 19:55:10 · 828 阅读 · 0 评论 -
C++(数据结构与算法):26---跳表和散列(哈希)介绍
一、跳表的概念在n个元素的有序数组上折半查找所需的时间为,但在有序链表上查找所需要的时间为O(n)。为了提高有序链表的查找性能,可以在全部或部分节点上增加额外的指针。在查找时,通过这些指针,可以跳过链表的若干个节点,不必从左到右连续查看所有节点。增加了额外的向前指针的链表叫跳表 它采用随机技术来决定链表的哪些节点应增加向前指针,以及增加多少个指针 基于这种随机技术,跳表的查找、插入、删除的...原创 2019-12-08 20:34:35 · 649 阅读 · 0 评论 -
C++(数据结构与算法):27---字典介绍
一、字典字典(dictionary)是由一些形如(k,v)的数对所组成的集合,其中: k:是关键字 v:是与关键字k对应的值 任意两个数对,其关键字都不等 多重字典:两个或更多的数对可以具有相同的关键字 有关字典的操作如下: 确定字典是否为空 确定字典有多少数对 寻找一个指定了关键字的数对 插入一个数对 删除一个指定了关键字的数对 二、字典的抽象数据类型...原创 2019-12-08 20:52:54 · 7427 阅读 · 0 评论 -
C++(数据结构与算法):28---字典的实现(链表形式)
一、字典介绍见文章:https://blog.youkuaiyun.com/qq_41453285/article/details/103448760二、代码实现我们的字典采用键值升序的方式来对字典进行排序。插入字典时,如果键已经存在,则更新值;如果键不存在,则插入键头文件#include <iostream>#include <string>#include...原创 2019-12-08 21:56:24 · 1166 阅读 · 0 评论 -
C++(数据结构与算法):29---跳表的实现(链表形式)
一、跳表介绍见文章:https://blog.youkuaiyun.com/qq_41453285/article/details/103448493二、跳表的表示在一个用有序链表描述的n个数对的字典中进行查找,至少需要n次关键字比较 如果在链表的中部节点加一个指针,则比较次数可以减少到n/2+1。这时,为了查找一个数对,首先与中间的数对比较: 如果查找的数对关键字比较小,则仅在链表的左半部分继...原创 2019-12-12 15:43:53 · 925 阅读 · 0 评论 -
C++(数据结构与算法):30---散列(哈希)表的介绍(散列函数、散列冲突、散列溢出)
一、散列(哈希)介绍散列使用一个散列函数(也称为哈希函数)把字典的数对映射到一个散列表(也称为哈希表)的具体位置 散列的存储与查找: 查找:如果数对p的关键字是k,散列函数为f,那么在理想的情况下,p在散列表中的位置为f(k),我们首选计算f(k),然后查看在散列表的f(k)处是否存在要查找的值 存储:与查找相同,使用f(k)函数算出键值对k在散列表的位置,然后把元素插入到散列表对应的...原创 2019-12-13 20:21:06 · 1199 阅读 · 0 评论 -
C++(数据结构与算法):31---散列(哈希)冲突之线性探查法(附编码实现)
一、线性探查法散列表基础介绍与散列冲突见文章:https://blog.youkuaiyun.com/qq_41453285/article/details/103517420 线性探查法的基本思想:在产生散列冲突时,将产生散列冲突的关键字向后存储 当使用了线性探查法之后,整个散列表就被视为一个环形表了二、图示说明散列函数为f(k)=k%11。且散列表的当前状态如下图所示当要插入58关键字...原创 2019-12-13 22:48:45 · 3122 阅读 · 1 评论 -
C++(数据结构与算法):32---散列(哈希)冲突之链地址法(附编码实现)
一、链地址法散列表基础介绍与散列冲突见文章:https://blog.youkuaiyun.com/qq_41453285/article/details/103517420 链地址法的基本思想:在散列表的每一个位置分配一个线性表。这样,每一个数对就可以存储在它的起始桶线性表中了 链地址法同时也解决了散列表移除的问题 例如,下图就是一个散列表,其中产生散列冲突的元素存储在同一个桶链表中了二、链...原创 2019-12-15 23:01:26 · 1844 阅读 · 0 评论 -
C++(数据结构与算法):33---LZW压缩与解压
待续原创 2019-12-15 23:11:36 · 666 阅读 · 0 评论 -
C++(数据结构与算法):34---树的介绍及树的各种术语
一、树树状图是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的二、树的种类按功能: 一般树(简单树)、二叉树 堆(heap)、左高树(leftist tree)、竞标赛树、二叉搜索树、AVL树、红黑树、伸展树、B树 配对堆、区间堆、双端优先级队列的树结构、字典树(也称前缀数...原创 2019-12-16 13:45:44 · 1435 阅读 · 0 评论 -
C++(数据结构与算法):35---普通树的实现(链表形式)
待续原创 2019-12-16 13:46:51 · 567 阅读 · 0 评论 -
C++(数据结构与算法):36---二叉树的实现(数组形式)
一、二叉树的数组表示在前一篇文章中,我们曾介绍过二叉树节点的规则: 设完全二叉树的一个元素其编号为i,1<=i<=n,则由以下关系: 1.如果i=1,则该元素为二叉树的根。若i>1,则其父节点的编号为i/2 2.如果2i>n,则元素无左孩子。否则,其左孩子的编号为2*i 3.如果2i+1>n,则该元素无右孩子。否则, 其右孩子的编号为2*i+...原创 2019-12-16 15:58:07 · 1489 阅读 · 3 评论 -
C++(数据结构与算法):37---二叉树的实现(链表形式)
一、二叉树的常用操作确定高度 确定元素数目 复制 显示或打印二叉树 确定两棵二叉树是否一样 删除整棵树二、二叉树抽象数据类型(ADT)三、二叉树的抽象类(binaryTree)根据上面的抽象数据类型,我们定义了如下的抽象类template<class T>class binaryTree{public: virtual ~binaryTree()...原创 2019-12-20 21:06:33 · 1186 阅读 · 0 评论 -
C++(数据结构与算法):39---优先级队列介绍
一、优先级队列介绍优先级队列与普通队列不同,在优先级队列中,元素出队列的顺序由元素的优先级决定: 1.可以按优先级的递增顺序 2.也可以按优先级的递减顺序 3.但不是元素进入队列的顺序 优先级队列的实现: 普通数组实现 堆是实现优先级队列效率很高的数据结构。堆是一颗完全二叉树(用数组最有效率) 在链表结构中,在高度和重量上的左高树也适合于表示优先级队列 C++...原创 2019-12-20 21:37:24 · 706 阅读 · 0 评论 -
C++(数据结构与算法):40---优先级队列的实现(普通线性表形式)
一、线性表表示无序线性表表示如果使用数组: 入队列时,直接将元素插入到线性表尾部即可,所以插入所需时间为Θ(1) 出队列时,必须现在未排序的n个元素中查找优先级最大的元素,然后执行出队列操作,因此删除操作所需时间为Θ(n) 如果使用链表: 入队列操作在链头执行,时间为Θ(1),而出队列操作(杀出)所需时间为Θ(n) 有序线性表表示如果使用数组,元素按非递减顺序...原创 2019-12-20 21:38:44 · 597 阅读 · 0 评论 -
C++(数据结构与算法):41---优先级队列的实现(大根堆、小根堆)
一、大根树、小根树大根树:其中每个节点的值都大于或等于其子节点的值 小根树:其中每个节点的值都小于或等于其子节点的值图例二、大根堆、小根堆大根堆:属于大根树的一种,但是必须是完全二叉树 小根堆:属于小根树的一种,但是必须是完全二叉树图例下面是两个大根堆,因为每个节点的值都大于其子节点的值,并且是完全二叉树下面不是大根堆,因为其不是完全二叉树下面是两个小...原创 2019-12-20 23:02:09 · 1178 阅读 · 0 评论