
算法
文章平均质量分 75
nullcanon
健忘症患者的云端笔记
展开
-
计数排序-Counting Sort
计数排序的时间复杂度为O(n+k),n为待排数组元素的个数,k为待排数组最大元素值加1。对于空间来说,需要两个n大小的数组,一个k大小的数组。 为了保证计数排序的**稳定性**,上面是从后往前处理待排数组arr的。 所谓稳定性,就是指如果待排数组arr中,有两个数 a[i] 和 a[j]相等,并且i<j,z在排好序以后,a[i] 仍然在 a[j] 之前。原创 2017-09-12 22:29:44 · 283 阅读 · 0 评论 -
字符串匹配之暴力匹配
字符串匹配之暴力匹配 字符串匹配就是在一个字符串集里面找到某个模式串出现的所有位置。 例如,找出模式P=abaaP=abaaP=abaa在文本T=abcabaabcabacT=abcabaabcabacT=abcabaabcabac中的位置,用mmm和nnn分别表示PPP和TTT的长度,SSS表示当字符串匹配时的有效偏移。 暴力匹配的方法是通过循环,找出所有的有效偏移SSS,该循环对每一...原创 2018-04-05 16:48:29 · 3071 阅读 · 0 评论 -
字符串匹配之KMP算法
字符串匹配之KMP算法 对于字符串匹配算法中,前面介绍的算法在字符串匹配中都会有重复比较的情况,那么对于已经比较过的子串,我们是否可以用某种方法把它保存起来,等到下次要比较的时候直接跳过已经比较过的字符串呢? 下面介绍一种由Knuth、MorrisKnuth、MorrisKnuth、Morris和PrattPrattPratt三个大佬设计的字符串匹配算法: 例如找出模式串P=ababacaP...原创 2018-04-09 17:53:57 · 221 阅读 · 0 评论 -
字符串匹配之有限自动机
字符串匹配之有限自动机 先来看什么是有限自动机? 首先,有限状态机是一个判定的机器,所谓判定的机器就是你给它输入一个模式,会的到一个YES或者NOYES或者NOYES或者NO的结果,比如要判断1+11+11+1的结果: 有限状态机就是构建出一个满足某个特定模式的判断系统 例如,对于010111100101011110010101111001串二进制数构建一个判断111的个数是否为偶数个...原创 2018-04-08 23:56:55 · 3487 阅读 · 2 评论 -
字符串匹配之Rabin-Karp算法
字符串匹配之Rabin-Karp算法 上一篇讲解了暴力匹配,暴力匹配最大的问题就是太慢了,而且太暴力了,不符合社会主义价值观。 因此,这里来讲解一个相对快一点的字符串匹配算法。 Rabin−KarpRabin−KarpRabin-Karp算法是RabinRabinRabin和KarpKarpKarp两位大佬在198719871987年提出的。 为了能宏观的理解Rabin−KarpRabin...原创 2018-04-08 13:24:17 · 688 阅读 · 0 评论 -
冒泡排序及优化
前面写完了那么多种排序算法,当然不能忘记我们排序的启蒙老师-冒泡排序,常规的冒泡排序最坏情况是O(n^2),看起来贼菜,但经过层层优化的冒泡排序还是很牛批的,下面主要介绍冒泡排序和其优化的过程,感受一下什么叫做鸟枪换炮。先贴出冒泡排序的代码:void BubbleSort(int *arr,int sz) { int i,j; for(i=0; i<sz-1; i++) {原创 2017-10-01 13:08:45 · 222 阅读 · 0 评论 -
堆排序-Heap Sort
什么是堆?堆一棵二叉树,其子结点的值通常都小(大)于父结点。根结点是树中的最大(小)结点,其中,子结点比父结点小的堆称为最大值堆,相反的被称为最小值堆。对与一个堆,我们可以用层序遍历的方式将它连续储存在一个数组中。我们发现了一个规律:堆的左孩子和右孩子在数组中对应的下标分别为2i+1和2i+2。堆排序我们可以利用堆的特点来完成排序,对于一个最大值堆,其根结点总是最大的,把根结点拿出来放到数组最后一个原创 2017-09-22 11:29:31 · 255 阅读 · 0 评论 -
选择排序-Select Sort
选择排序是一种简单的排序方法,其时间复杂度为O(n^2),下面对其做简单介绍。以数组arr[] = {8,3,4,6,9,7,2,1}为例,对其进行选择排序的过程如下: 代码:#include<stdio.h>void SelectSort(int *arr,int sz) { int mark,i,j; for(i=0; i<sz-1; i++) { ma原创 2017-09-28 22:39:22 · 246 阅读 · 0 评论 -
归并排序-Merge Sort
归并排序是另一种运用分治排序的算法,用分治思想来具体分析排序过程 分:将数组等分为左右两部分。 治:分别在左右两部分递归使用归并排序。 合:将分开的两部分合并成一个有序数组。 下面图片是数组arr[] = {9,5,7,2,8,1};归并排序的具体分解步骤: 具体的分解动作,分别以left和right标记一个数组的起始和末尾位置,mid标记数组中间的位置,即初次left = 0, right = s原创 2017-09-09 19:29:53 · 395 阅读 · 0 评论 -
快速排序算法-Quick Sort
算法思想快速排序使用了分治思想,即: 分解:数组以一个随机元素K为分割数,被划分为两个部分,左边部分的每一个元素都小于等于K,右边部分的每一个元素都大于等于K。 解决:通过递归调用函数,对左边和右边进行排序。 合并:因为在原空间进行排序,所以不需要合并。 具体来分析数组分解的动作: 以数组arr[] = {6,4,7,2,8};为例,用i和j标记数组的起始位置和末尾位置,即i=0,j=4。选6为分原创 2017-09-07 22:52:59 · 257 阅读 · 0 评论 -
希尔排序-Shell Sort
希尔排序又称”缩小增量排序”,我们知道插入排序,插入排序的时间复杂度为O(n^2)。对于插入排序,当n值较小时,效率会提升;当待排序列为"基本有序1"时,效率会提高,接近于O(n)。希尔排序正是对插入排序在这两点上做出优化的一种排序方法。 它的基本思想就是,将整个待排序列分割成若干个小的序列(由一个增量相隔)将其分别进行插入排序,然后缩小增量再次分割排序,直到整个元素基本有序时,在对全体进行排原创 2017-09-15 14:18:43 · 263 阅读 · 0 评论 -
插入排序-Insertion sort
对于少量元素,它是一个有效的算法 我们将一个数组一切两半,分为有序组和待插入组,从待插入组逐次拿出元素,与放入有序组的合适位置,就这样,每插入一个元素,有序组元素增加,待插入组元素减少,直到待插入组元素减少为0。 当然,插入过程中元素需要移动。我们将3代表为待插入组的第一个元素,具体执行流程为下: 1. 将3临时保存到temp中 2. 从后到前遍历有序组 3. 如果这个数比temp大,那原创 2017-08-07 13:56:23 · 325 阅读 · 0 评论 -
桶排序-Bucket Sort
桶排序 链表实现原创 2017-09-14 17:09:55 · 351 阅读 · 0 评论 -
基数排序-Radix Sort
其实 ,只要理解了计数排序 ,对于基数排序也就驾轻就熟,因为基数排序就是运用计数排序的思想从待排元素的最低位开始不断调整,直到调整完最高位的数值。基数排序的时间复杂度是取决于它使用的稳定排序算法,在这里使用的是计数排序,所以这里它的时间复杂度是计数排序的n倍,其中n是位数的个数。原创 2017-09-13 21:10:46 · 199 阅读 · 0 评论 -
牛顿法求解一元函数
牛顿法求解一元函数 对于一个简单的一元方程我们可以通过代数运算来求解,但是对于一个非线性的复杂一元函数例如−2x5−8x2+sin(x∗x)−2x=0−2x5−8x2+sin(x∗x)−2x=0-2x^5 - 8x^2 + sin(x*x) - 2^x=0这样的方程,想要通过人力计算就很难办到。 下面介绍利用牛顿法来构建的一个一元函数方程求解的程序。 牛顿法 当方程没有求根公式或者求根...原创 2018-07-30 11:46:03 · 2403 阅读 · 0 评论