求解一个字符串切分的算法问题

njucs 2008-11-21 04:03:04
现有一个包含100万个字符串(可能包含空格等各种字符,一行代表一个字符串)的数据库,给你一个新的字符串S,请将S进行切分,如果切分后的S的某一个子串在数据库中存在,则称S的该子串的部分被覆盖,要求:
1、切分后的S被覆盖率最高
2、在1的前提下,对S的切分数最少
请给出数据结构和算法,并分析时间复杂度。

大家有什么时间复杂度比较低的解决方案么?洗耳恭听~~~ :)
...全文
127 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
njucs 2008-11-24
[Quote=引用 9 楼 hityct1 的回复:]
请解释一下 覆盖率 吧?怎么计算的?不像是 词频。
[/Quote]

假设现在数据库中有以下短语:
A
B
C
E
F
G
ABC
CDE
EFG

那么,对句子ABCDEFG的切分应该就是:
A B CDE F G (虽然切分次数多,但所有词语都已经被覆盖:覆盖率100%)
而不是
ABC D EFG (D没有被覆盖:覆盖率6/7)
回复
njucs 2008-11-22
[Quote=引用 5 楼 litaoye 的回复:]
感觉就像在做搜索的分词,一般都是找最长的匹配,很少有lz这样找最大覆盖的。
[/Quote]

1、最大覆盖
2、在1的前提下切分最少
3、在1、2的前提下选择最长匹配
回复
woshiwoxinheqiu 2008-11-22
完全不懂~~~~~
不过会学习的,现在帮忙顶~~~~
回复
hityct1 2008-11-22
请解释一下 覆盖率 吧?怎么计算的?不像是 词频。
回复
njucs 2008-11-22
[Quote=引用 7 楼 hityct1 的回复:]
你是在做分词吗?
[/Quote]

很像是分词,但并不完全一样吧
回复
hityct1 2008-11-22
你是在做分词吗?
回复
绿色夹克衫 2008-11-21
感觉就像在做搜索的分词,一般都是找最长的匹配,很少有lz这样找最大覆盖的。
回复
同时要求最小切分很容易,只要在上面的算法中稍加调整,当覆盖率一样的时候优先取分割数少的方案就可以。
回复
njucs 2008-11-21
这样是可以求出最大覆盖率,但是要从最大覆盖率的所有情况中选择切分数最小的切法,应该还有不少困难
我考虑是不是可以转化为图的算法,比如在一个连通图中,最佳的切分应该就是起点到终点的最短路径吧?
具体的还没有考虑清楚,不过这样复杂度应该还是很高,而且前期的预处理工作需要耗费大量时间。

[Quote=引用 1 楼 dlyme 的回复:]
先将这一百万字符串顺序排列。

假设S的长度为n,我们用dp(i)来表示从第i个字符到第n个字符这段子串中被覆盖的最大字符数。
下面来看状态转移方程如何处理:
首先来看S[i~n]这个子串中有没有与数据库中匹配起来的“前缀”;
如果没有
{
dp[i]=dp[i+1];
}
如果有(假设满足匹配的“前缀”共有k个,用T[j]来表示,1 <=j <=k)
{
dp[i]=max{ dp[i+1],max{sizeof(T[j])+dp(i+sizeof(T[j])),这里1 <=…
[/Quote]
回复
qap22 2008-11-21
帮顶
回复
先将这一百万字符串顺序排列。

假设S的长度为n,我们用dp(i)来表示从第i个字符到第n个字符这段子串中被覆盖的最大字符数。
下面来看状态转移方程如何处理:
首先来看S[i~n]这个子串中有没有与数据库中匹配起来的“前缀”;
如果没有
{
dp[i]=dp[i+1];
}
如果有(假设满足匹配的“前缀”共有k个,用T[j]来表示,1<=j<=k)
{
dp[i]=max{ dp[i+1],max{sizeof(T[j])+dp(i+sizeof(T[j])),这里1<=j<=k} }
}
回复
相关推荐
发帖
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
帖子事件
创建了帖子
2008-11-21 04:03
社区公告
暂无公告