Exemplo n.º 1
0
import random
import heapq
import benchmark

def nth_ele1(lst, n):
    pivot = lst[0]

    below = [s for s in lst if s < pivot]
    above = [s for s in lst if s > pivot]
    i, j = len(below), len(lst) - len(above)

    if n < i : return nth_ele1(below, n)
    if n >= j : return nth_ele1(above, n-j)
    else: return pivot

def nth_ele2(lst, n):
    return heapq.nlargest(n, lst)[-1]

if __name__ == '__main__':
    lst = [2,2,2,2,2,2,2]
    benchmark.rt(nth_ele1, lst,6)
    benchmark.rt(nth_ele2, lst,6)

    

Exemplo n.º 2
0
import benchmark

def hammingweight1(n):
    count = 0
    while n:
        n &= n -1
        count += 1
    return count

def hammingweight2(n):
    n = (n & 0x55555555) + ((n>>1) & 0x55555555)
    n = (n & 0x33333333) + ((n>>2) & 0x33333333)
    n = (n & 0x0f0f0f0f) + ((n>>4) & 0x0f0f0f0f)
    n = (n & 0x00ff00ff) + ((n>>8) & 0x00ff00ff)
    n = (n & 0x0000ffff) + ((n>>16) & 0x0000ffff)
    return n


if __name__ == '__main__':

    assert hammingweight1(111111143) == hammingweight2(111111143)
    benchmark.rt(hammingweight1, 111111143)
    benchmark.rt(hammingweight2, 111111143)
Exemplo n.º 3
0
import itertools
import benchmark

# fast, but not take account to repeat element
def perm1(lst,n): 
    return itertools.permutations(lst,n)

# faster and not consider the repeat element
def perm2(lst, n): 
    if n == 0:
        yield []

    for i in range(len(lst)):
        rest = lst[:i] + lst[i+1:]
        for p in perm2(rest, n-1):
            yield lst[i:i+1] + p


if __name__ == '__main__':
    lst = [0,1,2,3,4,5,6,7,8,9]

    benchmark.rt(perm1 , lst, len(lst))
    benchmark.rt(perm2 , lst, len(lst))
Exemplo n.º 4
0
    if n % 2 == 0:
        fibs[n] = ((2 * fib3((n / 2) - 1)) + fib3(n / 2)) * fib3(n / 2)
        return fibs[n]
    else:
        fibs[n] = (fib3((n - 1) / 2) ** 2) + (fib3((n+1) / 2) ** 2)
        return fibs[n]

def fib4(n): # write state, faster, same to tail recursion
      a, b = 0, 1
      for _ in xrange(n):
          a, b = b, a + b
      return a

def fib5(n): # tail recursive version
    def fib_tail(end, a, b, start):
        if end == start:
            return a + b
        else:
            return fib_tail(end, b, a+b, start+1)
    if( n == 1 or n == 2 ):
        return 1
    else:
        return fib_tail(end, 1, 1, 3)
    
if __name__ == '__main__':
    benchmark.rt(fib1, 20)
    benchmark.rt(fib2, 100)
    benchmark.rt(fib3, 100)
    benchmark.rt(fib4, 1000)
    benchmark.rt(fib4, 1000)