Algorithm 具有最大权重的字分区
我正在做一个游戏,我需要找到一个特定句子的最大权重 假设我有一个句子“快速棕色狐狸”,并假设单字和双字都有其定义的权重:“the”->10,“quick”->5,“brown”->3,“fox”->8,“quick”->5,“quick brown”->10,“brown fox”->1 我想知道哪个单字和双字组合的权重最大,在这种情况下是“the”,“quick brown”,“fox”(权重=28) 我被告知这个问题可以通过线性规划来解决,但我不知道如何实现这种方法。具体来说,我不知道如何表达问题的约束条件,在这种情况下,一些双字不能与包含的单个字组合(即“快速”不能与“the”或“quick”组合) 有没有人可以提供一些指导来解决这个问题?我不是这方面的专家,对Simplex的工作原理有一些基本的了解(从学校回来),但我缺乏关于如何建模这类问题的知识 此外,任何其他方法(不涉及线性规划或暴力)也将受到欢迎Algorithm 具有最大权重的字分区,algorithm,nlp,dynamic-programming,linear-programming,Algorithm,Nlp,Dynamic Programming,Linear Programming,我正在做一个游戏,我需要找到一个特定句子的最大权重 假设我有一个句子“快速棕色狐狸”,并假设单字和双字都有其定义的权重:“the”->10,“quick”->5,“brown”->3,“fox”->8,“quick”->5,“quick brown”->10,“brown fox”->1 我想知道哪个单字和双字组合的权重最大,在这种情况下是“the”,“quick brown”,“fox”(权重=28) 我被告知这个问题可以通过线性规划来解决,但我不知道如何实现这种方法。具体来说,我不知道如何表
谢谢。假设组合仅由单字和双字组成:
int single[n];//if we choose i-th word : single[i]
int doubles[n];//if we choose the i-th and i+1-th word as a combination : doubles[i], the last word has the same value for it's single and doubles
int dp[n+2];//dynamic programming
dp[n] = dp[n+1] = 0;//bottom up
for(int i=n-1;i>=0;i--)
{
dp[i]=max(dp[i+1]+single[i],dp[i+2],double[i];
}
//the maximum value is dp[0]
假设组合仅由单字和双字组成:
int single[n];//if we choose i-th word : single[i]
int doubles[n];//if we choose the i-th and i+1-th word as a combination : doubles[i], the last word has the same value for it's single and doubles
int dp[n+2];//dynamic programming
dp[n] = dp[n+1] = 0;//bottom up
for(int i=n-1;i>=0;i--)
{
dp[i]=max(dp[i+1]+single[i],dp[i+2],double[i];
}
//the maximum value is dp[0]
针对示例问题的蛮力方法涉及到
2^7
可能的组合-让我们看看是否可以减少这种组合。为了方便起见,让我们映射变量:
the quick brown fox -> (a1, a2, a3, a4)
the quick -> b1
quick brown -> b2
brown fox -> b3
其中a3=True
表示我们使用的是“brown”。由此,我们可以构造一组规则。例如,b3
不能与a3
或a4
一起使用:
(a1:b1) (b1:a1,a2)
(a2:b1,b2) (b2:a2,a3)
(a3:b2,b3) (b3:a3,a4)
(a4:b3)
现在从数组
S=[a1=0,a2=0,…,b3=0]
开始,递归地逐步遍历变量组合,如果分支违反了我们的规则之一,则尽早修剪分支。如果我们到达一个叶节点,输出与变量相对应的权重,如果它是迄今为止最大的,则保持它。这可能不是最有效的答案,但它肯定可以减少组合。针对示例问题的蛮力方法涉及2^7
可能的组合-让我们看看是否可以减少组合。为了方便起见,让我们映射变量:
the quick brown fox -> (a1, a2, a3, a4)
the quick -> b1
quick brown -> b2
brown fox -> b3
其中a3=True
表示我们使用的是“brown”。由此,我们可以构造一组规则。例如,b3
不能与a3
或a4
一起使用:
(a1:b1) (b1:a1,a2)
(a2:b1,b2) (b2:a2,a3)
(a3:b2,b3) (b3:a3,a4)
(a4:b3)
现在从数组S=[a1=0,a2=0,…,b3=0]
开始,递归地逐步遍历变量组合,如果分支违反了我们的规则之一,则尽早修剪分支。如果我们到达一个叶节点,输出与变量相对应的权重,如果它是迄今为止最大的,则保持它。这可能不是最有效的答案,但它肯定可以减少组合。调用最大权重(i)
从位置i
到n-1
的子问题,其中n
是字数
- 您的问题是找到
最大权重(0)
- 基本大小写为
,等于BiggestWeight(n)
,因为单词列表为空, 和0
,等于BiggestWeight(n-1)
,因为只有一个单词的列表只有一个选项weight(n-1)
- 子问题之间的关系是:
因为BiggestWeight(i)=max(权重(i)+BiggestWeight(i+1),成对(i,i+1)+BiggestWeight(i+2))
-第四个单词要么是单个单词,要么是双单词中的第一个i
n+1
的表中,结果可以在O(n)
中找到,调用BiggestWeight(i)
从位置i
到n-1
的单词子问题,其中n
是单词数
- 您的问题是找到
最大权重(0)
- 基本大小写为
,等于BiggestWeight(n)
,因为单词列表为空, 和0
,等于BiggestWeight(n-1)
,因为只有一个单词的列表只有一个选项weight(n-1)
- 子问题之间的关系是:
因为BiggestWeight(i)=max(权重(i)+BiggestWeight(i+1),成对(i,i+1)+BiggestWeight(i+2))
-第四个单词要么是单个单词,要么是双单词中的第一个i
因此,如果将这些值存储在大小为
n+1
的表中,则可以在O(n)
中找到结果。您可以在此处非常有效地使用DP
设F为最大权函数,句子为w1 w2 w3。。工作
让G([w1 w2..])返回组合的字典权重
F([w1 w2 w3…wk])=Max(G([w1])+F([w2 w3…wk])、G([w1,w2])+F([w3 w4…wk])…)您可以在这里非常有效地使用DP 设F为最大权函数,句子为w1 w2 w3。。工作 让G([w1 w2..])返回组合的字典权重 F([w1 w2 w3…wk])=Max(G([w1])+F([w2 w3…wk]),G([w1,w2])+F([w3 w4…wk]))