【问题标题】:How to efficiently calculate the top permutations如何有效地计算顶部排列
【发布时间】:2014-02-20 17:29:17
【问题描述】:

我有一个二维字母数组,每个字母都有一个分数。例如:

J-95 O-90 H-92 N-99
I-91 0-89 L-55
1-80
T-55

从上面的数组中,我想快速获得前 20 个左右排列(按分数)的列表。在上面的示例中,列表将是:

JOHN
IOHN
J0HN
I0HN
... etc

我目前正在递归函数中执行此操作——但它比我想要的要慢。有什么好的方法可以快速获得top N 列表吗?我的代码是 C++(如果有好的库建议的话)。

谢谢

编辑:

我结合使用 Sneftel 和 Ethan 的答案解决了这个问题。我使用剪枝函数根据权重减少可能的字符,然后从中计算排列。

【问题讨论】:

  • 能否提供源代码?还有一种提高速度的好方法,不要使用递归,使用循环。
  • 这看起来很有趣,但我不确定它是如何工作的,因为这些字母有特定的顺序。例如,#2 响应需要是 IOHN 而不是 JIHN,即使 JIHN 的得分高于 IOHN。
  • 为什么不是#2 J0HN?还有为什么IOHN会出现两次?
  • 看起来你并不是真的想要排列。排列意味着您可以重新排序元素。你想要的是"JI1T""O0""HL""N" 的笛卡尔积的前 20 个最高得分元素。

标签: c++ algorithm sorting


【解决方案1】:

首先,您需要对候选人进行排序。它需要 O(nlgn) 时间。

N-99 J-95 H-92 I-91 O-90 0-89 1-80 L-55 T-55

其次,根据您需要的最佳分数,您选择前 n 个字符进行排列。

(n)*(n-1)*(n-2)*(n-3) / (1 * 2 * 3 * 4) >= m. 

n 是您选择的候选人数。 m 是您需要的最佳分数的数量。例如,如果您需要 20 个最佳分数,则只需设置 7 个字符。可能您面临的问题是您对所有候选人进行排列,而对一些非常低的候选人进行排列是一种浪费。


第三步是得到你需要的所有排列,然后排序并打印。

【讨论】:

    【解决方案2】:

    这个问题实际上是NP完全的;它是“背包多项选择问题”(MCKP)的一种形式。

    一种可能对您有用的简单方法是从每个插槽中的前 1 个字母、然后每个插槽中的前 2 个字母、然后是前 3 个字母等生成组合,并在连续两次迭代中停止产生相同的前 20 名分数。这不能保证比蛮力搜索更有效,但它很容易实现,并且适用于“一般”情况。

    【讨论】:

      【解决方案3】:

      perm 代码示例 Rosetta 代码在许多语言中有一些很好的示例this is in c++。一旦你的排列代码正常工作,你就可以创建一个 return maximumscore 函数,也可以使用映射将单词映射到分数。

          char** permutations(char *word, int len){
              ... //the perm code
          }
          //returns array of cstrings permutations
      
          char** returnBiggestScore(char **permutations, int len){
              ...// your score logic goes here
          }
          //would return the top five say, 
      

      在您的主程序中,您可以执行以下操作:

      returnBiggestScores(permutations("hello"));
      

      你如何编码你的回报最大分数取决于你,但我建议使用地图对象, 这样您就可以在恒定时间内检查任意字母的分数,如下所示:

      score['B']; //fast and convinient returns score value for key 'B'
      

      【讨论】:

        猜你喜欢
        • 2011-01-06
        • 2019-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-11
        • 2019-12-11
        相关资源
        最近更新 更多