算法擂台——查找在一本书中重复出现的一句话

threenewbee 2011-05-08 06:23:27
加精
感谢大家的参与,今天再给大家出一个思考题。

这个问题类似LCS,但是有所不同。

定义:
(1)单词,由A-Z或者a-z构成的字符串,不区分大小写,单词的开头是整个文本的开头,或者任意一个非单词构成字符之后开头,单词的结尾是任意一个非单词字符之前或者整个文本结束。
比如文本 A aa.a3 asdf, a"aa", a's包括的单词是 { a aa a asdf a aa a s }。
(2)句子,由1个或者多个单词组成的串,句子是由整个文本构成的单词串的子串。构成句子的单词是有序的,连续的。句子不一定是自然语言中的一句话,可能是半句,可能是几句。并且不考虑单词之间的非单词字符。句子第一个单词所在位置和长度决定了它们是否是同一个句子。
(3)句子的长度:句子中包含单词序列的数量。

目标:
在大约由几十万单词构成的文本中,找到这样两个不同的句子,它们由完全相同的单词以及序列构成。程序的目标是尽可能匹配文章中最长的句子。

限制:
使用内存以 1GB 为上限,运行时间以 20 秒 * 1GHz 为上限。可以使用多CPU优化程序
...全文
3724 103 打赏 收藏 转发到动态 举报
写回复
用AI写文章
103 条回复
切换为时间正序
请发表友善的回复…
发表回复
a3322110 2011-10-25
  • 打赏
  • 举报
回复
gbb21 2011-05-26
  • 打赏
  • 举报
回复
[Quote=引用 99 楼 kingdom_0 的回复:]

LINQ如何.
[/Quote]
还是得写provider
JaMin7 2011-05-25
  • 打赏
  • 举报
回复
学习了哈
kingdom_0 2011-05-25
  • 打赏
  • 举报
回复
LINQ如何.
etdudu 2011-05-16
  • 打赏
  • 举报
回复
不错~~~~~
hxy513282424 2011-05-16
  • 打赏
  • 举报
回复
不错不错~~~
kurt821 2011-05-16
  • 打赏
  • 举报
回复
原来如此
fzhang007 2011-05-15
  • 打赏
  • 举报
回复
不错!
CSDNFucker 2011-05-14
  • 打赏
  • 举报
回复
一个不错的议题
shanyang1 2011-05-14
  • 打赏
  • 举报
回复
是用来开发防论文抄袭系统么
pvpbboya 2011-05-14
  • 打赏
  • 举报
回复
研究研究
码农CGGG 2011-05-12
  • 打赏
  • 举报
回复
可以考虑做一个算法PK平台,然后大家可以提交代码,上去看每个人的运行效率。
小傻阿明 2011-05-12
  • 打赏
  • 举报
回复
这是一个求最长重复子串的问题!
想了几天,终于有点思路!下面说说我的想法。
假设已知道一个符串的最长重复子串长度为N,再读入一个字符后,该字符串的最长重复子串长度只有两种情况N或N+1;而且只N+1的情况只可能是倒数N+1个字符构成的子串。
如:abcab 最大重复子串长度为2,再读入一字符c,字符串变为abcabc,最大重复子串长度为3,子串为abc;
该结论的证明我还没完善好,改天给大家贴出来;
下面是算法的C语言实现:

为了简化编程,我们暂且假设字符串已读到内存中:

#include <stdio.h>

int main(void)
{
char array[]="abcabc";

int length=0;/*记录当前已求得的最长重复子串长度*/
char *temp;/*用于指向读入字符后可能构成最长重复子串长度为length+1的子串的首字母*/

char *p,*q;/*p指向刚读入的字符*/

int flag=1;/*如果读入字符后可能构成最长重复子串长度为length+1的子串,flag=1*/

int i;
p=array;
while(*p!='\0')
{
temp=p-length;

for(q=array;q<temp;q++)/*从头开始比较长度为length+1的所有子串*/
{
flag=1;
for(i=0;i<=length;i++)
{
if(*(q+i)!=*(temp+i))
{
flag=0;
break;
}
}
if(flag)
{
length++;
q=array;/*重新比较,也可以直接退出循环,主要是为了保险*/
}
}
p++;

}
printf("%d\n",length);/*只打印出最长重复子串的长度*/
return 0;
}

补充:1。中间的字符串比较用一个函数会更好;
2。可以记录下最长重复子串的位置,输出子串
看到楼上说用后缀数组,可能更好,正在学习中
ZXW0521 2011-05-12
  • 打赏
  • 举报
回复
后缀数组,倒排索引,
好吧,其实我只能纸上谈兵
superhackerzhang 2011-05-11
  • 打赏
  • 举报
回复
用自动机效果应该比较好。
nanyou521 2011-05-11
  • 打赏
  • 举报
回复
《编程珠玑》
绿色夹克衫 2011-05-11
  • 打赏
  • 举报
回复
大概我说的太简单,就比如 how.are! you的话,直接处理为how are you,这样的话其实也不用太复杂的方法,统一处理之后排序就行了,如果还需要匹配are!you.ok中的are you,那么就需要把how are you,are you,you都加进去,are you ok,you ok,ok也都加进去。

[Quote=引用 71 楼 gbb21 的回复:]
引用 67 楼 litaoye 的回复:
如果要找一摸一样的两个句子,用字典树、后缀数组或后缀树都好使,如果考虑连续子序列匹配的话,同样可以用上面这3种方法,不过需要把每个句子的所有后缀也加入进去。
没有看懂“不过需要把每个句子的所有后缀也加入进去”唉~
[/Quote]
gbb21 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 67 楼 litaoye 的回复:]

如果要找一摸一样的两个句子,用字典树、后缀数组或后缀树都好使,如果考虑连续子序列匹配的话,同样可以用上面这3种方法,不过需要把每个句子的所有后缀也加入进去。
[/Quote]
没有看懂“不过需要把每个句子的所有后缀也加入进去”唉~
绿色夹克衫 2011-05-10
  • 打赏
  • 举报
回复
如果要找一摸一样的两个句子,用字典树、后缀数组或后缀树都好使,如果考虑连续子序列匹配的话,同样可以用上面这3种方法,不过需要把每个句子的所有后缀也加入进去。
zjf_cumt 2011-05-10
  • 打赏
  • 举报
回复
跟找字符串最大匹配差不多
加载更多回复(19)

110,532

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧