![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Algorithm
文章平均质量分 78
sysu_arui
这个作者很懒,什么都没留下…
展开
-
朴素的字符串匹配算法
一个字符串是一个定义在有限字母表∑上的字符序列。例如,ABCDABC是字母表∑ = {A,BC,D}上的一个字符串。字符串匹配问题就是在一个大的字符串T中搜索某个字符串P的所有出现位置。其中,T称为文本(或称主串,模式串),P称为模式(或称子串),T和P都定义在同一个字母表∑上。设文本为长度为n,用字符数组T[1..n]表示,模式串长度为m,m,用字符数组P[1..m] 表示。如果T[s+原创 2012-08-10 16:57:51 · 1327 阅读 · 0 评论 -
0-1背包问题的动态规划求解
思路:设value_get[i][j]为把前i个物品装入容量为j的背包所能获得的最大价值需考虑能否装入物品i,以及是否装入物品i,递归式为:value_get[i][j] = max{ value_get[i-1][j], value_get[i-1][ j-weight[i] ] + value[i] } c语言代码如下:/*********************原创 2014-02-26 15:18:56 · 705 阅读 · 0 评论 -
冒泡排序(Bubble Sort)
维基百科:http://zh.wikipedia.org/wiki/冒泡排序算法思想:不断的交换相邻的两个反序元素,使最小元素“上浮”或使最大元素“下沉”;每一趟“冒泡”都会确定一个最大的元素或最小的元素,同选择排序类似,算法总共只需进行n-1趟。将一个数组竖着放,低地址在上面,高地址在下面,所谓“上浮”就是较小的元素不断向低地址靠近,所谓“下沉”就是较大的元素不断向高地址靠近,这原创 2012-09-22 14:18:38 · 629 阅读 · 0 评论 -
插入排序(Insertion Sort)
维基百科:http://zh.wikipedia.org/wiki/插入排序算法思想:若数组A[n]的前n-1个数已经有序,我们只需把第n个元素插入到适当的位置即可。易分析得算法的时间复杂度为Ο(n^2)具体描述:从第一个元素开始,该元素可以认为已经被排序取出下一个元素,在已经排序的元素序列中从后向前扫描如果该元素(已排序)大于新元素,将该元素移到下一位置重复步骤3,直到找到已原创 2012-09-22 12:24:52 · 829 阅读 · 0 评论 -
选择排序(Selection Sort)
维基百科:http://zh.wikipedia.org/wiki/选择排序算法思想:给定一个待排序的数组A[1..n],以升序为例,我们先找出其中最小的元素,和A[1]交换;然后找出次小的元素和A[2]交换,依次进行下去,直到找到第n-1小的元素,置于A[n-1]处,最后一个元素必然是最大的,因而循环只用执行n-1次。选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上原创 2012-09-22 11:50:01 · 498 阅读 · 0 评论 -
二分查找(Binary Search)
一、顺序查找(linear search)问题描述:在一个给定的序列A[]中查找指定元素v,若查找成功则返回元素在数组中的下标,否则返回-1。C++实现://简单线性查找 int linearSearch(int *a, int n, int key){ for(int i=0; i<n; i++) { if(a[i] == key)原创 2012-09-22 11:18:01 · 1030 阅读 · 0 评论 -
快速排序(Quick Sort)
维基百科:http://zh.wikipedia.org/wiki/快速排序算法思想:快速排序也是分治法的一个应用,在一个给定的序列中,选取一个主元pivot,通过“分区操作”partition把一个序列分成两个子序列,一个子序列的所有元素小于等于主元,另一个子序列中的所有元素大于等于主元,然后递归的对两个子序列进行快速排序。快速排序最主要的部分就是partitiion函数,由于parti原创 2012-09-19 17:15:15 · 766 阅读 · 0 评论 -
归并排序(Merge Sort)
归并排序维基百科:http://zh.wikipedia.org/wiki/归并排序归并排序(Merge Sort,又称合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。1、递归算法算法思想:原创 2012-09-17 19:41:31 · 702 阅读 · 0 评论 -
各种排序算法总结
一、常见的排序算法1、插入排序:http://blog.csdn.net/sysu_arui/article/details/80069622、冒泡排序:http://blog.csdn.net/sysu_arui/article/details/80071903、选择排序:http://blog.csdn.net/sysu_arui/article/details/8006909原创 2012-09-17 16:33:04 · 352 阅读 · 0 评论 -
希尔排序(Shell Sort)
维基百科:http://zh.wikipedia.org/wiki/希尔排序希尔排序,也称递减增量排序算法,是插入排序的一种高速而稳定的改进版本。希尔排序是基于插入排序的以下两点性质而提出改进方法的:插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位步长的选择是希尔排序的重要部分。只要原创 2012-09-26 21:54:43 · 784 阅读 · 0 评论 -
堆排序(Heap Sort)
维基百科:http://zh.wikipedia.org/wiki/堆排序1、基本知识二叉堆一般用数组来表示,我们可以把它视为一颗完全二叉树。数据结构中学习树这一章节时,我们知道完全二叉树可以用数组来存储。堆的定义:(1)大根堆:父节点的值大于等于孩子结点的值(2)小根堆:父节点的值小于等于孩子结点的值父节点和孩子结点下标的计算(1)假设用数组A[1..n]来存储完原创 2012-09-26 20:44:06 · 610 阅读 · 0 评论 -
Rabin-Karp算法 (拉宾-卡普)
Rabin-karp算法是朴素字符串匹配算法的一个特例。当字母表∑为d进制数时,即∑={0,1,2,…d-1}。如当d=10时字母表中的每个字符都是一个十进制数。我们在比较两个长度为m的子串时,可以把这两个子串当作整数进行比较,而不用逐个字符比较,从而在某种程度上减少算法时间。把一个由d进制数字组成的字符串转换成相应的十进制整数,这是大家曾经都写过的东西,一个可能的简单实现如下:int原创 2012-08-10 17:11:08 · 4939 阅读 · 0 评论 -
KMP算法
在朴素字符串匹配算法中,当匹配失败时,位移加一,也就是模式向后滑动一位,效率较低。我们能否在匹配失败时,利用已有的匹配信息(如当前文本的匹配位置,模式已经匹配的长度等)将模式向后滑动尽可能远的距离呢?受有限自动机字符串匹配算法启示,利用前缀后缀原理,假设当前字符匹配长度为q(P[1..q]),在匹配P[q+1]时失败了,这时只要找到一个满足Pk为Pq的真后缀的最大k值,我们就可以把模式向后滑动原创 2012-08-10 17:44:00 · 739 阅读 · 0 评论 -
利用有限自动机进行字符串匹配
原理我简单说两句,详细原理大家请参考《算法导论》第32章P563-P567,至于自动机原理,请参考其他编译原理书籍。说明:Pk=P[1..k],表示模式P的前缀,也就是其前k个字符。k=0时,P0表示空串,空串为任何串(包括空串)的前缀和后缀。初始状态下q=0,Pq=ε(空串,也就是匹配长度为0),这时给定字母表中的一个输入,状态就可能发生转换,比如说给定模式P的第一个字符,就会转移到状态原创 2012-08-10 17:24:42 · 4151 阅读 · 2 评论 -
子数组和最大值,以及不相交子数组其和之差的最大值问题
最大子数组和问题,这个大家都知道,求一个数组中和最大的连续子数组,编程珠玑上有讲过例如 1 2 3 4 -> 10 -1 -2 -3 -4 -> -1-1 2 3 -2 -> 5-2 3-1 4 -1 ->6有复杂度为O(n^3),O(n^2), O(nlgn)的代码,也有复杂度为O(n)的动态规划代码#include #include #define N 10原创 2014-03-02 21:39:25 · 1712 阅读 · 0 评论