【问题标题】:Java Search all possible combo lists in the array (Algorithm)Java 搜索数组中所有可能的组合列表(算法)
【发布时间】:2015-03-16 15:27:21
【问题描述】:

我正在尝试查找数组中所有可能的元素组合的列表。

例如,让我们考虑一个包含以下元素的数组:'A','B','C','D'。

如果我选择一个数字作为最大字符串长度,那么我希望数组的所有组合达到最大长度。例如:

5 = 最大数量;然后:A,AA,AAA,AAAA,AAAA,AAAAB,AAAAC ....... DDDDD

我做了一个代码。它的速度是可以的,直到最大数量为10。超过15,它开始很慢。

有人有更好的办法让它更快吗?

这是我的代码:

public static void main(String[] args) {
    // TODO Auto-generated method stub
    HashSet<String> allResults = new HashSet<String>();
    // Create an alphabet to work with
    char[] alphabet = new char[] {'A','B','C','D'};
    // Find all possible combinations of this alphabet in the string size of 3
    StringExcersise.possibleStrings(15, alphabet,"", allResults);
    System.out.println(allResults.size());
}


    class StringExcersise {

public static void possibleStrings(int maxLength, char[] alphabet, String curr, HashSet<String> allResults) {
    // If the current string has reached it's maximum length
    if(curr.length() == maxLength) {
        allResults.add(curr);
        //System.out.println(curr);

    // Else add each letter from the alphabet to new strings and process these new strings again
    } else {
        for(int i = 0; i < alphabet.length; i++) {
            String oldCurr = curr;
            if(!allResults.contains(oldCurr))
                allResults.add(oldCurr);
            curr += alphabet[i];
            possibleStrings(maxLength,alphabet,curr,allResults);
            curr = oldCurr;
        }
    }
}
}

【问题讨论】:

  • 任何算法都会变慢,因为您的解决方案空间大约是 5 的幂 (n+1),对于 n=15,它超过一万亿次。
  • @Bohemian 哦,真的吗?那是巨大的..那么我可能需要考虑如何减少可能的组合.. :)
  • 顺便说一句,如果您需要表演,在String 上使用+= 可能不是最佳选择,也许StringBuilder 可能是更好的选择。

标签: java string performance algorithm design-patterns


【解决方案1】:

查看Heap's Algorithmhere

Java 中的一个工作示例:

    private static void swap(int[] v, int i, int j) {
        int temp = v[i]; 
            v[i] = v[j];
            v[j] = temp;
    }

    public void permute(int[] v, int n) {
        if (n == 1) {
            System.out.println(Arrays.toString(v));
        } else {
            for (int i = 0; i < n; i++) {
                permute(v, n-1);
                if (n % 2 == 1) {
                    swap(v, 0, n-1);
                } else {
                    swap(v, i, n-1);
                }
            }
        }
    }

【讨论】:

  • 修改this 算法可能会成功。
  • 这不是我想要的确切答案,而是我可能认为的选项之一 :) 谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
相关资源
最近更新 更多