Discover long patterns

前端 未结 6 1873
逝去的感伤
逝去的感伤 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条回答
  •  旧时难觅i
    2021-01-30 02:57

    Python:

    def subseq(a):
        seq = []
        aset = set(a)
        for i, x in enumerate(a):
            # elements after x
            for j, x2 in enumerate(a[i+1:]):
                j += i + 1  # enumerate starts j at 0, we want a[j] = x2
                bk = x2 - x  # b*k (assuming k and k's exponent start at 1)
    
                # given b*k, bruteforce values of k
                for k in range(1, bk + 1):
                    items = [x, x2]  # our subsequence so far
                    nextdist = bk * k # what x3 - x2 should look like
    
                    while items[-1] + nextdist in aset:
                        items.append(items[-1] + nextdist)
                        nextdist *= k
    
                    if len(items) > len(seq):
                        seq = items
    
        return seq
    

    Running time is O(dn^3), where d is the (average?) distance between two elements, and n is of course len(a).

提交回复
热议问题