| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 681 人关注过本帖
标题:[求助]C语言编程
只看楼主 加入收藏
ditouwa960
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-4-1
收藏
 问题点数:0 回复次数:4 
[求助]C语言编程
利用KMP算法设计一个文本文件内容查找程序。首先创建一个文本文档,再利用C语言编写一个程序,输入需要查找的字符串,查找文本文档中是否包含该字符串并输出结果.
有哪位大侠知道这个程序怎么写吗?
搜索更多相关主题的帖子: C语言 文本文件 字符 
2007-04-04 14:55
天使有泪
Rank: 1
等 级:新手上路
帖 子:37
专家分:0
注 册:2007-4-3
收藏
得分:0 
请教一下楼主,什么是KMP算法
它是干吗的阿?
2007-04-04 19:56
anthony634
Rank: 6Rank: 6
来 自:西南交大
等 级:贵宾
威 望:24
帖 子:653
专家分:10
注 册:2006-6-8
收藏
得分:0 

转之那里忘记了,总之就是转的,你参考下
串比较的若干算法归类————普通、KMP算法:

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

// Produced By fishstudio @ Sep. 2005

//@description:this(or maybe these)program contains several algorthims in only one function in the C

// programming language.But, if you want to use it,please select the one you want to use

// for copying all of it will cause a mount of errors while compiling.Maybe I should make it

// in a more advanced IDE(e.g: MS Visual Studio.net),I could,which will give the users more

// benefits.I like pure things so that's reason.

//@author:Vincent

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

//................................many codes before the function were discarded

//we have a main string called S,and a module string called P,also the nextval array used to record the

//nextval of each element of the module string.

typedef int Postion;//the postion of the firstly found string

Postion Compare( SString s, SString p){//compare whether there is a string P contains in S,

//if has return the firstly found postion,if not return -1 as the symbol of the failure

int len_s = strlen( s),len_p = strlen( p),i=0,j=0;

while( i < len_s && j < len_p){

if( s[ i ] == p[ j ]) { ++i; ++j; }

else {

i = i - j + 1;

j = 1;

}

}

//===========================================================the normal function is over

//here comes the KMP function

while( i < len_s && j < len_p){

if( s[ i ] == p[ j ]) { ++i; ++j;}

else j = nextval[ j ];

}

//===========================================================the KMP algorthim is over

//here come the algorthim to calculate the nextval[ i ].

//Notice:the index 0 of each array contains the length of the array

i =1; nextval[ 1 ] = 0; j = 0;

while( i < s[ 0 ]){

if( j == 0 || p[ i ] == p[ j ]){ ++i; ++j;

if( p[ i ] != p[ j ])//if the next element doesn't equal to the last one

nextval[ i ] = j;

else nextval[ i ] = nextval[ j ];

}

else j = nextval[ j ];

}

//============================================================here comes the end

if( j > len_p) return ( i - len_p);

else return -1;

}//the end of the string's compare algorthim


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

若干描述,这是网上多见的版本,不知道作者,如果出现版权问题,请与本人联系,与csdn无关

一 理论论述:
(1)我们在求主串的匹配位置的时候,可以用游标卡尺的模型,即相对移动来思维,当找到匹配时或者是游标到底时游标停止移动,而移动越快,则耗时越短,而i就是主标,j就是游标;
(2)关于为什么要求next[j]
大家知道子串与模式串失配时,一定前边所比较过的一定匹配,即有"S[i-j+1],S[i-j+2],...S[i-1]"="T[1],T[2],...T[j-1]",在这个时候,我们一定要找出在不遗漏可能的匹配串条件下,子串相对于主串所能移动的最大元素个数,也等效于找出next[j];
(3)求next[j]本意是找出应当和当前失配标度i(主尺标度)所指S[i]所比较的模式串的标度next[j](游尺标度)所指的T[next[j]],而要做到这一点,只要找出next[j]即可;
(4)求出k=next[j],相当与模式串相对于主串前进(j-k)个元素;
(5)关于如何求next[j] 普通算法
核心是充分利用已经知道的信息,我们知道我们人(即古典算法)在看最多能移动多少长度时,一定是先拿T[1]和从S[i-j+1]开始起的元素进行比较,找到相同的再比较下个,由于目前所知道信息不包括S[i](其实失配时,还是获得信息,在改进算法中就利用到了这一点)以及其以后的元素,一定无法利用,也就是说如果存在移动最大长度时,一定有"T[1],T[2],...,T[k-1]"="S[i-k+1],S[i-k+2],...,S[i-1]}"也就是
“将Next[j]解释为p1 p2 …… pj 中最大相同前缀子串和后缀子串(真子串)的长度较容易理解。
提供一个Next[j]的计算方法:
当j=1时,Next[j]=0;
当j>1时,Next[j]的值为模式串的位置从1到j-1构成的串中所出现的首尾相同的子串的最大长度加1,无首尾相同的子串时 Next[j]的值为1。”
(引用自青玉案的《KMP》) 。
具体的求法书上有介绍,这个我只补充一点:我觉得书上所说求模式串与其自身匹配位置太过抽象,尽管本质确实如此,下边我会有更具体的方式.
(6)关于求next[j]的改进算法
其实本改进算法中唯一添加了的就是一个判断语句,它的核心正如上边所提到的,在于利用了求nextval[j]时,nextval[j]一定失配;并且将利用的工作引入准备工作---求nextval[].

[此贴子已经被作者于2007-4-4 22:08:26编辑过]

2007-04-04 22:07
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏
得分:0 
这是模仿一个搜索引擎了!

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2007-04-04 23:11
ditouwa960
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-4-1
收藏
得分:0 
请问三楼大侠,你这个程序是完整的吗?符合我的方法吗?看不太明白
2007-04-05 13:14
快速回复:[求助]C语言编程
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025593 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved