Home

Blog

Photography

Me

Algorithms 101 - 1 - intro to algorithms

21 Apr 2018

算法入门笔记,基于《Grokking Algorithms: An illustrated guide for programmers and other curious people》这本书的内容

主要内容:


每一个代码片段都可以被称作一个 algorithm;很多常用的重要算法很可能在你所喜欢的语言中找到对应的实践;算法的选择是取舍的过程;有些问题到目前都还没有很有效的算法,只能拿到近似结果。


工作前提(重要!): binary search 是针对 ordered list 有序列表 的搜索算法,这是谈论前提。

假设要找到 ordered_list 中有没有 x 这个值

1.1 如何工作:
1.2 python代码示例:
 1def binary_search(ordered_list, item):
 2  low = 0
 3  high = len(ordered_list) - 1
 4
 5  while low <= high:
 6    mid = (low + high)/2
 7    guess = ordered_list[mid]
 8    if guess == item:
 9        return mid
10    if guess > item:
11        high = mid - 1
12    else:
13        low = mid + 1
14  return None
15
16my_list = [1,3,5,7,9]
17
18print binary_search(my_list, 3) #=> 4
19print binary_search(my_list, -1) #=> None

用ruby写

 1def binary_search(ordered_list, item)
 2  l_index = 0
 3  h_index = ordered_list.length - 1
 4
 5  while l_index <=  h_index
 6    mid_index = (l_index + h_index)/2
 7    guess = ordered_list[mid_index]
 8    if guess == item
 9      return "found item at index: #{mid_index}"
10    elsif guess < item
11      l_index = mid_index + 1
12    else
13      h_index = mid_index - 1
14    end
15  end
16
17  return "Not found"
18end

代码自释疑:

wikipedia 上 binary search 的示意图

2 O(log n) is faster than O(n), but it gets a lot faster once the list of items you’re searching through grows.

2.1 Big O notation

Big O notation 是用来描述一个算法快慢(算法复杂度)的术语, O 指的是 operation,代表步骤或操作(不是以时间为单位)。

Big O notation lets you compare the number of operations. It tells you how fast the algorithm grows.

O(n), O(logn) … 括号中的的值越大代表算法复杂度越高。

wikipedia 上关于不同 Big O notation 随着查找对象增加,算法复杂度的增加曲线

2.2 O(log n) 与 O(n)

从 含有n个对象的 ordered_list 中搜索一个值 x 是否存在

在ordered_list中对象数量较少时,算法复杂度相差不大,但随着列表中对象数量增加,binary search的优势会越来越明显。

list中的对象数量 O(n)需要的搜索次数 O(log n)需要的搜索次数
10 10 4
100 100 7
1 billion 1 billion 30

3 Algorithm speed isn’t measured in seconds.

每增加一次搜索,算法复杂度 +1,等于多需要一步,每一步需要的单位时间因条件而不同。Big O notation 不是以时间作为单位。

4 Traveling salesperson problem

This is one of the unsolved problems in computer science. There’s no fast known algorithm for it, and smart people think it’s impossible to have a smart algorithm for this problem. The best we can do is come up with an approximate solution.

一个还没找到有效算法的问题。地图上给出若干个点,要如何用最短的路程走完所有的点。

5 wikipedia 上的算法清单

https://en.wikipedia.org/wiki/List_of_algorithms


Recap: