二分法
仅当列表是有序的时候,二分查找才管用。例如,电话簿中的名字是按字母顺序排列的,因此可以使用二分查找来查找名字。
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表示法像下面这样。
这指出了算法需要执行的操作数。之所以称为大O表示法,是因为操作数前有个大O。
常见的大O运行时间
O(logn):也叫对数时间,包括二分查找
O(n):也叫线性时间,包括简单查找
O(nlogn):包括快速排序
O(n^2):包括选择排序
O(n!):包括旅行商问题