我有以下问题:
给出一个字符串(其中没有空格)。我还有一个成本函数,它返回字符串的成本(通过添加字符串中每个单词的评估成本构建)。实际上它使用字典并评估编辑距离。
我的程序需要插入空格(尽可能少)以获得最佳的全局成本。
我想要原始算法,优化会更进一步。
示例:
errorfreesampletext - >无错样本文本
scchawesomeness - >如此棒的
答案 0 :(得分:2)
我认为这应该有用。
dp[i] = minimum cost if we consider only the first i characters
for i = 1 to n do
dp[i] = cost(a[1, i]) // take sequence [1, i] without splitting it
for k = 1 to i - 1 do
dp[i] = min(dp[i], dp[k] + cost(a[k + 1, i])) // see if it's worth splitting
// sequence [1, i] into
// [1, k] and [k + 1, i]
答案 1 :(得分:1)
这是一种算法。它可能不是最有效的,但却是我能想到的最好的。
Input:
A string of length n
A list of words
Create a lookup table:
Create a grid M of n x n slots. (1..n, 1..n)
Create a grid W of n x n slots. (1..n, 1..n)
For each starting position i in 1..n:
For each ending position j in i..n:
For each word w:
Find the edit distance d between w and substring (i..j)
If d is less than M[i,j]:
Set M[i,j] to d
Set W[i,j] to w
Find the best words for each position:
Create a list L of (n+1) slots. (0..n)
Create a list C of (n+1) slots. (0..n)
Set L[0] to 0
For each ending position i in 1..n:
Set L[i] to infinity
For each starting position j in 0..i-1:
If L[j] + M[i,j] is less than L[i]:
Set L[i] to L[j] + M[i,j]
Set C[i] to j
Create the final result string:
Create a list R
Let i be the length of the input (n)
Repeat while i > 0:
Let j be C[i]
Prepend W[j,i] to R
Set i to j-1
Return R
该算法分为三个阶段:
第一阶段计算查找表。 M 是将任何单词拟合到子串 i .. j 中的最佳成本。 W 是与该费用相关联的字词。 O ( n 3 mw )( n =输入长度, w =最大字长, m =字数)
第二阶段为每个职位找到最佳单词。 L 是 i 的最佳总成本。 C 是与该费用相关联的最后一个单词的起始位置。 0 的(名词的 2 )
最后一个阶段组装最后一个字符串。 R 是与输入字符串匹配时收到最低成本的单词列表。 0 的(名词的)。
第一阶段成本最高。应该可以从中削减一个数量级,但我不知道如何。你也可以将它与第2阶段结合起来,但你不会从中获得太多收益。