【问题标题】:Algorithm for Longest Increasing Subsequence timing out [duplicate]最长增加子序列超时的算法[重复]
【发布时间】:2015-06-09 18:12:35
【问题描述】:

我正在解决 HackerRank 的最长子序列问题。我正在使用动态规划算法来解决最长子序列问题。我的算法的时间复杂度是 O(n^2)。尽管我的解决方案提供了正确的结果,但对于大多数测试用例来说,它的时机已经过时了。我无法改进我的算法,以便更快地计算结果。如果有人可以提出任何建议,请告诉我。我的功能如下:

static ArrayList<Integer> calcSolution(int[] arr) throws Exception{
        ArrayList<ArrayList<Integer>> prev = new ArrayList<ArrayList<Integer>>(); 
        ArrayList<Integer> lis = new ArrayList<Integer>();

        lis.add(arr[0]);
        prev.add(lis);
        for(int i=1 ; i<arr.length ; i++){
            prev.add(new ArrayList<Integer>());
            for(int j=0 ; j<i ; j++){
                if( (arr[i] > arr[j]) && (prev.get(i).size() < (prev.get(j).size()+1)) ){
                    prev.get(i).addAll(prev.get(j));
                }
            }
            prev.get(i).add(new Integer(arr[i]));
        }

        for(int i=0 ; i<prev.size() ; i++){
            for(int j=0 ; j<prev.get(i).size(); j++){
                System.out.print(prev.get(i).get(j));
            }
            System.out.println();
        }

        lis = prev.get(0);
        for(int i=1 ; i<prev.size() ; i++){
            if(prev.get(i).size() > lis.size()){
                lis = prev.get(i);
            }
        }

        return lis;
    }

我的问题是: - 我可以对这个算法做些什么来让它更快。另一篇文章中建议的算法是完全不同的算法。

【问题讨论】:

  • @Anonymous:原来如此,我在想最长公共子串问题。

标签: java performance algorithm dynamic-programming


【解决方案1】:

您的实现的时间复杂度为 O(n^3) 而不是 O(n^2)。

prev.get(i).addAll(prev.get(j)); 

是不必要且昂贵的。

对于每个元素,您需要记住上一个链接和以它结尾的子序列的长度。您无需记住每个元素的实际子序列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 2013-11-27
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多