
算法
文章平均质量分 78
程序员的暴击
业精于勤,荒于嬉;行成于思,毁于随。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
算法之滑动窗口算法
滑动窗口算法基本原理与实践滑动窗口协议(Sliding Window Protocol),该协议是 TCP协议 的一种应用,用于网络数据传输时的流量控制,以避免拥塞的发生。该协议允许发送方在停止并等待确认前发送多个数据分组。由于发送方不必每发一个分组就停下来等待确认。因此该协议可以加速数据的传输,提高网络吞吐量。滑动窗口算法其实和这个是一样的,只是用的地方场景不一样,可以根据需要调整窗口的大小,有时也可以是固定窗口大小。滑动窗口算法(Sliding Window Algorithm)Sliding转载 2021-06-02 11:38:44 · 1498 阅读 · 0 评论 -
算法之弗洛伊德(Floyd)算法
简介:Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。Floyd算法用于多源最短路径的求解,算出来的是所有的节点到其余各节点之间的最短距离。与迪杰斯特拉算法区别:迪杰斯特拉算法通过选定的被访问顶点,求出从出发访问顶点到其他顶点的最短路径; 弗洛伊德算法中每一个顶点都是出发访问点,所以需要将每一个顶点看做被访问顶点,求出从每一个顶点到原创 2021-06-02 10:32:28 · 4464 阅读 · 0 评论 -
算法之迪杰斯特拉算法
迪杰斯特拉(Dijkstra)算法是典型求单源(一个顶点到一个顶点)最短路径算法,用于计算一个结点到其他结点的最短路径。 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。迪杰斯特拉算法思想设G=(V,E)为一个带全有向图,把图中顶点集合V分成两组。第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将所到达最短路径的顶点加入到集合S中,直到全部顶点都加入到S中)。第二组为其余未确定最短路径的顶点集合(用U表示,U=V-S,U原创 2021-06-01 18:44:42 · 5213 阅读 · 0 评论 -
算法之普利姆(Prim)算法
普利姆(Prim)算法 和克鲁斯卡尔算法一样都是求最小生成树的算法所谓的最小生成树:给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树特点:1 N个顶点,一定有N-1条边2 包含全部顶点3 N-1条边都在图中4 最小生成树不是唯一的5 最小生成树边的权值总和是唯一的普利姆(Prim)算法求最小生成树,也就是在包含 n 个顶点的连通图中,找出只有(n-1)条边包含所有 n 个顶点的连通子图流程1 设G=(V,E)是连通网,T=(U,D)是最原创 2021-06-01 16:46:52 · 1173 阅读 · 0 评论 -
算法之克鲁斯卡尔(Kruskal)算法
克鲁斯卡尔(Kruskal)算法克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法。基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路具体做法:首先构造一个只含n个顶点的森林,然后依权值从小到大从连通网中选择边加入到森林中,并使森林中不产生回路,直至森林变成一棵树为止克鲁斯卡尔算法在所有连接森林的两个不同树的边里面,寻找权值最小的边将最小的边加入一个不相交的集合来进行维护,每次加入时判断该边的起始顶点与结束顶点是否属于同一个树,即是否使森林产生回路,如果原创 2021-06-01 11:34:56 · 2608 阅读 · 0 评论 -
算法之Sunday算法
Sunday算法由Daniel M.Sunday在1990年提出,它的思想跟BM算法很相似:Sunday算法 算法是比BM 和KBM更高效的算法,它不关注好后缀与坏字符,只关注文本串中参加匹配的最末位字符的下一位字符的情况Sunday算法是从前往后匹配,在匹配失败时关注的是文本串中参加匹配的最末位字符的下一位字符。1 如果该字符没有在模式串中出现则直接跳过,即移动位数 = 匹配串长度 + 1;2 否则,其移动位数 = 模式串中最右端的该字符到末尾的距离+11 2 可以直接概括为模式串.leng原创 2021-05-31 21:35:05 · 647 阅读 · 0 评论 -
算法之BM算法
1977年,德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授发明了一种新的字符串匹配算法:Boyer-Moore算法,简称BM算法。该算法从模式串的尾部开始匹配,且拥有在最坏情况下O(N)的时间复杂度。在实践中,比KMP算法的实际效能高。 "文本串"与"模式串"头部对齐,从尾部开始比较.BM算法大量使用在文本编辑器中在BM算法的思想中,在模式串与主串匹配是从后往前开始匹配在匹配的过程中,当遇到不可匹配的字符的时候,可以将模式串往后多滑动几位,跳过那些肯定不会匹配的情况原创 2021-05-31 20:51:56 · 1682 阅读 · 0 评论 -
KMP算法详解
ZzUuOo666 作者:July 时间:最初写于2011年12月,2014年7月21日晚10点 全部删除重写成此文,随后的半个多月不断反复改进。后收录于新书《编程之法:面试和算法心得》第4.4节中。 1. 引言 本KMP原文最初写于2年多前的2011年12月,因当时初次接触KMP,思路混乱导致写也写得混乱。所以一直想找机会重新写下...转载 2021-05-31 18:46:50 · 198 阅读 · 0 评论 -
算法之贪心算法
贪心算法贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果贪心策略 : 一般来说,适用于贪心策略求解的问题具有以下特点:贪心选择性质和最优子结构性质。 ① 贪心选择性质:可通过局部的贪心选择来达到问题的全局最优解。运用贪心策略解题,一般来说需要一步步的进行多次的贪心选择。在经过一次贪心选择之后,原问题将变成一个相似的,原创 2021-05-31 18:32:14 · 616 阅读 · 0 评论 -
动态规划算法
动态规划算法1 动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法2 动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。3 与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。 ( 即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解 )4 动态规划可以通过填表的方式来逐步推进,得到最优原创 2021-05-31 16:30:25 · 922 阅读 · 0 评论 -
回溯法解决马踏棋盘问题(骑士周游问题)
回溯法基本思想:对一个包括有很多结点,每个结点有若干个搜索分支的问题,把原问题分解为对若干个子问题求解的算法。当搜索到某个结点、发现无法再继续搜索下去时,就让搜索过程回溯(即退回)到该结点的前一结点,继续搜索这个结点的其他尚未搜索过的分支;如果发现这个结点也无法再继续搜索下去时,就让搜索过程回溯到这个结点的前一结点继续这样的搜索过程;这样的搜索过程一直进行到搜索到问题的解或搜索完了全部可搜索分支没有解存在为止。回溯的处理思想,有点类似枚举搜索。我们枚举所有的解,找到满足期望的解。为了有规律地原创 2021-05-30 19:57:34 · 2184 阅读 · 1 评论 -
算法之分治算法
分治算法( divide and conquer )的核心思想其实就是四个字,分而治之 ,也就是将原问题划分成 n 个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解。这个定义看起来有点类似递归的定义。关于分治和递归的区别,我们在排序(下)的时候讲过,分治算法是一种处理问题的思想,递归是一种编程技巧。实际上,分治算法一般都比较适合用递归来实现。分治算法的递归实现中,每一层递归都会涉及这样三个操作:分解:将原问题分解成一系列子问题;解决:递归地求解各个原创 2021-05-30 18:19:48 · 840 阅读 · 0 评论 -
查找算法--顺序查找,分块查找,折半查找,插值查找和斐波那契查找
顺序查找顺序查找也称为线形查找,属于无序查找算法。从 线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值 相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字与查找值的结点,表示查找失败。其时间复杂度为O(n) 属于最简单的一种查找优点:简单,对表的结构无任何要求缺点 : 查找效率低,因此,当n较大时不宜采用顺序查找。顺序查找适合于存储结构为顺序存储或链接存储的线性表。 public static int seqSearch(int[] arr,int searchValu原创 2021-03-25 11:22:55 · 795 阅读 · 0 评论 -
经典排序算法之基数排序
基数排序(RadixSort)是在桶排序的基础上发展而来的,两种排序都是分配排序的高级实现。分配排序(DistributiveSort)的基本思想:排序过程无须比较关键字,而是通过“分配”和“收集”过程来实现排序。它们的时间复杂度可达到线性阶:O(n)。都是典型的空间换时间的排序算法基数排序原理第一趟桶排序将数字的个位数分配到桶子里面去,然后回收起来,此时数组元素的所有个位数都已经排好顺序了第二趟桶排序将数字的十位数分别分配到桶子里面去,然后回收起来,此时数组元素的所有个位数和十位数都已经排好顺序原创 2021-03-22 17:05:50 · 146 阅读 · 0 评论 -
经典排序算法之计数排序
计数排序(counting sort)就是一种牺牲内存空间来换取低时间复杂度的排序算法,是桶排序的一种扩展核心思想:对于一个输入数组中的任意一个元素x, 知道了这个数组中比x小的元素的个数,那么我们就可以直接把x放到(x+1)的位置上。这就是计数排序的基本思想。比如说有5个元素小于x,那就把x放到第六个位置上。当有元素相等时,需要略作修改,因为不能把他们都放在同一个位置上。基于这个思想,计数排序的一个主要问题就是如何统计数组中元素的个数。再加上输入数组中的元素都是0-k区间的一个整数这个条件,那么就原创 2021-03-22 16:22:31 · 186 阅读 · 0 评论 -
经典排序算法之桶排序
桶排序每个桶存储一定范围的元素,通过映射函数,将待排序数组中的元素映射到各个对应的桶中,对每个桶中的元素进行排序,最后将非空桶中的元素逐个放入原序列中其核心是将将数组分到有限数量的桶子里。每个桶子再分别排序。桶排序过程中存在三个关键环节:元素值域的划分,也就是元素到桶的映射规则。映射规则需要根据待排序集合的元素分布特性进行选择,若规则设计的过于模糊、宽泛,则可能导致待排序集合中所有元素全部映射到一个桶上,则桶排序向比较性质排序算法演变。若映射规则设计的过于具体、严苛,则可能导致待排序集合中每一个元原创 2021-03-22 13:40:01 · 161 阅读 · 0 评论 -
经典排序算法之归并排序
归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。归并排序是一种高效的排序算法,在任何情况下时间复杂度都nlogn 但是,它需要用额外的内存空间来暂时储存归并过程中的元素,因此我们可以认为归并排序是以牺牲一部分内存空间为代价来获得时间的高效性。归并排序基本思想:归并排序是用分治思想,分原创 2021-03-22 12:06:46 · 225 阅读 · 0 评论 -
经典排序算法之快速排序及其优化
快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列,其时间复杂度为线性对数阶O(n log n)快速排序实现方法比较多,大致可以分为:基准值+左右指针交换法,基准值+左右指针填坑法,基准值+单指针法;非递归栈法基准值+左右指针交换法此种方法是最常见的方法,定义左指针和右指针分别指数组向头部和原创 2021-03-21 12:08:13 · 266 阅读 · 0 评论 -
经典排序算法之希尔排序及其优化与改进
希尔排序是 基本插入排序 的升级优化版。一个叫希尔的人于1959年提出的一种排序算法。本值也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。希尔排序基本思想希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止大部分场景中,增量是可以提前定义好的,也可以动态生成。一般使用数组的长度除以2作为首次间隔增量,然后在除以2,直到间隔缩小的为1位置。核心:确定增量划原创 2021-03-15 14:42:40 · 652 阅读 · 1 评论 -
经典排序算法之直接插入排序及其优化
直接插入排序基本思想:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素进行比较,将它插入到有序表中的适当位置,使之成为新的有序表即:每一步将一个待排序的数据插入到前面已经排好序的有序序列中,直到插完所有元素为止图解: 1 将数组分为有序和无序两部分。选取数组的第一个元素作为有序列表的基准值2 从下一个元素即第i+1个元素开始遍历剩下数组元素,并把当前遍历的元素与基准值原创 2021-03-15 10:46:12 · 250 阅读 · 1 评论 -
经典排序算法之选择排序及其改进
选择排序(Select Sort) 是直观的排序,通过确定一个最大或最小值,再从待排序的的数中找出最大或最小的交换到对应位置。再选择次之。双重循环时间复杂度为 O(n^2)第一次从arr[0]~ arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[1]~ arr[n-1]中选取最小值,与arr[1]交换,第三次从arr[2]~ arr[n-1]中选取最小值,与arr[2]交换,…,第i次从arr[i-1]~ arr[n-1]中选取最小值,与arr[i-1]交换,…, 第n-1次从arr[n-原创 2021-03-14 20:28:53 · 377 阅读 · 3 评论 -
经典排序算法之冒泡排序及优化
冒泡排序(Bubble Sorting):通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒思路:依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。List item 第一次比较:首先比较第一和第二个数,将小数放在前面,将大数放在后面。比较第2和第3个数,将小数 放在前面,大数放在后面。…如此继续,知道比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成原创 2021-03-12 10:18:53 · 634 阅读 · 0 评论 -
八皇后问题解法大全及编写八皇后小游戏
引入八皇后问题:是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848 年提出:在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即: 任意两个皇后都不能处于同一行 、 同一列或同一斜线上,问有多少种摆法(92)。根据排列组合:C64 取8,一共有4.426×10的9次方种方案不难发现,每一行只能放一个皇后,所以8!=40320种方案然后在40320种方案中,挑选符合题意的方案!八皇后地图根据条件我们可知每行每列最多都只能有一个皇后,这样可以在一定原创 2021-03-01 21:26:11 · 6129 阅读 · 10 评论 -
递归回溯找迷宫出口
递归:递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。递归调用规则:当程序执行一个次递归方法时,就会开辟一个独立的空间(栈)每个空间的数据(局部变量)是独立的每次递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflowError一次递归完成如果有返回值就会返回给其调用者回溯法的基本思想:对一个包括有很多结点,每个结点有若干个搜索分支的问题,把原问题分解为对若干个子问题求解的算法。当搜索到某个结点、发现无法再继续原创 2021-02-26 20:07:00 · 443 阅读 · 1 评论