Discover long patterns

前端 未结 6 1812
逝去的感伤
逝去的感伤 2021-01-30 02:20

Given a sorted list of numbers, I would like to find the longest subsequence where the differences between successive elements are geometrically increasing. So if the list is <

6条回答
  •  小鲜肉
    小鲜肉 (楼主)
    2021-01-30 03:13

    Here is my solution in Javascript. It should be close to O(n^2) except may be in some pathological cases.

    function bsearch(Arr,Val, left,right) {
        if (left == right) return left;
        var m=Math.floor((left + right) /2);
        if (Val <= Arr[m]) {
            return bsearch(Arr,Val,left,m);
        } else {
            return bsearch(Arr,Val,m+1,right);
        }
    }
    
    function findLongestGeometricSequence(S) {
        var bestSolution=[];
    
        var i,j,k;
        var H={};
        for (i=0;i bestSolution.length)
                            bestSolution=possibleSolution;
    
                        K--;
                    } else {
                        K=Math.floor(K);
                    }
    
                    if (K>0) {
                        var NextPossibleMidValue= (S[i] + K*S[j]) / (K +1); 
                        k++;
                        if (S[k]

    Small Explanation

    If we take 3 numbers of the array S(j) < S(k) < S(i) then you can calculate a and k so that: S(k) = S(j) + a*k and S(i) = S(k) + a*k^2 (2 equations and 2 incognits). With that in mind, you can check if exist a number in the array that is S(next) = S(i) + a*k^3. If that is the case, then continue checknng for S(next2) = S(next) + a*k^4 and so on.

    This would be a O(n^3) solution, but you can hava advantage that k must be integer in order to limit the S(k) points selected.

    In case that a is known, then you can calculate a(k) and you need to check only one number in the third loop, so this case will be clearly a O(n^2).

提交回复
热议问题