I have a date with Algorthim
来源:互联网 发布:java数据结构视频 编辑:程序博客网 时间:2024/06/03 20:27
I have a date with Algorthim
- 定义:
- 在计算机科学中, 二分搜索(binary search), 也称折半搜索(half-interval search)、对数搜索(logarithmic search), 是一种在有序数组中查找某一特定元素的搜索算法.
- 搜索过程从数组的中间元素开始, 如果中间元素正好是要查找的元素, 则搜索过程结束;
- 如果某一特定元素大于或者小于中间元素, 则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较.
- 如果在某一步骤数组为空, 则代表找不到.(也就代表遍历完整个数组也没有找到这个元素).
- 这种搜索算法每一次比较都使搜索范围缩小一半.
- 解析步骤:
- 给予一个包含n个带值元素的数组A或是记录
A0 ... An−1
, 使得A0 ≤ ... ≤ An−1
(有序数组), 以及目标值T
,还有下列用来搜索T在A中位置的子程序.- a. 令
L
为0,R
为n− 1. - b. 如果
L > R
, 则搜索以失败告终. - c. 令
m
(中间值元素)为(L + R) / 2
加上下高斯符号. - d. 如果
Am < T
, 令L为m + 1并回到步骤二. - e. 如果
Am > T
, 令R为m - 1并回到步骤二. - f. 当
Am = T
, 搜索结束: 回传值m.
- a. 令
- 这个迭代步骤会持续通过两个变量追踪搜索的边界.
- 有些实际应用会在算法的最后放入相等比较, 让比较循环更快, 但平均而言会多一层迭代.
- 这时候需要联想分治的思想, 分解的
子问题
之间相互独立
且与原问题的形式相同
. - 最重要的就是
子问题的合并
可以得到原问题的解.
- 给予一个包含n个带值元素的数组A或是记录
- 大致匹配:
- 以上程序只适用于完全匹配, 也就是查找一个目标值的位置.
- 不过,因为有序数组的顺序性,将二分搜索算法扩展到能适用大致匹配并不是很重要.
- 举例来说, 二分搜索算法可以用来计算一个赋值的排名(或称秩, 比它更小的元素的数量)、前趋(下一个最小元素)、后继(下一个最大元素)以及最近邻.
- 搜索两个值之间的元素数目的范围查询可以借由两个排名查询(又称秩查询)来运行.
- 排名查询可以使用调整版的二分搜索来运行.
- 借由在成功的搜索回传
m
, 以及在失败的搜索回传L
, 就会取而代之地回传了比起目标值小的元素数目. 前趋
和后继
查询可以借由排名查询来运行.- 一旦知道目标值的排名, 其前趋就会是那个位于其排名位置的元素(因为它是小于目标值的最大元素).
- 其后继是(数组中的)下一个元素, 或是(非数组中的)前趋的下一个元素.
- 目标值的最近邻可能是前趋或后继, 取决于何者较为接近.
- 范围查询也是直接了当的.
- 一旦知道两个值的排名,
不小于第一个值且小于第二个值的元素
数量就会是两者排名的差. - 这个值可以根据范围的端点是否算在范围内, 或是数组是否包含其端点的对应键来增加或减少1.
- 复杂度分析:
- 时间复杂度
- 折半搜索每次把搜索区域减少一半, 时间复杂度为 O(log n).(n代表集合中元素的个数)
- 空间复杂度
- O(1).
- 虽以递归形式定义, 但是尾递归, 可改写为循环.
- 时间复杂度
- 示例代码:
// 递归版本 int binary_search(const int arr[], int start, int end, int khey) { if (start > end) // 上面的L > R return -1; int mid = start + (end - start) / 2; //直接平均可能會溢位,所以用此算法 if (arr[mid] > khey) return binary_search(arr, start, mid - 1, khey); if (arr[mid] < khey) return binary_search(arr, mid + 1, end, khey); return mid; //最後檢測相等是因為多數搜尋狀況不是大於要不就小於 }
// while循环 int binary_search(const int arr[], int start, int end, int khey) { int mid; while (start <= end) { mid = start + (end - start) / 2; //直接平均可能會溢位,所以用此算法 if (arr[mid] < khey) start = mid + 1; else if (arr[mid] > khey) end = mid - 1; else return mid; //最後檢測相等是因為多數搜尋狀況不是大於要不就小於 } return -1; }
//javascript版本 Array.prototype.binary_search = function(low, high, khey) { if (low > high) return -1; var mid = parseInt((high + low) / 2); if (this[mid] > khey) return this.binary_search(low, mid - 1, khey); if (this[mid] < khey) return this.binary_search(mid + 1, high, khey); return mid; };
# python版本 def binary_search(arr,start,end,hkey): if start > end: return -1 mid = start + (end - start) / 2 if arr[mid] > hkey: return binary_search(arr, start, mid - 1, hkey) if arr[mid] < hkey: return binary_search(arr, mid + 1, end, hkey) return mid
//c#版本 static int binary_search(int[] arr, int start, int end, int khey) { int mid; while (start <= end) { mid = (start + end) / 2; if (arr[mid] < khey) start = mid + 1; else if (arr[mid] > khey) end = mid - 1; else return mid; } return -1; }
JackDan9 Thinking.
JackDan9 with Algorthim.
谢谢您阅读我的博客!
0 0
- I have a date with Algorthim.
- I have a date with Algorthim
- Date(have a date)
- I have a dream
- I Have A Dream
- I have a dream
- I have a Dream
- I have a dream
- I Have a dream!
- I have a draem!
- I Have A Dream
- I have a dream
- I Have A dream
- I have a dream
- I have a dream
- I have a dream
- I have a dream
- I Have A Dream !
- Machine Learning第四讲[神经网络: 表示] --(一)动因
- Leetcode -- 34. Search for a Range
- linux ssh的安装与配置以及实现密钥登录
- 【4月21日】单例模式:饿汉和懒汉
- 杨辉三角
- I have a date with Algorthim
- 二叉树专题总结
- 计算1到n的阶乘
- 如何写出高效的SQL语句(从建表到查询一步一步往后说)
- Java控制语句和冒泡排序练习
- 练习
- peeqo
- 我排第几个
- (牛客网)双核处理