二分法的查找图解
- 格式:doc
- 大小:43.50 KB
- 文档页数:2
二分法查找1、二分查找(Binary Search)二分查找又称折半查找,它是一种效率较高的查找方法。
二分查找要求:线性表是有序表,即表中结点按关键字有序,并且要用向量作为表的存储结构。
不妨设有序表是递增有序的。
2、二分查找的基本思想二分查找的基本思想是:(设R[low..high]是当前的查找区间)(1)首先确定该区间的中点位置:(2)然后将待查的K值与R[mid].key比较:若相等,则查找成功并返回此位置,否则须确定新的查找区间,继续二分查找,具体方法如下:①若R[mid].key>K,则由表的有序性可知R[mid..n].keys均大于K,因此若表中存在关键字等于K的结点,则该结点必定是在位置mid左边的子表R[1..mid-1]中,故新的查找区间是左子表R[1..mid-1]。
②类似地,若R[mid].key<K,则要查找的K必在mid的右子表R[mid+1..n]中,即新的查找区间是右子表R[mid+1..n]。
下一次查找是针对新的查找区间进行的。
因此,从初始的查找区间R[1..n]开始,每经过一次与当前查找区间的中点位置上的结点关键字的比较,就可确定查找是否成功,不成功则当前的查找区间就缩小一半。
这一过程重复直至找到关键字为K的结点,或者直至当前的查找区间为空(即查找失败)时为止。
3、二分查找算法int BinSearch(SeqList R,KeyType K){ //在有序表R[1..n]中进行二分查找,成功时返回结点的位置,失败时返回零int low=1,high=n,mid;//置当前查找区间上、下界的初值while(low<=high){ //当前查找区间R[low..high]非空mid=(low+high)/2;if(R[mid].key==K) return mid;//查找成功返回if(R[mid].kdy>K)high=mid-1; //继续在R[low..mid-1]中查找elselow=mid+1;//继续在R[mid+1..high]中查找}return 0;//当low>high时表示查找区间为空,查找失败} //BinSeareh二分查找算法亦很容易给出其递归程序【参见练习】4、二分查找算法的执行过程设算法的输入实例中有序的关键字序列为(05,13,19,21,37,56,64,75,80,88,92)要查找的关键字K分别是21和85。
简单二分法1. 什么是二分法二分法(Binary Search)是一种常用的查找算法,也称为折半查找。
它的原理很简单,通过将查找范围不断缩小,最终找到目标元素或确定目标元素不存在。
二分法的应用广泛,包括在查找有序数列、旋转有序数列中的元素、判断一个数的开方等方面。
2. 二分法的基本思想二分法的基本思想是将查找范围不断地二等分,然后确定目标元素可能存在的一侧。
在每次二等分之后,通过比较目标元素和中间元素的大小关系,可确定下一次二分的方向,并缩小查找范围。
3. 二分法的递归实现3.1 算法步骤1.确定查找范围的起始位置start和结束位置end,初始时start为0,end为数列长度减1。
2.计算查找范围的中间位置mid,可以使用公式mid = (start + end) // 2进行计算。
3.当start大于end时,表示查找范围为空,即目标元素不存在。
此时返回-1或其他特定值作为查找失败的标志。
4.比较中间位置mid的元素与目标元素的大小关系:–如果中间位置的元素等于目标元素,则直接返回mid,表示找到目标元素。
–如果中间位置的元素大于目标元素,则说明目标元素可能存在于左半边,将查找范围缩小到[start, mid-1],并递归调用二分法。
–如果中间位置的元素小于目标元素,则说明目标元素可能存在于右半边,将查找范围缩小到[mid+1, end],并递归调用二分法。
5.重复步骤2到步骤4,直到找到目标元素或确定目标元素不存在。
3.2 递归实现代码示例(Python)def binary_search_recursive(arr, target, start, end):if start > end:return -1mid = (start + end) // 2if arr[mid] == target:return midelif arr[mid] > target:return binary_search_recursive(arr, target, start, mid-1) else:return binary_search_recursive(arr, target, mid+1, end)4. 二分法的迭代实现4.1 算法步骤1.确定查找范围的起始位置start和结束位置end,初始时start为0,end为数列长度减1。
简单二分法简单二分法简介二分法是一种常用的查找算法,也被称为折半查找。
它是一种高效的算法,时间复杂度为O(logn)。
简单二分法是最基础、最常见的二分法。
原理简单二分法是在一个有序数组中查找某个元素。
它的核心思想是将数组分成两部分,如果目标元素比中间元素大,则在后半部分查找;否则在前半部分查找,直到找到目标元素或者确定目标元素不存在。
步骤1. 确定数组的左右边界left和right。
2. 计算中间位置mid = (left + right) / 2。
3. 如果目标值等于中间位置的值,则返回mid。
4. 如果目标值小于中间位置的值,则在左半部分继续查找,即right = mid - 1。
5. 如果目标值大于中间位置的值,则在右半部分继续查找,即left = mid + 1。
6. 重复步骤2-5,直到left > right或者找到目标元素为止。
代码实现下面是一个简单的二分查找实现:```pythondef binary_search(nums, target):left, right = 0, len(nums) - 1while left <= right:mid = (left + right) // 2if nums[mid] == target:return midelif nums[mid] < target:left = mid + 1else:right = mid - 1return -1```注意事项1. 数组必须是有序的。
2. 如果数组中有重复元素,无法保证返回的是第一个或最后一个出现的位置。
3. 如果目标元素不存在于数组中,需要特殊处理,例如返回-1或抛出异常。
4. 在计算mid时,要注意整数除法会向下取整,因此应该使用(left + right) // 2而不是(left + right) / 2。
5. 在确定边界时,要注意数组下标从0开始还是从1开始。
总结简单二分法是一种高效的查找算法,在处理有序数组时非常实用。
计算机二分法查找
二分法(又称折半查找)是一种在有序数组中查找某一特定元素的搜索算法。
具体实现过程如下:
1. 定义变量low、high分别表示有序数组的起始下标和结束下标;
2. 定义变量mid表示数组中间元素的下标(mid=(low+high)/2),并取得该元素的值;
3. 如果该元素等于查找值,直接返回该元素的下标;
4. 如果该元素大于查找值,则说明查找值在当前元素的左侧,将high设为mid-1,并重新计算mid的值;
5. 如果该元素小于查找值,则说明查找值在当前元素的右侧,将low设为mid+1,并重新计算mid的值;
6. 重复以上过程,直到找到查找值或者low>high。
下面是一个示例代码:
```
int binary_search(int arr[], int n, int target) {
int low = 0, high = n - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return -1; // 查找失败
}
```
其中,arr是有序数组,n是数组大小,target是要查找的值。
如果查找成功,返回该值在数组中的下标;否则返回-1。
二分法查找数值
二分法查找数值
二分法,也叫二分查找,是一种在有序数组中查找特定元素的算法。
其基本思想是每次取数组中间的值与目标值进行比较,然后根据比较结果舍弃一半的数据,直到找到目标值或者发现目标值不存在为止。
二分法查找数值的具体步骤如下:
1. 初始化左右指针,left=0,right=n-1。
(n为数组长度)
2. 当left小于等于right时,进行以下操作:
3. 取中间值middle=(left+right)/2。
4. 如果中间值等于目标值,返回目标值的位置。
5. 如果中间值大于目标值,说明目标值在middle的左侧,将right更新为middle-1。
6. 如果中间值小于目标值,说明目标值在middle的右侧,将left更
新为middle+1。
7. 如果循环结束还没有找到目标值,说明目标值不存在,返回-1。
二分法的时间复杂度为O(logN),是一种十分高效的查找算法,因此
在很多情况下都被广泛应用。
其中包括在数据量较大的有序数组中查
找特定元素,以及在游戏中对答案进行猜测等。
总之,二分法通过逐步缩小查找范围,可以快速高效地查找指定元素,是一种很实用的算法。
在实际使用时,需要注意的是数组必须是有序的,否则无法保证算法正确性。
同时,由于函数栈空间有限,在数据
量较大时需要注意是否会爆栈。
二分法查找
二分查找也称折半查找(Binary Search),是一种在有序数组中查找目标值的算法。
它的基本思想是将数组分为两部分,然后判断目标值可能存在的那一部分,并继续在该部分中进行查找,以此逐渐缩小查找范围,直到找到目标值或确定不存在。
二分查找的基本实现步骤如下:
1. 确定数组的左边界和右边界,初始时左边界为0,右边界为数组长度减1。
2. 计算数组的中间位置mid,可以使用公式mid = (left + right) / 2。
3. 比较中间位置的元素与目标值的大小关系:
- 如果中间位置的元素等于目标值,则找到目标值,返回中间位置。
- 如果中间位置的元素大于目标值,则目标值可能在左侧部分,更新右边界为mid - 1。
- 如果中间位置的元素小于目标值,则目标值可能在右侧部分,更新左边界为mid + 1。
二分查找虽然思路简单,但在实现过程中需要注意细节,如循环中的不等号是否应该带等号,mid是否应该加一等。
分析这些细节的差异以及出现这些差异的原因,有助于更加灵活准确地实现二分查找算法。
计算机二分法查找例子二分查找是一种常用的查找算法,也被称为折半查找。
它是在一个有序数组中查找一些特定元素的位置。
二分查找的原理是每次将查找范围缩小一半,直到找到目标元素或确定目标元素不存在。
下面我将通过一个例子来详细说明二分查找的过程。
假设有一个有序数组arr[],其中包含以下元素:arr[] = {2, 4, 7, 9, 12, 15, 18, 21, 25, 29}我们要查找的目标元素是12、首先,我们需要找到数组的中间元素。
计算中间元素的索引是通过将数组的起始索引和结束索引相加并除以2来得到的:mid = (0 + 9) / 2 = 4得到中间元素的索引为4,然后我们将目标元素12与中间元素arr[4]进行比较。
由于目标元素大于中间元素,所以我们可以确定目标元素一定位于数组的后半部分。
接下来,我们将查找范围缩小到后半部分,并重复上述过程。
现在,我们需要找到后半部分的中间元素:mid = (5 + 9) / 2 = 7得到中间元素的索引为7,然后我们将目标元素12与中间元素arr[7]进行比较。
由于目标元素小于中间元素,所以我们可以确定目标元素一定位于数组的前半部分。
再次缩小查找范围,我们继续重复上述过程。
现在,我们需要找到前半部分的中间元素:mid = (5 + 6) / 2 = 5得到中间元素的索引为5,然后我们将目标元素12与中间元素arr[5]进行比较。
由于目标元素等于中间元素,所以我们找到了目标元素的位置。
在这个例子中,通过三次比较,我们找到了目标元素12的位置。
接下来,我们来看一个没有目标元素的例子。
假设有一个有序数组arr[]:arr[] = {2, 4, 7, 9, 12, 15, 18, 21, 25, 29}我们要查找的目标元素是5、同样的,首先找到数组的中间元素:mid = (0 + 9) / 2 = 4得到中间元素的索引为4,然后我们将目标元素5与中间元素arr[4]进行比较。
二分法的查找图解
最近做了几家笔试题,基本在选择题都考到二分查找法的次数。
由于对下标和数组大小的不确定,做错了好几个,今天,希望通过图解来说明一下二分查找的比较次数。
二分查找:给定数组是有序的,给定一个key值。
每次查找最中间的值,如果相等,就返回对应下标,如果key大于最中间的值,则在数组的右半边继续查找,如果小于,则在数组左半边查找,。
最终有两种结果,一种是找到并返回下标,第二种是没找到。
下面给个例子说明一下:
有一个数组arr[10];
0 1 2 3 4 5 6 7 8 9
定义两个边界下标low和high,定义中间下标mid;
low=0;high=10-1; mid = (low+high)/2;
在进行每一步的比较时,low<=high;
如果我们寻找key为56的值的下标。
第一次我们找到中间下标mid = 4;
0 1 2 3 4 5 6 7 8 9
low mid high
arr[4] = 11,比当前key值小,所以我们在右半边查找,令low = mid + 1;high不变;
我们找到中间下标mid = (5+9)/2 =7;
0 1 2 3 4 5 6 7 8 9
low mid high
arr[7] = 33,比当前key值小,所以我们在右半边查找,令low = mid + 1;high不变;
我们找到中间下标mid = (8+9)/2 =8;
0 1 2 3 4 5 6 7 8 9
low mid high
此时key == arr[mid] == arr[8];停止查找,返回下标mid;
所以在查找56的时候,比较次数为3次。
下面给出代码
int search(int arr[],int n,int key)
{
int low = 0,high = n-1; // n个数据-1,high不能超数组元素个数的上限;
int mid,count=0;
while(low<=high)
{
mid = (low+high)/2;
if(arr[mid] == key)
return mid;
if(arr[mid]<key)
low = mid + 1;
else
high = mid - 1;
}
return -1;
}
继续举例解析:
通过上列进行说明:需要让程序计算出当前的key 值对应的温度是多少℃?
arr[10] = { 3 , 6,7, 10,11,16,20,33,56,89}; //=从0-9℃的10个温度AD值从小到大排列(有序);
key=55; // key 假设是AD采用到的数值;
int search(int arr[],int n,int key)
{
int low = 0,
high = 10-1; // 数据10 -1=9个,high不能超数组元素个数的上限;
int mid=0;
while(low<=high)
{
mid = (low+high)/2; //先计算出数据的平均值,然后待人数组中找数据来比较;
if( key >= arr[mid] && key <= arr[mid+1] )
return mid;
if(arr[mid]<key)
low = mid + 1; //从原来mid值+1重新赋值
else
high = mid - 1; //从原来mid值-1重新赋值
}
return -1;
}。