数据结构
&刘仔很忙
这个作者很懒,什么都没留下…
展开
-
C++学习【原创】copy和copy_backward函数的应用
copy和copy_backward函数的功能其实是一样的,无非是从第1个开始拷贝和从最后一个开始拷贝的区别。先看一下这两个函数的参数:copy(first,last,result);//first为容器的首迭代器,last为容器的末迭代器,result为结果数组。copy_backward(first,last,result);//first为容器的首迭代器,last为容器的转载 2017-10-14 21:43:36 · 803 阅读 · 0 评论 -
图 邻接链表法
邻接链表法基本思想:对图的每个顶点建立一个单链表,存储该顶点所有邻接顶点及其相关信息。每一个单链表设一个表头结点。第i个单链表表示依附于顶点Vi的边(对有向图是以顶点Vi为头或尾的弧)。1结点结构与邻接链表示例链表中的结点称为表结点,每个结点由三个域组成,如图(a)所示。其中邻接点域(adjvex)指示与顶点Vi邻接的顶点在图中的位置(顶点编号),链域(nextar转载 2017-12-31 18:42:51 · 5184 阅读 · 0 评论 -
动态规划算法经典案例
动态规划算法是从暴力搜索算法优化过来的,如果我们不清楚暴力搜索的过程,就难以理解动态规划的实现,当我们了解了动态规划算法的基本原理的文字概述,实现条件之后,这时可能并不是太理解这种思想,去面对实际问题的时候也是无从下手,这个时候我们不能停留在文字层面上,而应该去学习经典动态规划算法的实现,然后倒回来看这些概念,便会恍然大悟。动态规划算法的难点在于 从实际问题中抽象出动态规划表d转载 2018-01-03 17:17:30 · 4345 阅读 · 0 评论 -
动态规划入门
什么是动态规划? 动态规划(Dynamic Programming,所以我们简称动态规划为DP)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of转载 2018-01-03 17:36:03 · 179 阅读 · 0 评论 -
快速排序(QuickSort)
划分的关键是要求出基准记录所在的位置pivotpos,编程时候的关键点 快速排序: 既然能把冒泡KO掉,马上就激起我们的兴趣,tnd快排咋这么快,一定要好好研究一下。 首先上图: 从图中我们可以看到: left指针,right指针,base参照数。 其实思想是蛮简单的,就是通转载 2017-12-28 20:31:42 · 552 阅读 · 0 评论 -
快速排序、堆排序、归并排序比较
快速排序是二叉查找树(二叉查找树)的一个空间最优化版本。不是循序地把数据项插入到一个明确的树中,而是由快速排序组织这些数据项到一个由递归调用所隐含的树中。这两个算法完全地产生相同的比较次数,但是顺序不同。对于排序算法的稳定性指标,原地分区版本的快速排序算法是不稳定的。其他变种是可以通过牺牲性能和空间来维护稳定性的。快速排序的最直接竞争者是堆排序(Heapsort)。堆排序通常比快速排序稍微慢,但是转载 2017-12-28 20:55:00 · 2035 阅读 · 0 评论 -
常见比较排序算法的实现(归并排序、快速排序、堆排序、选择排序、插入排序、希尔排序)
这篇博客主要实现一些常见的排序算法。例如: //冒泡排序 //选择排序 //简单插入排序 //折半插入排序 //希尔排序 //归并排序 //双向的快速排序(以及快速排序的非递归版本) //单向的快速排序 //堆排序对于各个算法的实现原理,这里不再多说了,代码中注释较多,结合注释应该都能理解算法的原理,读者也可自己google一下。另外,注释中有很多点,比转载 2017-12-29 10:07:02 · 749 阅读 · 0 评论 -
如何计算时间复杂度
一、概念时间复杂度是总运算次数表达式中受n的变化影响最大的那一项(不含系数)比如:一般总运算次数表达式类似于这样:a*2^n+b*n^3+c*n^2+d*n*lg(n)+e*n+fa ! =0时,时间复杂度就是O(2^n);a=0,bO(n^3);a,b=0,cO(n^2)依此类推eg:(1) for(i=1;i //循环了n*n次,当然是O(n^2)转载 2017-12-29 13:00:37 · 205 阅读 · 0 评论 -
基数排序
所以,真正的编程高手同时是思想独到及富有智慧(注意与聪明区别)的人。每一个算法都是一种智慧的凝聚或萃取,值得我们学习从而提高自己,开拓思路,更重要的是转换思维角度。其实,我们大多数人都活在“默认状态”下。没有发觉自己的独特可设置选项-----思想。言归正传(呵呵!恢复默认状态),以下学习基数排序。【1】基数排序以前研究的各种排序算法,都是通过比较数据大小的方转载 2017-12-29 16:33:18 · 131 阅读 · 0 评论 -
哈夫曼树
什么是哈夫曼树?让我们先举一个例子。判定树: 在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设计直接影响着程序的执行效率。例如,编制一个程序,将百分制转换成五个等级输出。大家可能认为这个程序很简单,并且很快就可以用下列形式编写出来: [cpp] view plain copyi转载 2017-12-29 20:53:34 · 38628 阅读 · 9 评论 -
归并排序
归并排序(Merge Sort) (1)算法思想 归并排序采用了分治策略(divide-and-conquer),就是将原问题分解为一些规模较小的相似子问题,然后递归解决这些子问题,最后合并其结果作为原问题的解。 归并排序将待排序数组A[1..n]分成两个各含n/2个元素的子序列,然后对这个两个子序列进行递归排序,最后将转载 2017-12-29 20:48:58 · 137 阅读 · 0 评论 -
邻接矩阵无向图
邻接矩阵 无向图和有向图在邻接矩阵中的表示方法: 无向图和有向图大同小异,在这里只以无向图为例,代码部分通过简单调整即可对应编译有向图邻接矩阵数据类型定义#define MaxVertices 100 //定义最大容量typedef struct{ //包含权的邻接矩阵的的定义 int Vertices[MaxVertices]; //顶点信息的数组转载 2017-12-29 21:15:58 · 8524 阅读 · 0 评论 -
有向图和无向图用邻接矩阵储存
般存储图的方式有两种:一是用邻接矩阵表示,二是用邻接链表。所谓用邻接矩阵,是用一个二维数组存储,边使用矩阵来构建模型,这使得每一个顶点和其它顶点之间都有边的有无 的 表示的机会。若有边,则他们交点 为1 ,否则为0。当然,如果是一副边有权值的图,交点存储的是他们边的权值。1、首先收一下无向图的存储:无向图的边的矩阵一定是一个对称矩阵,因为无向图只关心边是否存在,而不转载 2017-12-29 21:27:14 · 6229 阅读 · 0 评论 -
散列表(哈希表)
散列表 又叫 哈希表 (hash table)。通过访问key而直接访问存储的value值。它的key - value之间存在一个映射函数,我们可以通过key值和“看不到”的映射函数(散列函数)访问对应的value值。这加快了查找的速度!存放记录的数组称做散列表。散列方法不同于顺序查找、二分查找、二叉排序树及B-树上的查找。它不以关键字的比较为基本操作,采用直接寻址技术 (就是说,它是直接通过转载 2017-12-30 10:36:30 · 652 阅读 · 0 评论 -
二叉树的二叉链表表示
链式存储结构 二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。其结点结构为: 其中,data域存放某结点的数据信息;lchild与rchild分别存放指向左孩子和右孩子的指针,当左孩子或右孩子不存在时,相应转载 2017-12-30 16:28:21 · 13963 阅读 · 2 评论 -
冒泡排序Bubble sort
经典排序算法 - 冒泡排序Bubble sort原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子例子为从小到大排序,原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 |第一趟排序(外循环转载 2017-12-31 13:30:44 · 154 阅读 · 0 评论 -
最小生成树–Prim算法&Kruskal算法
最小生成树Prim算法Kruskal算法Prim算法算法描述矩阵描述具体例子代码思路代码实现Kruskal算法算法描述代码设计并查集代码实现一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。(转载 2017-12-30 22:02:32 · 179 阅读 · 0 评论 -
线性表、链表的区别
存储类别顺序存储结构单链表存储分配方式用一段连续的存储单元依次存储线性表的数据元素采用链式存储结构,用一组任意的存储单元存放线性表的元素时间性能查找O(1)、插入和删除O(n)查找O(n)、插入和删除O(1)空间性能需要预分配存储空间,分大了浪费,小了容易发生上溢不需要分配存储空间,转载 2017-10-14 21:47:59 · 9774 阅读 · 1 评论 -
数据结构 copy,copy_backward和copy_if区别
copy,copy_backward和copy_if是几种常用的泛型算法,这三个函数包含在头文件#include中,下面县给出三种函数的原型,再说明三者的区别。 函数原型 copy(b,e,b1),其中b,e,b1都表示迭代器类型; copy_backward(b,e,b1),其中b,e,b1都表示迭代器; co转载 2017-10-14 22:00:09 · 545 阅读 · 0 评论 -
c++迭代器介绍
迭代器的简介 (1):迭代器类似于指针类型,它也提供了对对象的间接访问。 (2):指针是c语言中就有的东西,迭代器是c++中才有的,指针用起来灵活高效,迭代器功能更丰富些。 (3):迭代器提供一个对容器对象或者string对象的访问的方法,并且定义了容器范围。使用迭代器 迭代器和指针不一样,容器和string有迭代器类型同时拥有返回迭代器的成员。比如,容器都有的成员begi转载 2017-10-14 22:17:45 · 311 阅读 · 0 评论 -
用empty()来代替检查size()是否为空
对于任意容器c,if (c.size() == 0)...12本质上等价于if (c.empty())...1这就是例子。你可能会奇怪为什么一个构造会比另一个好,特别是事实上empty()的典型实现是一个返回size()是否返回0的内联函数。你应该首选empty()的构造,而且理由很简单:对于所有的标准容器,empty()是一个常数时间的操作,但对于一些list实转载 2017-10-15 12:11:38 · 237 阅读 · 0 评论 -
C++中布尔类型
1.当表达式需要一个算术值时 布尔对象(如 found)和布尔文字都被隐式地提升成 int(正 如下面的例子) false 变成 0 而 true变成 1 例如 bool found = false; int occurrence_count = 0; while ( /* 条件省略 */ ) { found = look_for( /* 内容转载 2017-11-03 21:36:23 · 1716 阅读 · 0 评论 -
图的遍历 深度优先搜索 广度优先搜索
1. 深度优先搜索介绍图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶转载 2017-11-20 20:45:10 · 400 阅读 · 0 评论 -
图的遍历
https://www.cnblogs.com/skywang12345/p/3711483.html转载 2017-11-20 20:49:15 · 194 阅读 · 0 评论 -
C++小练习—找零钱问题
采用贪心算法解决找零钱问题,如果需要找零57.8元,零钱数分别为(10元、5元、1元、5角、2角、1角)1、采用元为单位编写程序如下所示:[cpp] view plain copy#include using namespace std; int main() { float tot转载 2017-12-11 21:21:38 · 5695 阅读 · 0 评论 -
二叉树的前序遍历、中序遍历和后序遍历及其算法
二叉树的基本的遍历规则有三种:前序遍历,中序遍历和后序遍历。对于每一种遍历,树中每个结点都要经过3次。前序遍历在第一次遇到结点时立即访问,中序遍历第二次遇到结点时访问,后序遍历则到第三次遇到结点时才访问。以一棵二叉树说明其三种遍历顺序:二叉树的前序遍历前序遍历:- + a * b – c d / e f中序遍历:a + b * c – d – e / f转载 2017-12-23 22:46:18 · 759 阅读 · 0 评论 -
博客
https://github.com/61mon/61mon.com-blog-articles转载 2017-11-27 21:26:04 · 159 阅读 · 0 评论 -
堆排序 Heap Sort
堆排序是一种选择排序,其时间复杂度为O(nlogn)。堆的定义 n个元素的序列{k1,k2,…,kn}当且仅当满足下列关系之一时,称之为堆。 情形1:ki 2i 且ki 2i+1 (最小化堆或小顶堆) 情形2:ki >= k2i 且ki >= k2i+1 (最大化堆或大顶堆) 其中i=1,2,…,n/2向下取整;转载 2017-12-30 20:50:40 · 162 阅读 · 0 评论 -
二叉树前序,中序,后序遍历详解
只要是搞计算机的,对数据结构中二叉树遍历都不陌生,但是如果用到的机会不多那么就会慢慢淡忘,温故而之新才是最好的学习方式,现在就重新温习一下这方面的知识。首先我想先改变这几个遍历的名字(前根序遍历,中根序遍历,后根序遍历);前中后本来就是相对于根结点来说的,少一个字会产生很多不必要的误解。 1. 前根序遍历:先遍历根结点,然后遍历左子树,最后遍历右子树。AB转载 2017-12-30 20:56:57 · 212 阅读 · 0 评论 -
秒懂插入排序与选择排序
插入排序原理:它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序核心:假设第一个元素排好,之后的元素对排好的部分从后向前比较并逐一移动。插入排序实现:[cpp] view plain copyvoid insertion_sort(int a[], int n)转载 2017-12-30 21:37:15 · 269 阅读 · 0 评论 -
希尔排序
希尔(Shell)排序又称为缩小增量排序,它是一种插入排序。它是直接插入排序算法的一种威力加强版。该方法因DL.Shell于1959年提出而得名。希尔排序的基本思想是:把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序。随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序。我们来通过演示图,更转载 2017-12-30 21:49:27 · 178 阅读 · 0 评论 -
字典树(讲解+模版)
又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。 字典树与字典很相似,当你要查一个单词是不是在字典树中,首先看单词的第一个字母是不是在字典的第一层,如果不在,说明字典树里没有该...转载 2018-03-02 08:55:07 · 187 阅读 · 0 评论