【问题标题】:Permutations of a set of data in JavaJava中一组数据的排列
【发布时间】:2020-02-09 20:21:08
【问题描述】:

我在一组中有 10,000 件物品,每件都必须制成三合会。 我需要一种算法来有效地找到每个三元组。

例如:

{A,B,C,D,...}

1.AAA 2.AAB 3.AAC 4.AAD ...

一直到ZZY,ZZZ。

我使用的方法效率很低,我创建了一个 3 的嵌套 forloop,它遍历一个数组,它的运行时间为 O(N^3),性能很糟糕。哪种算法和数据结构对此会更好?谢谢

【问题讨论】:

  • 请出示您的代码(即使效率低下)。
  • 产生了多少三和弦?
  • 这是最有效的方法。可能的排列数量为n^k,在您的情况下为 10000^3 = 10^12,您需要为每个排列至少插入一次

标签: java algorithm permutation


【解决方案1】:

从一组 n 个字符中打印所有长度为 K 的排列的函数 字符重复:

static void printKLengthPerm(char[] set, String prefix, int n, int k) 
{ 
    if (k == 0) 
    { 
        System.out.println(prefix); 
        return; 
    } 

    for (int i = 0; i < n; i++) 
    { 
        String newPrefix = prefix + set[i]; 
        printKLengthPerm(set, newPrefix, n, k - 1); 
    } 
}

调用函数从一组全大写英文字母中打印所有长度为 3 的排列:

char[] set = new char[26]; 
for(int i = 0; i < 26; i++)
  set[i] = (char)(i+65);
int n = set.length; 
printKLengthPerm(set, "", n, 3); 

【讨论】:

  • 这与问题中的立方时间复杂度相同,此外,由于递归,它具有 O(k) 空间复杂度,这意味着整体性能更差,因为 OPs 代码具有恒定的空间 compl。
猜你喜欢
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-20
相关资源
最近更新 更多