摘要:一、简介文本信息可以说是迄今为止最主要的一种信息交换手段,而作为文本处理中的一个重要领域——字符串匹配,就是我们今天要说的话题。(原文还特意提及文本数据数量每18个月翻一番,以此论证算法必须要是高效的。不过我注意到摩尔定律也是18个月翻番,这正说明数据的增长是紧紧跟随处理速度的,因此越是使用高效的算法,将来待处理的数据就会越多。这也提示屏幕前的各位,代码不要写得太快了……)字符串匹配指的是从文本中找出给定字符串(称为模式)的一个或所有出现的位置。本文的算法一律输出全部的匹配位置。模式串在代码中用x[m]来表示,文本用y[n]来,而所有字符串都构造自一个有限集的字母表Σ,其大小为σ。根据先给出模
阅读全文
摘要:问题:有101个数,为[1,100]之间的数,其中一个数是重复的,如何寻找这个重复的数,其时间复杂度和空间复杂度是多少?解:假设这101个数存放在Data[101]的数组中int Data[101];for (int i = 0 ; i< 100; i++){Data[i] = i;}Data[100] = 6;//假设是这些数据,并将最后一个设计为重复的数,当然也可以是其它数据,此处便于测试而已,没必要手动输入101个数,那会累死.一> 采用hash的方法,该方法可以申请一个100个字节,然后扫描这个101个数据,该方法需要的空间为O(N),时间复杂度为O(N)charBuff[
阅读全文
摘要:KM算法求最小权二分匹配,模板题,构图很简单,直接把人当作左边的点,房子当作右边的点,两者之间的曼哈顿距离当作权值即可。第一次搞带权二分匹配的题,就是用KM算法求最小权的时候要加个处,由于KM求的是最大权,所以在套模板之前把权值都取下相反值最后再把KM算法求出来的最大权值取反即可。Kuhn-Munkras算法流程: (1)初始化可行顶标的值 (2)用匈牙利算法寻找完备匹配 (3)若未找到完备匹配则修改可行顶标的值 (4)重复(2)(3)直到找到相等子图的完备匹配为止引用:KM算法是通过给每个顶点一个标号(叫做顶标)来把求最大权匹配的问题转化为求完备匹配的问题的。设顶点Xi的顶标为A[i...
阅读全文
摘要:三、递推法递推法是利用问题本身所具有的一种递推关系求问题解的一种方法。设要求问题规模为N的解,当N=1时,解或为已知,或能非常方便地得到解。能采用递推法构造算法的问题有重要的递推性质,即当得到问题规模为i-1的解后,由问题的递推性质,能从已求得的规模为1,2,…,i-1的一系列解,构造出问题规模为I的解。这样,程序可从i=0或i=1出发,重复地,由已知至i-1规模的解,通过递推,获得规模为i的解,直至得到规模为N的解。【问题】阶乘计算问题描述:编写程序,对给定的n(n≤100),计算并输出k的阶乘k!(k=1,2,…,n)的全部有效数字。由于要求的整数可能大大超出一般整数的位数,程序用一维数组
阅读全文
摘要:#include "stdio.h"#include "malloc.h"typedef int elemtype;struct node{ elemtype data; struct node *next;};typedef struct node NODE;NODE * creat(NODE *head){ NODE *p,*q; elemtype i; head=(NODE*)malloc(sizeof(NODE)); scanf("%d",&(head->data)); p=head; while(p->d
阅读全文
摘要:顺序查找:int SeqSearch(int a[],int n,int k){//在顺序表中查找关键字值等于k的记录, //若查找成功,返回该记录的位置下标序号,否则返回0 int i=0; while (i<n && a[i]!= k) i++; if (i<n) return i; else return -1;} 对半查找:int BinarySearch(int a[], const int x, int l, int r){ while (r >= l){ int m = (l+r)/2; if (x ...
阅读全文
摘要:void shellsort(int a[],int n){ for(int d=n/2;d>=1;d=d/2) { for(int i=d;i<n;i++) //将a[i]插入到所属组的有序列段中 { int temp = a[i]; int j=i-d; while( j>=0 && temp<a[j]) { a[j+d]=a[j]; j=j-d; } a[j+d]=temp; } }} 以上是shell排序void BubbleSort(int a[],int n){ for (int i=n-1;i>=...
阅读全文