38
INTRODUCTION TO ALGORITHMS: COMPUTATIONAL COMPLEXITY BY VASYL NAKVASIUK, 2013

Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

Embed Size (px)

DESCRIPTION

В эту среду, 24 апреля, Василий Наквасюк начал серию коротких докладов про алгоритмы, сложность алгоритмов, структуры данных, виды алгоритмов (сортировка, ...) и т.п. В первом докладе постарался быстро рассказать про вычислительную сложность алгоритмов и нотацию "О-большое" на примерах. * Tech Hangout – мероприятие, организованное разработчиками для разработчиков с целью обмена знаниями и опытом. Подобные встречи проводятся еженедельно по средам с 12:00 до 13:00 и охватывают исключительно инженерные темы. Формат данного ивента подразумевает под собой 30 минутный доклад на ранее определенную тему, и такую же по продолжительности дискуссию в формате круглого стола. Если у вас есть неутомимое рвение к новым знаниям, профессиональному росту, или же вы хотите поделиться своим опытом - добро пожаловать в Hangout Club! Присоединяйтесь к обсуждению - https://www.facebook.com/groups/techhangout/ Читайте нас на - http://hangout.innovecs.com/

Citation preview

Page 1: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

INTRODUCTION TOALGORITHMS:

COMPUTATIONALCOMPLEXITY

BY VASYL NAKVASIUK, 2013

Page 2: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

WHAT IS ANALGORITHM?

Page 3: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

WHAT IS AN ALGORITHM?

Important issues: correctness, elegance and efficiency.

“ An algorithm is a procedure that takes any ofthe possible input instances and transforms it

to the desired output. ”

Page 4: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

EFFICIENCYIs this really necessary?

Page 5: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

CRITERIA OF EFFICIENCY:Time complexitySpace complexity

Time complexity ≠ Space complexity ≠ Complexity ofalgorithm

Page 6: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

HOW CAN WE MEASURECOMPLEXITY?

Page 7: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

HOW CAN WE MEASURE COMPLEXITY?

EMPIRICAL ANALYSIS (BENCHMARKS)THEORETICAL ANALYSIS (ASYMPTOTIC ANALYSIS)

Page 8: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

BENCHMARKSEMPIRICAL ANALYSIS

Page 9: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

BENCHMARKSVERSION #1

WHAT MEANS “FAST”?

Page 10: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

BENCHMARKSVERSION #2

import time

start = time.time() # Return the time in seconds since the epoch.my_algo(some_input)end = time.time()

print(end - start)

0.048032498359680176

Page 11: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

BENCHMARKSVERSION #3

import timeit

timeit.timeit('my_algo(some_input)', number=1000)

1000 loops, best of 3: 50.3 ms per loop

Page 12: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

BENCHMARKSVERSION #4

import timeit

inputs = [1000, 10000, 500000, 1000000]

for input in inputs: timeit.timeit('my_algo(input)', number=1000)

list of 1000 items:1000 loops, best of 3: 50.3 ms per loop

list of 10000 items:1000 loops, best of 3: 104.7 ms per loop

list of 500000 items:1000 loops, best of 3: 459.1 ms per loop

list of 1000000 items:1000 loops, best of 3: 3.12 s per loop

Page 13: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

BENCHMARKSVERSION #5

# Intel Core i7-3970X @ 3.50GHz, RAM 8 Gb, Ubuntu 12.10 x64, Python 3.3.0

import timeit

inputs = [1000, 10000, 500000, 1000000]

for input in inputs: timeit.timeit('my_algo(input)', number=1000)

list of 1000 items:1000 loops, best of 3: 50.3 ms per loop

list of 10000 items:1000 loops, best of 3: 104.7 ms per loop

list of 500000 items:1000 loops, best of 3: 459.1 ms per loop

list of 1000000 items:1000 loops, best of 3: 3.12 s per loop

Page 14: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

EXPERIMENTAL STUDIES HAVE SEVERALLIMITATIONS:

It is necessary to implement and test the algorithm in orderto determine its running time.Experiments can be done only on a limited set of inputs, andmay not be indicative of the running time on other inputsnot included in the experiment.In order to compare two algorithms, the same hardware andsoftware environments should be used.

Page 15: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

ASYMPTOTIC ANALYSISTHEORETICAL ANALYSIS

Page 16: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

ASYMPTOTIC ANALYSISEFFICIENCY AS A FUNCTION OF INPUT SIZE

T(n) – running time as a function of n, where n – size of input.

n → ∞

Random-Access Machine (RAM)

Page 17: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

BEST, WORST, AND AVERAGE-CASECOMPLEXITY

LINEAR SEARCH

T(n) = n ?

T(n) = 1/2 ⋅ n ?

T(n) = 1 ?

def linear_search(my_item, items): for position, item in enumerate(items): if my_item == item: return position

Page 18: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

BEST, WORST, AND AVERAGE-CASECOMPLEXITY

Page 19: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

BEST, WORST, AND AVERAGE-CASECOMPLEXITY

LINEAR SEARCH

Worst case: T(n) = n

Average case: T(n) = 1/2 ⋅ n

Best case: T(n) = 1

T(n) = O(n)

def linear_search(my_item, items): for position, item in enumerate(items): if my_item == item: return position

Page 20: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

HOW CAN WE COMPARETWO FUNCTIONS?

WE CAN USEASYMPTOTIC NOTATION

Page 21: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

ASYMPTOTIC NOTATION

Page 22: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

THE BIG OH NOTATIONASYMPTOTIC UPPER BOUND

O(g(n)) = {f(n): there exist positive constants c and n0 such that

0 ≤ f(n) ≤ c⋅g(n) for all n ≥ n0}

T(n) ∈ O(g(n))

or

T(n) = O(g(n))

Page 23: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

Ω-NOTATIONASYMPTOTIC LOWER BOUND

Ω(g(n)) = {f(n): there exist positive constants c and n0 such that

0 ≤ c⋅g(n) ≤ f(n) for all n ≥ n0}

T(n) ∈ Ω(g(n))

or

T(n) = Ω(g(n))

Page 24: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

Θ-NOTATIONASYMPTOTIC TIGHT BOUND

Θ(g(n)) = {f(n): there exist positive constants c1, c2 and n0 such

that 0 ≤ c1⋅g(n) ≤ f(n) ≤ c2⋅g(n) for all n ≥ n0}

T(n) ∈ Θ(g(n))

or

T(n) = Θ(g(n))

Page 25: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

GRAPHIC EXAMPLES OF THE Θ, O AND ΩNOTATIONS

Page 26: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

EXAMPLES

3⋅n2 - 100⋅n + 6 = O(n2),because we can choose c = 3 and

3⋅n2 > 3⋅n2 - 100⋅n + 6

100⋅n2 - 70⋅n - 1 = O(n2),because we can choose c = 100 and

100⋅n2 > 100⋅n2 - 70⋅n - 1

3⋅n2 - 100⋅n + 6 ≈ 100⋅n2 - 70⋅n - 1

Page 27: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

LINEAR SEARCHLINEAR SEARCH (VILLARRIBA VERSION):

T(n) = O(n)

LINEAR SEARCH (VILLABAJO VERSION)

T(n) = O(3⋅n + 2) = O(n)

Speed of "Villarriba version" ≈ Speed of "Villabajo version"

def linear_search(my_item, items): for position, item in enumerate(items): print('poition – {0}, item – {0}'.format(position, item)) print('Compare two items.') if my_item == item: print('Yeah!!!') print('The end!') return position

Page 28: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

TYPES OF ORDER

However, all you really need to understand is that:

n! ≫ 2n ≫ n3 ≫ n2 ≫ n⋅log(n) ≫ n ≫ log(n) ≫ 1

Page 29: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

THE BIG OH COMPLEXITY FOR DIFFERENTFUNCTIONS

Page 30: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

GROWTH RATES OF COMMON FUNCTIONSMEASURED IN NANOSECONDS

Each operation takes one nanosecond (10-9 seconds).

CPU ≈ 1 GHz

Page 31: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

BINARY SEARCH

T(n) = O(log(n))

def binary_search(seq, t): min = 0; max = len(seq) - 1 while 1: if max < min: return -1 m = (min + max) / 2 if seq[m] < t: min = m + 1 elif seq[m] > t: max = m - 1 else: return m

Page 32: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

PRACTICAL USAGEADD DB “INDEX”

Search with index vs Search without index

Binary search vs Linear search

O(log(n)) vs O(n)

Page 33: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

HOW CAN YOU QUICKLY FIND OUTCOMPLEXITY?

O(?)

Page 34: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

D. E. Knuth, "Big Omicron and Big Omega and BIg Theta", SIGACT News, 1976.

“ On the basis of the issues discussed here, Ipropose that members of SIGACT, and editors

of computer science and mathematicsjournals, adopt the O, Ω and Θ notations as

defined above, unless a better alternative canbe found reasonably soon. ”

Page 35: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

BENCHMARKSOR

ASYMPTOTIC ANALYSIS?USE BOTH APPROACHES!

Page 36: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

SUMMARY1. We want to predict running time of an algorithm.2. Summarize all possible inputs with a single “size” parameter

n.3. Many problems with “empirical” approach (measure lots of

test cases with various n and then extrapolate).4. Prefer “analytical” approach.5. To select best algorithm, compare their T(n) functions.6. To simplify this comparision “round” the function using

asymptotic (“big-O”) notation7. Amazing fact: Even though asymptotic complexity analysis

makes many simplifying assumptions, it is remarkably useful

in practice: if A is O(n3) and B is O(n2) then B really will befaster than A, no matter how they’re implemented.

Page 37: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

LINKSBOOKS:

“Introduction To Algorithms, Third Edition”, 2009, byThomas H. Cormen, Charles E. Leiserson, Ronald L. Rivestand Clifford Stein“The Algorithm Design Manual, Second Edition”, 2008, bySteven S. Skiena

OTHER:

“Algorithms: Design and Analysis” by Tim Roughgarden

Big-O Algorithm Complexity Cheat Sheet https://www.coursera.org/course/algo

http://bigocheatsheet.com/

Page 38: Introduction to algorithms: computational complexity - Tech hangout #23 - 2013.04.24

THE END

THANK YOU FOR ATTENTION!Vasyl NakvasiukEmail: [email protected]: @vaxXxaGithub: vaxXxa

THIS PRESENTATION:Source:

Live:

https://github.com/vaxXxa/talks

http://vaxXxa.github.io/talks