![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Algorithm Learn
文章平均质量分 56
fzzjoy
Code Change World
展开
-
广度优先搜索BFS
广度优先搜索是对图中的边进行系统性的探索来发现可以从源节点s到达的所有节点。该算法能够计算从源节点s到每个可达到的节点的距离(最少的边数),同时生成一棵"广度优先搜索树",该树以源节点s为根节点,包含所有可以从s到达的节点,对于每个从源节点s可以到达的节点v,在广度优先搜索树里从节点s到节点v的简单路径所对应的的就是图中从节点s到节点v的最短路径,即包含最少边数的路径。其核心思想就是用一个FIFO的队列维护遍历的节点,然后从队列中去取出节点依次往深层次中遍历。原创 2021-10-05 23:13:48 · 64 阅读 · 0 评论 -
TopK问题 - 随机选择算法
主要还是基于快排思想的二分查找 - 减治法:分治法分治法(Divide&Conquer),把一个大的问题,转化为若干个子问题(Divide),每个子问题“都”解决,大的问题便随之解决(Conquer)。这里的关键词是“都”。从伪代码里可以看到,快速排序递归时,先通过partition把数组分隔为两个部分,两个部分“都”要再次递归。分治法有一个特例,叫减治法。减治法减治法(Reduce&Conquer),把一个大的问题,转化为若干个子问题(Reduce),这些子问题中“只”解决原创 2021-08-22 19:13:27 · 314 阅读 · 0 评论 -
深度优先搜索DFS
文章目录深度优先搜索 DFS示例岛屿数量深度优先搜索 DFS只要可能,就在图中尽量“深入”,深度优先搜索总是对最近才发现的结点v的出发边进行探索,直到该结点的所有出发边都被发现为止。一旦节点v的所有出发边都被发现,搜索则“回溯”到v的前驱结点,来搜索该前驱结点的出发边。根据DFS所生成的深度优先森林,可以定义4种边的类型:树边:为深度优先森林种某一棵树的边。如果结点v是因为算法对边(u, v)的探索而首先被发现,则边(u, v)是一条树边后向边B:后向边(u, v)是将结点u连接到其所在深度原创 2021-05-14 11:50:23 · 146 阅读 · 0 评论 -
贪心算法
题目描述输入一个整形数组(可能有正数和负数),求数组中连续子数组(最少有一个元素)的最大和。要求时间复杂度为O(n)。输入描述:【重要】第一行为数组的长度N(N>=1)接下来N行,每行一个数,代表数组的N个元素输出描述:最大和的结果示例1输入81-2310-472-5输出18说明最大子数组为 3, 10, -4, 7, 2// 贪心算法// 保证每一次的输入都取出最大和#include <iostream>#incl..原创 2021-05-01 20:32:56 · 90 阅读 · 0 评论 -
动态规划
动态规划动态规划与分治方法相似,都是通过组合子问题的解来求解原问题;分治方法将问题划分为互不相交的子问题,递归的求解子问题,再将它们的解组合起来,求解原问题的解。与之相反,动态规划应用于子问题重叠的情况,即不同的子问题具有公共的子子问题,而这些公共的子子问题不需要反复递归求解,动态规划算法对每个子子问题只求解一次。带备忘的自上向下即将子子问题求解一次后,备份存储,便于下次需要时,直接使用即可。这种方法,提供了求解子问题的效率,避免了重复求解。空间复杂度为O(n), 用以备忘每个子问题的解。自底原创 2021-04-10 11:25:46 · 122 阅读 · 0 评论 -
图论算法
基本概念图是由顶点(vertex)和边(edge)的集合,每一条边就是一个点对(a, b),如果点对是有序的就是有向图。图的表示邻接表邻接矩阵连通性:如果在一个无向图中从每一个顶点到每个其他顶点都存在一条路径,则称该无向图是连通的。具有这种性质的有向图是强连通的,如果一个有向图不是强连通的,但是他的基础图,即去掉边的方向所形成的图,是连通的,则称该有向图是弱联通的,完全图是其每一对顶点间都存在一条边的图。DAG(有向无圈图): 如果一个有向图从任意顶点出发无法经过若干条边回到该点原创 2021-04-10 10:58:39 · 227 阅读 · 0 评论 -
筛法与素数
质数又指素数,是指只能整除1和它本身的数原创 2015-12-24 14:22:39 · 321 阅读 · 0 评论 -
KMP算法 - 快速求解next数组
在KMP算法中,最关键的就是求解next数组了。那么如何快速求解next数组呢?已知模式串:A B C D AB D D A其next数组:0 0 0 0 12 0 0 1那么是如何求证出来的呢?首先字符串从左至右遍历。第一个字符A的next数组对应元素为0,第一个字符A和第2个字符B比,不相等。B:0(表示字符B的next数组对应元素为0);第原创 2015-04-07 18:51:52 · 2923 阅读 · 0 评论 -
排序算法 - 基数排序(桶式排序)
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法原创 2015-04-03 19:42:44 · 1890 阅读 · 0 评论 -
排序算法 - 归并算法
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,时间复杂度最坏情形为O(NlogN)。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。(引自百度百科)这个算法的基本操作是合并两个已排序的表。基本的合并算法是取两个输入数组A和B,一原创 2015-05-06 16:02:55 · 774 阅读 · 0 评论 -
排序算法 - 快速排序
参考书籍:《数据结构与算法分析——C语言描述》快速排序是在实践中最快的已知排序算法,它的平均时间复杂度O(NlogN)。当然在最坏的情况下为O(N^2),但稍加努力就可以避免这种情形。像归并排序一样,快速排序也是一种分治的递归算法,可简单表示如下:将数组S排序的基本算法由下列简单的四步组成。1、数组元素至少大于或等于4个,否则直接利用插入排序完成。2、利用特定方法(三数原创 2015-05-09 14:03:32 · 859 阅读 · 0 评论 -
排序算法 - 希尔排序
希尔排序可谓是插入排序的升级版,它通过比较相距一定间隔的元素来工作;各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。由于这个原因,希尔排序也被称为缩小增量排序希尔排序使用一个序列h1,h2,h3,....,hk,叫做增量序列。只要h1=1,任何增量序列都是可行的。在使用增量hk的一趟排序之后,对于每一个i我们有A[i]例如:0 12 3 4 5 6原创 2015-04-27 15:28:59 · 554 阅读 · 0 评论 -
排序算法 - 冒泡法和选择排序法
冒泡法:基本思想:每次将相邻的两个数比较,将小的调到前头(即为升序排列)。首先比较第一和第二两个数,小的调到前头,再将比完后的第二个数与第三个数比较,同理小的调到前头。如此比较下去。假设有6个数参与排序,则第一趟两两之间共比较5次,第一趟比完之后最大的数已经到底。然后进行第二趟比较,两两之间共比较4次,将次大数调到倒数第二个数的位置。共需比较5趟,5趟比完之后呈现升序排列。总结规律:如果有原创 2015-03-31 16:51:26 · 806 阅读 · 0 评论 -
排序算法 - 插入排序
参考书籍《数据结构与算法分析——C语言描述》插入排序,简而言之,就是对于第i个数,前i-1个数是已排序的,第i个数则要从第i-1个数开始往前遍历,比较大小,比它大的往后移一位,比它小的则其后为要的插入的位置,则在此处插入即可。插入后会发现前i个数都变成已排序的了(此处应注意体会)。于是依此类推插入第i+1个数。此方法最坏的时间复杂度也会达到O(n^2)的。例如初始序列:34 8 6原创 2015-04-27 14:50:56 · 628 阅读 · 0 评论 -
排序算法 - 堆排序
关于堆排序的一些基本定义可参见我转载的另一篇博文。http://blog.csdn.net/u010275850/article/details/45311661其实在学习堆的时候细心的同学就可以发现,只要依次保存删除操作的数据,就可以得到一个有序的序列。堆排序也是利用了这样的思想。算法实现:/*根据最大堆实现的堆排序*/#include#define LeftChild(i)原创 2015-04-29 10:48:40 · 567 阅读 · 0 评论