• 大小: 3KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-10
  • 语言: 其他
  • 标签: C/C++  WM  

资源简介

该代码是WM算法和示例,感兴趣的小伙伴可以下载研究一下

资源截图

代码片段和文件信息

/*
 * WM.cpp
 *
 *  Created on: 2010-2-20
 *      Author: qingxuan.chenqx
 */

#include 
#include 
#include 
#include 
#include “wm.h“
extern int nline = 1;
extern int nfound = 0;
#define MAXN 10001 //模式串的最大长度MAXN - 1
#define MAXM 51//单词最大长度为MAXM - 1
WM_STRUCT * wmNew()
{
WM_STRUCT *p = (WM_STRUCT *) malloc(sizeof(WM_STRUCT));
if (!p)
return 0;
p->msNumPatterns = 0;
p->msSmallest = 1000;
return p;
}
void wmFree(WM_STRUCT *ps)
{
if (ps->msPatArray)
{
if (ps->msPatArray->psPat)
free(ps->msPatArray->psPat);
free(ps->msPatArray);
}
if (ps->msNumArray)
free(ps->msNumArray);
if (ps->msHash)
free(ps->msHash);
if (ps->msPrefix)
free(ps->msPrefix);
if (ps->msShift)
free(ps->msShift);
free(ps);
}
int wmAddPattern(WM_STRUCT *ps unsigned char *q int m)//m字符串长度
{
WM_PATTERN_STRUCT *p;
p = (WM_PATTERN_STRUCT *) malloc(sizeof(WM_PATTERN_STRUCT));
if (!p)
return -1;
p->psPat = (unsigned char*) malloc(m + 1);
memset(p->psPat + m 0 1);
memcpy(p->psPat q m);
p->psLen = m;
ps->msNumPatterns++;
if (p->psLen < (unsigned) ps->msSmallest)
ps->msSmallest = p->psLen;
p->next = ps->plist;
ps->plist = p;
return 0;
}
static unsigned HASH16(unsigned char *T)
{
return (unsigned short) (((*T) << 8) | *(T + 1));
}

void sort(WM_STRUCT *ps)//字符串哈希值从小到大排列
{
int m = ps->msSmallest;
int i j;
unsigned char *temp;
int flag;
for (i = ps->msNumPatterns - 1 flag = 1; i > 0 && flag; i--)
{
flag = 0;
for (j = 0; j < i; j++)
{
if (HASH16(&(ps->msPatArray[j + 1].psPat[m - 2])) < HASH16(
&(ps->msPatArray[j].psPat[m - 2])))
{
flag = 1;
temp = ps->msPatArray[j + 1].psPat;
ps->msPatArray[j + 1].psPat = ps->msPatArray[j].psPat;
ps->msPatArray[j].psPat = temp;
}
}
}
}

static void wmPrepHashedPatternGroups(WM_STRUCT *ps)//计算有多少个不同哈希值,且从小到大
{
unsigned sindex hindex ningroup;
int i;
int m = ps->msSmallest;
ps->msNumHashEntries = HASHTABLESIZE;
ps->msHash = (HASH_TYPE*) malloc(sizeof(HASH_TYPE) * ps->msNumHashEntries);
if (!ps->msHash)
{
printf(“No memory in wmPrepHashedPatternGroups()\n“);
return;
}

for (i = 0; i < (int) ps->msNumHashEntries; i++)
{
ps->msHash[i] = (HASH_TYPE) -1;
}

for (i = 0; i < ps->msNumPatterns; i++)
{
hindex = HASH16(&ps->msPatArray[i].psPat[m - 2]);
sindex = ps->msHash[hindex] = i;
ningroup = 1;
while ((++i < ps->msNumPatterns) && (hindex == HASH16(
&ps->msPatArray[i].psPat[m - 2])))
ningroup++;
ps->msNumArray[sindex] = ningroup;
i--;
}
}

static void wmPrepShiftTable(WM_STRUCT *ps)//建立shift表
{
int i;
unsigned short m k cindex;
unsigned shift;
m = (unsigned short) ps->msSmallest;
ps->msShift = (unsigned char*) malloc(SHIFTTABLESIZE * sizeof(char));
if (!ps->msShift)
return;

for (i = 0; i < SHIFTTABLESIZE; i++)
{
ps->msShift[i] = (unsigned) (m - 2 + 1);

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       6363  2017-01-11 14:20  WM多模算法(C)\WM.cpp

     文件       1218  2017-01-11 14:20  WM多模算法(C)\WM.h

     目录          0  2018-09-29 15:40  WM多模算法(C)

----------- ---------  ---------- -----  ----

                 7581                    3


评论

共有 条评论