书名:数据结构与算法图解
作者:[美]杰伊.温格罗 (Jay Wengrow)
出版社:人民邮电出版社
出版时间:2019-04-01
ISBN: 9787115509000
知识点:
- 算法是指某项操作的过程
- 有序数组线性查找(代码1)
- 有序数组二分查找(代码2)
- 有序数组的线性查找O(n),二分查找O(log n,想象3个数,二分法最多仅需找2次,比如想找的是最小值,二分法先找中间值,然后确定是最小值),时间复杂度如图1所示
代码1:
def linear_search(array, value)
# 遍历数组的每一个元素
array.each do |element|
# 如果这个元素等于我们要找的值,则将其返回
if element == value
return value
# 如果这个值大于我们要找的值,则提早退出循环
elsif element > value
break
end
end
# 如果没找到,则返回空值
return nil
end
代码2:
def binary_search(array, value)
# 首先,设定下界和上界,以限定所查之值可能出现的区域。
# 在开始时,以数组的第一个元素为下界,以最后一个元素为上界
lower_bound = 0
upper_bound = array.length - 1
# 循环检查上界和下界之问的最中间的元素
while lower_bound <= upper_bound do
# 如此找出最中间的格子之索引
# (无须担心商是不是整数,因为 Ruby 总是把两个整数相除所得的小数部分去掉)
midpoint = (upper_bound + lower_bound) / 2
# 获取该中间格子的值
value_at_midpoint = array[midpoint]
# 如果该值正是我们想查的,那就完事了。
# 否则,看你是要往上找还是往下找,来调整下界或上界
if value < value_at_midpoint
upper_bound = midpoint - 1
elsif value > value_at_midpoint
lower_bound = midpoint + 1
elsif value == value_at_midpoint
return midpoint
end
end
# 当下界超越上界,便知数组里并没有我们所要找的值
return nil
end
图1 线性查找和二分查找的时间复杂度