如何找到一个真正大的看似问题的最佳答案?

时间:2011-04-14 04:51:02

标签: algorithm

首先,这不是一个家庭作业问题。自1988年以来,我没有必要做作业了!

  1. 我有一个长度为N
  2. 的单词列表
  3. 我最多可以选择13个字符。
  4. 可以有相同字母的倍数
  5. 给出单词列表,其中13个字符拼写最可能的单词。我可以抛弃使问题更难解决的词语,例如:

    speedometer has 4 e's in it, something MOST words don't have, 
    so I could toss that word due to a poor fit characteristic, or it might just 
    go away based on the algorithm
    

    我看过@字母发行版,我已经建立了一个单词图表(逐个字母)。有一些我想念的东西,或者这个问题比我想象的要困难得多。如果可能的话,我宁可不要完全蛮力,但我现在已经到了这一点。

    遗传算法浮现在脑海中,但我以前从未尝试过它们......

    似乎我需要一种方法来根据每个字母与其中的其他字母的关联来对每个字母进行评分....

5 个答案:

答案 0 :(得分:2)

这听起来像是一个很难组合的问题。您将获得单词字典D,并且您可以选择N个字母(可能包含重复)以覆盖/生成尽可能多的D中的单词。我99.9%肯定它可以被证明是一般的NP完全优化问题(假设可能是字母表,即包含超过26项的字母集),通过减少SETCOVER到它,但我将离开实际的减少作为读者的练习:)

假设很难,你有通常的路线:

  • 分支和绑定
  • 随机搜索
  • 近似算法

答案 1 :(得分:1)

总体暴力强制应该有效,尽管实施会变得非常混乱。

不是像速度表那样扔掉单词,而是只考虑字符是否出现在单词中而不能生成关联图表(不论它出现的次数是多少,因为它不应该与最终结果有任何关系)最佳选择13个字符)。这也会使它比总暴力更简单。

欢迎评论。 :)

答案 2 :(得分:1)

我能想到的最好的就是分支机构。创建一个由

组成的“中间状态”数据结构
  • 你已经使用过的字母(有多重性)
  • 您仍然可以使用的字符数
  • 信件仍然可用
  • 列表中的字词
  • 列表中仍有的字数(上一组的数量)
  • 此州无法使用的字数
  • 您选择的字母已涵盖的字数

你从

开始
  • 空集
  • 13
  • {A,B,...,Z}
  • 您的整个清单
  • Ñ
  • 0
  • 0

将该数据结构放入队列中。

每一步

Pop an item from the queue
Split into possible next states (branch)
Bound & delete extraneous possibilities

从一个州,我会产生如下可能的下一个州:

For each letter L in the set of letters left
    Generate a new state where:
        you've added L to the list of chosen letters
        the least letter is L
        so you remove anything less than L from the allowed letters

所以,例如,如果你的剩余集是{W,X,Y,Z},我会生成一个状态,W添加到我的选择,{W,X,Y,Z}仍然可能,一个以X作为我的选择,{X,Y,Z}仍然可能(但不是W),一个以Y作为我的选择而{Y,Z}仍然可能,一个以Z作为我的选择而{Z}仍然可能

进行各种会计以确定新的状态。

每个州至少具有“您选择的字母已覆盖的字数”字样,并且最多该字数加上“列表中仍有的字数”。在所有状态中,找到最高的最小值,并删除任何最大值超过该状态的状态。

无需特殊处理速度表。

我无法想象这会很快,但它会起作用。

可能存在一些优化(例如,将列表中的每个单词存储为多个出现次数的AZ数组,并组合具有相同结构的单词:AB的出现次数为2 ...... T => BAT和标签)。如何排序和跟踪最小值和最大值也可能对某些事情有所帮助。可能还不足以做出渐近的差异,但可能是一个足够大的问题,使其在合理的时间而不是极端时间运行。

答案 3 :(得分:0)

删除每个参数的边界,包括字母大小,从最大覆盖问题中可以很容易地保持目标,这是NP难度且难以近似,其比率优于(e - 1)/e≈0.632。它的固定参数可以通过暴力破坏字母大小。

我同意尼克约翰逊关于蛮力的建议;在最坏的情况下,只有(13 + 26 - 1)选择(26 - 1)多重集合,这只是大约50亿。如果将每个字母的多重性限制为可能有用的数字,则此数字会变得更小。即使它太慢,您也应该能够回收数据结构。

答案 4 :(得分:0)

我完全不明白这一点“我最多可以选择13个字符。”。如果你有1000个单词的列表,那么你的意思是你必须将它减少到只有13个字符吗?!

基于我(错误)理解的一些想法:

如果你只处理英语单词,那么你可以跳过元音,因为辅音就像描述一样。我们的大脑可以填充元音 - a.k.a SMS / Twitter语言:))

也许对于1-3个字母的单词,剥离元音会丢失太多信息。但仍然:

  

spdmtr hs 4,nth,smthng   MST写道不是hv,s cld   不管怎么说   chrctrstc,r t mght jst g   wy bsd n th lgrthm

词干会使词语更短。先扼杀,然后剥去元音。然后做直方图......