求二分查找基本思想~
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
二分查找,别称折半查找
Binary-Search
优点:查找速度快
条件:待查表为有序表
1算法要求:必须采用顺序存储结构
2.必须按关键字大小有序排列。
算法复杂度:假设其数组长度为n,其算法复杂度为o(log(n))
下面提供一段二分查找实现的伪代码:
BinarySearch(max,min,des)
mid-《(max+min)/2
while(min《=max)
mid=(min+max)/2
if mid=des then
return mid
elseif mid 》des then
max=mid-1
else
min=mid+1
return max
折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如 果x《a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x》a[n/2],则我们只要在数组a的右 半部继续搜索x。
二分查找的算法复杂度
二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x《a[n/2],则只要在数组a的左半部分继续搜索x,如果x》a[n/2],则只要在数组a的右半部搜索x.
时间复杂度无非就是while循环的次数!
总共有n个元素,
渐渐跟下去就是n,n/2,n/4,….n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数
由于你n/2^k取整后》=1
即令n/2^k=1
可得k=log2n,(是以2为底,n的对数)
所以时间复杂度可以表示O()=O(logn)
下面提供一段二分查找实现的伪代码:
BinarySearch(max,min,des)
mid-《(max+min)/2
while(min《=max)
mid=(min+max)/2
if mid=des then
return mid
elseif mid 》des then
max=mid-1
else
min=mid+1
return max
折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如 果x《a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x》a[n/2],则我们只要在数组a的右 半部继续搜索x。
二分查找算法
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而
查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表
分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,
使查找成功,或直到子表不存在为止,此时查找不成功。
int binSearch(const int *Array,int start,int end,int key)
{
int left,right;
int mid;
left=start;
right=end;
while (left《=right) { /注释中为递归算法,执行效率低,不推荐
mid=(left+right)/2;
/* if (key《Array[mid]) {
return(binSearch(Array,left,mid,key));
}
else if(key》Array[mid]){
return (binSearch(Array,mid+1,right,key));
}
else
return mid;
*/
if (key《Array[mid]) {
right=mid-1;
}
else if(key》Array[mid]){
left=mid+1;
}
else
return mid;
}
return -1;
}
顺序表的顺序查找和二分查找
顺序查找,二分查找和哈希查找算法,它们各自的特点是:
1.对比顺序查找的特点就是从表的第一个元素开始一个一个向下查找,如果有和目标一致的元素,查找成功;如果到最后一个元素仍没有目标元素,则查找失败。
2.二分查找的特点就是从表中间开始查找目标元素。如果找到一致元素,则查找成功。如果中间元素比目标元素小,则仍用二分查找方法查找表的后半部分(表是递增排列的),反之中间元素比目标元素大,则查找表的前半部分。
3.哈希算法的特点是是使用给定数据构造哈希表,然后在哈希表上进行查找的一种算法。先给定一个值,然后根据哈希函数求得哈希地址,再根据哈希地址查找到要找的元素。是通过数据元素的存储地址进行查找的一种算法。
C#二分查找算法
二分查找的基本思想是:(设R[low..high]是当前的查找区间)
(1)首先确定该区间的中点位置:mid=(low+high)/2
(2)然后将待查的K值与R[mid].key比较:若相等,则查找成功并返回此位置,否则须确定新的查找区间,继续二分查找
// Source:
public int search(int q)
{
int i, low = 0, high = q.Length – 1, middle;
Console.Write(“请输入想要查找的数字:“);
i=int.Parse(Console.ReadLine());
while (low 《= high)
{
middle = (low + high) / 2;
if (i == q[middle])return i;
if (i 《 q[middle])high = middle – 1;
else low = middle + 1;
}
throw new Exception(“数组中不存在这个数。“);
}
如果数据是有序的,可以采用二分查找算法以获得更高的效率对吗
摘要
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
咨询记录 · 回答于2021-11-11
如果数据是有序的,可以采用二分查找算法以获得更高的效率对吗
亲,您好,很高兴为您服务!正在为您努力整理答案中,大概在2-3分钟左右回复您,麻烦您稍等一下啦,谢谢您哟
亲。您好感谢您的耐心等待
亲,是可以提高查询速度的呢
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
所以对于这种有序的结构,二分查找是最优的查询呢~
亲,如果您对我的服务满意请给赞鼓励一下呢,谢谢您哟!祝您生活愉快!
用顺序表实现二分查找算法
#include《iostream》
using namespace std;
int a;
int find1(int l,int r,int x)
{
int m=(l+r)/2;
if(l》r)//查找失败
return -1;
if(x==a[m])//查找成功返回下标
return m;
else if(x》a[m])
find1(m+1,r,x);//查找右边
else if(x《a[m])
find1(l,m-1,x);//查找左边
}
int main()
{//折半查找,待查找数列必须有序(升序或降序)
int x,n,num;
cin》》n;//输出n待查找数列长度
for(int i=0;i《n;i++)
cin》》a[i];//输入n个数
cin》》x;//输入查找值
num=find1(0,n,x);//调用折半查找函数(返回下标)
if(num!=-1)//数组下标0~n-1;返回-1查找失败
{
cout《《x《《“:在数组中的位置 “;
cout《《num《《endl;
}
else
cout《《“查找失败“《《endl;
return 0;
}
对比顺序查找,二分查找和哈希查找算法,它们各自的特点是什么
顺序查找,二分查找和哈希查找算法,它们各自的特点是:
1.对比顺序查找的特点就是从表的第一个元素开始一个一个向下查找,如果有和目标一致的元素,查找成功;如果到最后一个元素仍没有目标元素,则查找失败。
2.二分查找的特点就是从表中间开始查找目标元素。如果找到一致元素,则查找成功。如果中间元素比目标元素小,则仍用二分查找方法查找表的后半部分(表是递增排列的),反之中间元素比目标元素大,则查找表的前半部分。
3.哈希算法的特点是是使用给定数据构造哈希表,然后在哈希表上进行查找的一种算法。先给定一个值,然后根据哈希函数求得哈希地址,再根据哈希地址查找到要找的元素。是通过数据元素的存储地址进行查找的一种算法。