Julia二分查找(菜鸟版)
二分查找的主要思路跟我们日常查字典思路是一样(字典的单词已经排好序):
1、先把字典翻开从中间劈成两部分,看看要查的单词在哪一部分,把它拿出来;
2、再把拿出来的那部分继续均匀劈成两半,再看看要查的单词在哪部分;
3、再把单词可能存在的那部分继续均匀劈成两半,如此循环反复,字典越劈越少。。。
很快就能找到要查的单词的那一页,这就是二分查找,速度很快,就是有点费字典。
实操案例:假如你是公司的管理人员,每天都在统计当天的营业额并进行累加,到月末最后一天累加的营业额就是当月的总营业额。假如月底你发现自己手工统计的累计额月营业额跟系统显示的对不上,于是,你决定查找究竟是哪一天统计数据对不上,这个时候就可以用上二分查找(因为累计的营业额是升序的):
1、先从月中的15号开始,如果数据无误,那么问题肯定出现在16~31号之间;
2、取16~31号中间的23号核对,发现数据有误,那么肯定是在16~23号之间出现问题;
3、取16~23号中间的日期19号进行核对,发现数据无误,那么肯定是在20~23号之间出现问题;
4、现在再取21或22号的日期再核对,很快就能找到出问题那一天。
以上都是简单的思路和应用。
下面是Julia代码实现:
1 function binary_search(arr, key) 2 lo, hi = 1, length(arr) 3 4 while lo <= hi 5 mid = lo + (hi - lo) ÷ 2 6 if key < arr[mid] 7 hi = mid - 1 8 elseif key > arr[mid] 9 lo = mid + 1 10 else 11 return mid 12 end 13 end 14 return -1 15 end 16 17 function test() 18 arr = ["abc", "def", "hij", "klm", "nop", "qrs", "tuv"] 19 println(binary_search(arr, "nop")) 20 println(binary_search(arr, "kkk")) 21 22 arr2 = [1, 2, 3, 4, 5, 6, 7, 8, 9] 23 println(binary_search(arr2, 1.2)) 24 end 25 26 test()
注意第五行的除号是Julia的整除。
运行结果如下:
5
-1
-1