数据结构与算法
简之
这个作者很懒,什么都没留下…
展开
-
排序【0】 排序算法简介
任何依赖成对元素比较的通用排序算法都具备Ω(nlogn)时间复杂度。概述 排序的分类:内部排序和外部排序 内部排序:数据记录在内存中进行排序 外部排序:因排序的数据量大,需要内存和外存结合使用进行排序这里总结的八大排序是属于内部排序: 当n比较大的时候,应采用时间复杂度为nlog2n的排序算法:快速排序、堆排序或归并排序。 其中,快速排序是目前基于比较的内部排序中被认为最好的...原创 2018-09-11 22:46:08 · 285 阅读 · 0 评论 -
数据结构:回溯法与动态规划算法实例分析
回溯法与动态规划1、回溯法1.1 适用场景回溯法很适合解决迷宫及其类似的问题,可以看成是暴力解法的升级版,它从解决问题每一步的所有可能选项里系统地选择出一个可行的解决方案。回溯法非常适合由多个步骤组成的问题,并且每个问题都有多个选项。当我们从一步选择了其中一个选项时,就进入下一步,然后又面临新的选项。我们就这样重复选择,直至到达最终的状态(递归终止条件)。1.2 过程:用回溯法解决问题的...原创 2018-10-11 18:45:07 · 987 阅读 · 0 评论 -
串——KMP算法
串——KMP算法如果我们要去找一个单词在一篇文章(相当于一个大字符串)中的定位,这种子串的定位操作通常称做串的模式匹配,是串中最重要的操作之一。1、朴素模式匹配按照通常的思路,要在一个长的字符串中找到指定的子串,比较简单的想法是:从左到右一个个匹配,如果这个过程中有某个字符不匹配,就跳回去,将主串开始比较的位置向右移动一位,直到结束。演示如下:(1)从串的开头初始化比较:(2)比较i...原创 2018-09-26 15:06:39 · 2749 阅读 · 0 评论 -
图的遍历之深度优先搜索和广度优先搜索
转载出处:http://www.cnblogs.com/skywang12345/ 图的遍历之 深度优先搜索和广度优先搜索 本章会先对图的深度优先搜索和广度优先搜索进行介绍,然后再给出C/C++/Java的实现。目录 1. 深度优先搜索的图文介绍 1.1 深度优先搜索介绍 1.2 深度优先搜索图解 2. 广度优先搜索的图文介绍 2.1 广度优先搜索介绍 ...转载 2018-09-25 11:49:45 · 283 阅读 · 0 评论 -
最短路径—Dijkstra算法和Floyd算法
Dijkstra算法1、概述Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法。注意该算法要求图中不存在负权边。问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路...原创 2018-09-25 11:27:42 · 778 阅读 · 0 评论 -
图论——最小生成树
1、kruskal算法(1)概览Kruskal算法是一种用来寻找最小生成树的算法,用来解决同样问题的还有Prim算法和Boruvka算法等。三种算法都是贪婪算法的应用。和Boruvka算法不同的地方是,Kruskal算法在图中存在相同权值的边时也有效。(2)基本思路:先对边按权重从小到大排序,先选取权重最小的一条边,如果该边的两个节点均为不同的分量,则加入到最小生成树,否则计算下一条边,直...原创 2018-09-24 20:46:46 · 666 阅读 · 0 评论 -
排序【5.1】桶排序&&基数排序&&计数排序
1、桶排序(Bucket Sort)(1)基本思想桶排序的基本思想是将一个数据表分割成许多buckets,然后每个bucket各自排序,或用不同的排序算法,或者递归的使用bucket sort算法。也是典型的divide-and-conquer分而治之的策略。它是一个分布式的排序,介于MSD基数排序和LSD基数排序之间。(2)基本流程建立一堆buckets;遍历原始数组,并将数据放入到各...原创 2018-09-24 17:44:45 · 328 阅读 · 0 评论 -
排序【4.1】归并排序(MergeSort)
归并排序(Merge Sort)1、基本思想:将两个的有序数列合并成一个有序数列,我们称之为"归并"。归并排序(Merge Sort)就是利用归并思想对数列进行排序。根据具体的实现,归并排序包括"从上往下"和"从下往上"2种方式。(1)从下往上的归并排序:将待排序的数列分成若干个长度为1的子数列,然后将这些数列两两合并;得到若干个长度为2的有序数列,再将这些数列两两合并;得到若干个长度为4..原创 2018-09-24 12:46:52 · 808 阅读 · 0 评论 -
排序【3.1】交换排序(BubbleSort && QuickSort)
1、插入排序——冒泡排序(Bubble Sort)(1)基本思想:它是一种较简单的排序算法。它会遍历若干次要排序的数列,每次遍历时,它都会从前往后依次的比较相邻两个数的大小;如果前者比后者大,则交换它们的位置。这样,一次遍历之后,最大的元素就在数列的末尾! 采用相同的方法再次遍历时,第二大的元素就被排列在最大元素之前。重复此操作,直到整个数列都有序为止!(2)排序过程:以数列{20,40,...原创 2018-09-24 00:43:55 · 215 阅读 · 0 评论 -
排序【2.1】插入排序(InsertSort && ShellSort)
1、插入排序——直接插入排序(Straight Insertion Sort)(1)基本思想:像排序一手扑克牌。开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较。如图所示,左手上的牌总是排序好的,原来这些牌是在桌子上排堆中顶部的牌。基本思想:把n个待排序的元素看成为一...原创 2018-09-23 23:30:10 · 357 阅读 · 0 评论 -
排序【1.1】选择排序(SelectSort && HeapSort)
1、选择排序——简单选择排序(Simple Selection Sort)1.1 基本思想:它的基本思想是:首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置;接着,再从剩余未排序的元素中继续寻找最小(or最大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。1.2 排序过程:以数列{20,40,30,10,60,50}为例,演示它的选择排序过程:...原创 2018-09-23 21:43:29 · 193 阅读 · 0 评论 -
回溯算法
回溯算法思想: 回溯算法是深度优先策略的典型应用,回溯算法就是沿着一条路向下走,如果此路不同了,则回溯到上一个分岔路,再选另一条路走,一直这样递归下去,直到遍历所有路径。回溯算法是遍历算法的一种。...原创 2018-09-13 18:59:51 · 354 阅读 · 0 评论 -
分治算法
1、分治思想分治算法思想为分而治之(divide-and-conquer),各个击破, 就是先把一个问题若干个子问题,然后分别解决各个子问题。分治算法是递归的典型应用。分治算法的子问题具有如下的特点: 1) 子问题比原问题更容易解决 ; 2) 子问题的解可以合并为原问题的解。常见的利用分治算法思想的有快速排序以及归并排序等等。2、算法举例回文 回文就是从头到尾读与从尾到...原创 2018-09-13 17:43:49 · 189 阅读 · 0 评论 -
动态规划
动态规划(dynamic Programming)动态规划不像贪心算法,从名字上很难理解具体的算法思想,如果换个名字应该就好理解了,动态规划可以叫做有缓存的递归。大家应该知道,递归过程中产生了大量的重复计算,从而导致大量耗时,那如何避免这些不必要的重复计算呢? 那就是缓存缓存\color{#F00}{缓存},当第一次计算这些值的时候,把它们缓存起来,等到再次使用,直接把它们直接拿过来用,这样...原创 2018-09-13 17:11:06 · 880 阅读 · 0 评论 -
贪婪算法
贪婪算法: 在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择,贪心策略使用的前提是局部最优能导致全局最优。设计过程: 1、建立数学模型来描述问题; 2、把求解的问题分成若干个子问题; 3、对每一子问题求解,得到子问题的局部最优解; 4、把所有子问题的局部...原创 2018-09-13 12:35:01 · 1408 阅读 · 0 评论 -
穷举法解决0-1背包问题
穷举法是将所有的候选解按某种顺序进行逐一枚举和检验,并从中找出符合要求的候选解作为问题的解,是一种暴力解法,算法思路简单,但复杂度高,一般用于数据量小的情况。下面利用穷举法解决0-1背包问题:[0-1背包问题] 有一个背包,背包容量是M=150kg。有7个物品,物品不可以分割成任意大小。 要求:尽可能让装入背包中的物品总价值最大,但不能超过总容量。 物品 A B ...原创 2018-09-13 12:12:13 · 8343 阅读 · 3 评论 -
关于二叉树的相关题目
\qquad二叉树在数据结构中具有十分重要的作用,很多算法题都使用到树的思想。将复杂的算法题转化为简单子问题,并用树的形式表示,可以直观理解划分的过程,有利于分析和写出算法程序。比如:对于递归问题,就可以转化成树的形式,将树的叶节点作为终止条件,将树的生成过程作为迭代公式,根据题目要求使用先序、中序、后序遍历,下面总结有关二叉树的相关题目,二叉树的题目普遍可以用递归和迭代的方式来解:首先写出二叉...原创 2018-11-20 22:11:11 · 342 阅读 · 0 评论