利用散列函数进行字符串匹配

来源:互联网 发布:编写软件程序步骤 编辑:程序博客网 时间:2024/06/05 14:26

摘要:(1)假定给了我们一个长字符串L,给了一个我们已知长度的短字符串s,要求进行匹配,判断该s(长度k)是否在L(长度N)中,位置在哪里。
基本思路:对所有符合长度的短字符串T进行遍历(N-k+1次),求出该字符串的散列函数并且与s的散列函数进行比较,如果一致,那么就逐个字符的进行检查.(散列函数一致而不是同一字符的概率很小).
细节:关键是要迅速的求出散列函数值,对于字符串一般的思路是将所有字符的ASCII码累加然后对某个素数取余.如果我们对每一个短字符串T都逐个相加然后再取余,一次匹配所需的次数是O(K),那么与每一位都比较效率没有区别.x 需要改进为利用常数时间解决函数值的问题.
每个相邻的字符串s1s2s3s4s5s6s7…sN, s2s3s4s5…sN+1,中间重叠的部分只是变大了一个常数值,而对两头不同的地方进行修正.这只需要花费常数时间.

#include "stdafx.h"#include "malloc.h"#include "stdlib.h"#include "string.h"#include "math.h"#define K 7int Hash(char *s){    int value = 0;    for(int i = 0;i<=K-1;i++)        value = value*8 + *(s+i);    return value%67;}int _tmain(int argc, _TCHAR* argv[]){    char S[] = "this is a gorgeous girl,but I do not like her for she is too poor ";    int N = sizeof(S);    int value = 0;    int x = pow((long double)8,7);    char string[K+1];    memcpy(string,S+5,sizeof(char)*K);    string[K] = '\0';    printf("the string we want is :  %s ",string);    int DesiredValue = Hash(S+5);    value = 0;    int InitialValue = Hash(S);    int CurrentValue = InitialValue;    int t=0,m;    char *pointFirst = S,*pointLast = S+K-1;    value = 0;    for(int i = 2;i<=N - K+1;i++)    {         t = (8*CurrentValue%67+*(++pointLast)%67)%67;      CurrentValue = (t - (*(pointFirst++) *x)%67)%67;      if(CurrentValue < 0)      CurrentValue+=67;      if(CurrentValue == DesiredValue)       {            //比较            int j = 0;            while(j<=K-1&&string[j] == *(S+i+j-1))            j++;            if(j==K)            printf("the goal has been found: the location is %d",i);            else            puts("the fake string with the same hashvalue");        }    }    return 0;}

这里写图片描述

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 支付宝定位错误怎么办 银行账户未年审怎么办 淘宝集运禁运品 怎么办 物流显示禁运品怎么办 淘宝禁运品怎么办呢 货物退回日本了怎么办 淘宝卖家寄多了衣服怎么办 集运地址选错怎么办 淘宝卖韩国化妆品退货怎么办 去韩国留学手机怎么办 韩国办无线网怎么办 淘宝卖家被骗怎么办 淘宝买软件被骗怎么办 被淘宝店诈骗怎么办? 支付宝被骗2000怎么办 给私人打款后不发货怎么办 毕业证寄丢了怎么办 微商下单返现被骗一千四怎么办 淘宝买东西卡里多扣钱怎么办 付款了卖家不发货怎么办 淘宝客服不解决问题怎么办 淘宝未付款订单怎么办 淘宝被限制购买怎么办 苹果官换机维修过怎么办 iphone x官换机坏了怎么办 小娃不要大人睡怎么办? 深度睡眠太少怎么办 踏板摩托车淹缸怎么办 电喷摩托车淹缸怎么办 踏板摩托不过油怎么办 火花塞被汽油淹怎么办 踏板车淹缸了怎么办 电喷汽车淹缸怎么办 踏板摩托车粘缸怎么办 鬼火打不着火怎么办 踏板摩托车没电怎么办 买摩托车被骗了怎么办 鬼火电瓶坏了怎么办 摩托闷油了怎么办 鬼火发不着火怎么办 淘宝买东西发错货了怎么办