Temat 5: Złożoność obliczeniowa (II)

Wstecz; Ostatnia modyfikacja: 13.03.2015
  • Ćw wstępne: dokończyć zadanie z poprzednich zajęć
  • Wyszukiwanie liniowe $\Theta(n)$ vs. wyszukiwanie binarne $\Theta(log(n))$
  • @timeit
    def lin_search(l,x):
      n = len(l)
      for i in range(n):
        if l[i] == x:
          return i
      return -1
    
    @timeit
    def bin_search(l, x):
      n = len(l)
      a = 0; b = n
    
      while (b-a > 1):
        c = (b+a) / 2
        if l[c] == x: return c
        elif l[c] > x: b = c
        elif l[c] < x: a = c
      return -1
    
    l=range(0,1000000,3)
    c = bin_search(l, 37)
    print(c)
    
    c = lin_search(l, 37)
    print(c)
    
    # Running time of bin_search: 1.69277191162e-05
    # Running time of lin_search: 0.0184202194214
  • Zapoznaj się ze złożonością obliczeniową operacji na kluczowych strukturach danych w Pythonie: link
  • Ćw 1: napisz funkcję, która dla danej listy $l=[x_1,...,x_n]$ i liczby całkowitej $r$ zwraca listę indeksów $i$ takich, że (a): $$x_{i-r} < ... < x_{i-1} < x_i > x_{i+1} > ... > x_{i+r}$$. Jaką złożoność obliczeniową ma Twój algorytm? Wariant (b) $$x_i = max(x_{i-r},..., x_{i-1},x_i, x_{i+1},..., x_{i+r})$$
  • Ćw 2:Jakie znasz algorytmy sortowania? Jaka jest ich złożoność obliczeniowa?
  • def bubble_sort(arr):
      def swap(i,j):
        t = arr[i]
        arr[i] = arr[i+1]
        arr[i+1] = t
    
      n = len(arr)
      for k in range(n-1, 0, -1):
        for i in range(k):
          if arr[i] > arr[i+1]:
            swap(i,i+1)
      return arr
    
    def quick_sort(arr):
        if len(arr)<=1:
            return arr
        pivots = [x for x in arr if x == arr[0]]
        lesser = quick_sort([x for x in arr if x < arr[0]])
        greater = quick_sort([x for x in arr if x > arr[0]])
    
        return lesser + pivots + greater
    
    def merge_sort(arr):
      def merge(left, right):
          result = []
          i = j = 0
          while i < len(left) and j < len(right):
              if left[i] < right[j]:
                  result.append(left[i])
                  i += 1
              else:
                  result.append(right[j])
                  j += 1
          result += left[i:]
          result += right[j:]
          return result
    
      if len(arr) < 2:
          return arr
      m = len(arr) / 2
      return merge(merge_sort(arr[:m]), merge_sort(arr[m:]))
    
  • Ćw 3 (opcjonalnie): Przanalizuj złożoność czasową różnych algorytmów liczenia n-tego elementu ciągu Fibonacciego. Rekurencyjny: $\Theta\big(\big(\frac{1+\sqrt(5)}{2}\big)^n\big)$ (dlaczego?), $\Theta(n)$, $\Theta(log(n))$.
  • Ćw 4 (opcjonalne): Zaimplementuj potęgowanie liczb w czasie logarytmicznym.
  • Kod z ćwiczeń