首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rabin-Karp字符串搜索算法

Rabin-Karp字符串搜索算法
EN

Stack Overflow用户
提问于 2011-11-09 20:28:31
回答 3查看 4.6K关注 0票数 2

我的previous question与一般的字符串搜索算法有关。我正在研究Rabin-Karp算法,我有一个函数模板,如下所示:

代码语言:javascript
复制
RabinKarpMatch(char *Text, char *Search_phrase,int radix,int prime)

我想知道基数和质数的值将如何根据search_phrase和文本而变化?或者我应该为他们提供所有情况下的任意值?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-09 20:59:14

在Rabin-Karp算法中,基数和素数在文本处理过程中不变。但是选择好的基数和质数是非常重要的。在最坏的情况下(实际上几乎不可能),当文本的所有子串都具有与模板哈希码相同的哈希码时,算法将在O(nm)时间内工作,其中n是文本长度,m是模板长度。

一般规则:素数必须很小,基数必须方便使用。我相信像这样的配对:

(素数,基数)

31,2^64

37,2^64

57,2^64

对你来说没问题。

在一些实现中,为了最小化散列冲突,使用了不止一个对。

票数 2
EN

Stack Overflow用户

发布于 2018-07-24 21:24:14

代码语言:javascript
复制
import java.util.*;
import java.lang.*;

// Rabin Karp
// find if pattern exists in string or not. If found return its index.

public class RabinKarp {

    private int prime = 101;

    public int patternSearch(String s, String pattern) {

        int lengthOfPattern = pattern.length();
        long hashOfPattern = createHash(pattern, lengthOfPattern);
        long hashOfString = createHash(s, lengthOfPattern);

        for(int i = 0; i < s.length() - lengthOfPattern + 1; i++) {

            if (hashOfPattern == hashOfString && checkEqual(pattern, s.substring(i, i + lengthOfPattern), lengthOfPattern))
                return i;
            if (i != s.length() - lengthOfPattern)
                hashOfString = reCreateHash(s.substring(i+1,i+1+lengthOfPattern), hashOfString, (int)s.charAt(i), lengthOfPattern);
        }
        return -1;
    }

    public boolean checkEqual(String pattern,String substring,int end){
        for (int i=0;i<end;i++)
            if (pattern.charAt(i) != substring.charAt(i))
                return false;
        return true;
    }

    public long reCreateHash(String pattern, long oldHash, int oldCharAsciiValue, int end) {
        long hash = 0;
        hash = oldHash - oldCharAsciiValue;
        hash = hash / prime;
        hash += pattern.charAt(end-1) * Math.pow(prime, end - 1);
        return hash;
    }

    public long createHash(String pattern,int end) {
        long hash = 0L;
        for(int i = 0; i < end; i++)
            hash += pattern.charAt(i) * Math.pow(prime, i);
        return hash;
    }

    public static void main(String arg[]){
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter a String");
        String s = sc.nextLine();
        System.out.println("Enter a pattern");
        String pattern = sc.nextLine();
        RabinKarp rk = new RabinKarp();
        System.out.println("Staring index of pattern is " + rk.patternSearch(s, pattern));
    }
}
票数 0
EN

Stack Overflow用户

发布于 2017-04-08 15:51:37

拉宾卡普字符串匹配算法

代码:

代码语言:javascript
复制
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <math.h>
#define d 10
void RabinKarpStringMatch(char*, char*, int);
void main()
{
    char *Text, *Pattern;
    int Number = 11; //Prime Number
    clrscr();
    printf("\nEnter Text String : ");
    gets(Text);
    printf("\nEnter Pattern String : ");
    gets(Pattern);

    RabinKarpStringMatch(Text, Pattern, Number);
    getch();
}

void RabinKarpStringMatch(char* Text, char* Pattern, int Number)
{
    int M, N, h, P = 0, T = 0, TempT, TempP;
    int i, j;
    M = strlen(Pattern);
    N = strlen(Text);
    h = (int)pow(d, M - 1) % Number;
    for (i = 0; i < M; i++) {
        P = ((d * P) + ((int)Pattern[i])) % Number;
        TempT = ((d * T) + ((int)Text[i]));
        T = TempT % Number;
    }
    for (i = 0; i <= N - M; i++) {
        if (P == T) {
            for (j = 0; j < M; j++)
                if (Text[i + j] != Pattern[j])
                    break;
            if (j == M)
                printf("\nPattern Found at Position: %d", i + 1);
        }
        TempT = ((d * (T - Text[i] * h)) + ((int)Text[i + M]));
        T = TempT % Number;
        if (T < 0)
            T = T + Number;
    }
}

OUTPUT FOR THE CODE

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8065027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档