How to determine the longest increasing subsequence using dynamic programming?

前端 未结 19 2337
醉梦人生
醉梦人生 2020-11-22 10:55

I have a set of integers. I want to find the longest increasing subsequence of that set using dynamic programming.

相关标签:
19条回答
  • 2020-11-22 11:41

    I have implemented LIS in java using Dynamic Programming and Memoization. Along with the code I have done complexity calculation i.e. why it is O(n Log(base2) n). As I feel theoretical or logical explanations are good but practical demonstration is always better for understanding.

    package com.company.dynamicProgramming;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class LongestIncreasingSequence {
    
        static int complexity = 0;
    
        public static void main(String ...args){
    
    
            int[] arr = {10, 22, 9, 33, 21, 50, 41, 60, 80};
            int n = arr.length;
    
            Map<Integer, Integer> memo = new HashMap<>();
    
            lis(arr, n, memo);
    
            //Display Code Begins
            int x = 0;
            System.out.format("Longest Increasing Sub-Sequence with size %S is -> ",memo.get(n));
            for(Map.Entry e : memo.entrySet()){
    
                if((Integer)e.getValue() > x){
                    System.out.print(arr[(Integer)e.getKey()-1] + " ");
                    x++;
                }
            }
            System.out.format("%nAnd Time Complexity for Array size %S is just %S ", arr.length, complexity );
            System.out.format( "%nWhich is equivalent to O(n Log n) i.e. %SLog(base2)%S is %S",arr.length,arr.length, arr.length * Math.ceil(Math.log(arr.length)/Math.log(2)));
            //Display Code Ends
    
        }
    
    
    
        static int lis(int[] arr, int n, Map<Integer, Integer> memo){
    
            if(n==1){
                memo.put(1, 1);
                return 1;
            }
    
            int lisAti;
            int lisAtn = 1;
    
            for(int i = 1; i < n; i++){
                complexity++;
    
                if(memo.get(i)!=null){
                    lisAti = memo.get(i);
                }else {
                    lisAti = lis(arr, i, memo);
                }
    
                if(arr[i-1] < arr[n-1] && lisAti +1 > lisAtn){
                    lisAtn = lisAti +1;
                }
            }
    
            memo.put(n, lisAtn);
            return lisAtn;
    
        }
    }
    
    

    While I ran the above code -

    Longest Increasing Sub-Sequence with size 6 is -> 10 22 33 50 60 80 
    And Time Complexity for Array size 9 is just 36 
    Which is equivalent to O(n Log n) i.e. 9Log(base2)9 is 36.0
    Process finished with exit code 0
    
    
    0 讨论(0)
提交回复
热议问题