设为首页 加入收藏

TOP

一步一步写算法(之字符串查找 下篇) (二)
2014-11-23 23:40:04 来源: 作者: 【 】 浏览:38
Tags:步一步 算法 之字符串查找下篇
e = pData[index];
str += value;

if(value == 1)
index = 0;
else
index = index -value;
}

free(pData);
return NULL;
}
可能朋友们看到了,上面的strlen又回来了?说明代码本身还有优化的空间。大家可以自己先试一试。


int check_valid_for_kmp(char str[], int start, int len)
{
int index;

for(index = start; index < len; index++)
if('\0' == str[index])
return 0;
return 1;
}

char* strstr_kmp(const char* str, char* data)
{
int index;
int len;
int value;
int* pData;

if(NULL == str || NULL == str)
return NULL;

len = strlen(data);
pData = (int*)malloc(len * sizeof(int));
memset(pData, 0, len * sizeof(int));
calculate_for_max_positon((char*)str, len, pData);

index = 0;
while(*str && check_valid_for_kmp((char*)str, index, len)){
for(; index < len; index ++){
if(str[index] != data[index])
break;
}

if(index == len){
free(pData);
return (char*) str;
}

value = pData[index];
str += value;

if(value == 1)
index = 0;
else
index = index -value;
}

free(pData);
return NULL;
}
int check_valid_for_kmp(char str[], int start, int len)
{
int index;

for(index = start; index < len; index++)
if('\0' == str[index])
return 0;
return 1;
}

char* strstr_kmp(const char* str, char* data)
{
int index;
int len;
int value;
int* pData;

if(NULL == str || NULL == str)
return NULL;

len = strlen(data);
pData = (int*)malloc(len * sizeof(int));
memset(pData, 0, len * sizeof(int));
calculate_for_max_positon((char*)str, len, pData);

index = 0;
while(*str && check_valid_for_kmp((char*)str, index, len)){
for(; index < len; index ++){
if(str[index] != data[index])
break;
}

if(index == len){
free(pData);
return (char*) str;
}

value = pData[index];
str += value;

if(value == 1)
index = 0;
else
index = index -value;
}

free(pData);
return NULL;
}

(三)、多核查找

多核查找其实不新鲜,就是把查找分成多份,不同的查找过程在不同的核上面完成。举例来说,我们现在使用的cpu一般是双核cpu,那么我们可以把待查找的字符分成两份,这样两份查找就可以分别在两个核上面同时进行了。具体怎么做呢,其实不复杂。首先我们要定义一个数据结构:


typedef struct _STRING_PART
{
char * str;
int len;
}STRING_PART;
typedef struct _STRING_PART
{
char * str;
int len;
}STRING_PART; 接着,我们要做的就是把字符串分成两等分,分别运算起始地址和长度。


void set_value_for_string_part(char str[], int len, STRING_PART part[])
{
char* middle = str + (len >> 1);

while(' ' != *middle)
middle --;

part[0].str = str;
part[0].len = middle - (str -1);

part[1].str = middle + 1;
part[1].len = len - (middle - (str - 1));
}
void set_value_for_string_part(char str[], int len, STRING_PART part[])
{
char* middle = str + (len >> 1);

while(' ' != *middle)
middle --;

part[0].str = str;
part[0].len = middle - (str -1);

part[1].str = middle + 1;
part[1].len = len - (middle - (str - 1));
} 分好之后,就可以开始并行运算了。


char* strstr_omp(char str[], char data[])
{
int index;
STRING_PART part[2] = {0};
char* result[2] = {0};
int len = strlen(str);

set_value_for_string_part(str, len, part);

#pragma omp parellel for
for(index = 0; index < 2; index ++)
result[index] = strstr(part[index].str, part[index].len, data);

if(NULL == result[0] && NULL == result[1])
return NULL;

return (NULL != result[0]) result[0] : result[1];
}
char* strstr_omp(char str[], char data[])
{
int index;
STRING_PART part[2] = {0};
char* result[2]

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇一步一步写算法(之字符串查找 中.. 下一篇一步一步写算法(之“数星星”)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: