重返Ruby之路Day22 ---算法学习

252 阅读2分钟

二分法

仅当列表是有序的时候,二分查找才管用。例如,电话簿中的名字是按字母顺序排列的,因此可以使用二分查找来查找名字。

array = [ 11, 13, 17, 19, 23, 29, 31 ]

def binary_search(array, target)

  head = 0
  tail = array.count - 1

  while head <= tail

    center = (head + tail) / 2

    if array[center] == target
      return "index = #{center}"
    elsif array[center] < target
      head = center + 1
    else
      tail = center - 1
    end

  end

  return "index is nothing"

end

target = 17

p binary_search(array, target)

运行时间

一般而言,应选择效率最高的算法,以最大限度地减少运行时间或占用空间。简单查找逐个地检查数字,如果列表包含100个数字,最多需要猜100次。如果列表包含40亿个数字,最多需要猜40亿次。换言之,最多需要猜测的次数与列表长度相同,这被称为线性时间(linear time)。 二分查找则不同。如果列表包含100个元素,最多要猜7次;如果列表包含40亿个数字,最多需猜32次。

大O表示法

大O表示法指出了算法有多快。例如,假设列表包含n个元素。简单查找需要检查每个元素,因此需要执行n次操作。使用大O表示法,这个运行时间为O(n)。单位秒呢?没有——大O表示法指的并非以秒为单位的速度。大O表示法让你能够比较操作数,它指出了算法运行时间的增速。 再来看一个例子。为检查长度为n的列表,二分查找需要执行log n次操作。使用大O表示法,这个运行时间怎么表示呢?O(log n)。一般而言,大O表示法像下面这样。

image.png 这指出了算法需要执行的操作数。之所以称为大O表示法,是因为操作数前有个大O。

常见的大O运行时间

O(logn):也叫对数时间,包括二分查找

O(n):也叫线性时间,包括简单查找

O(nlogn):包括快速排序

O(n^2):包括选择排序

O(n!):包括旅行商问题