二分查找和二叉树的羁绊!!

最近博主的老师让博主写一个二分查找,并且计算他的时间复杂度。

首先我是这样写的:

1 #include<stdio.h>

2 #include<assert.h>

3

4 void binary_search(int arr[],int len,int num){

5         assert(arr);

6         int left = 0;

7         int right = len-1;

8         while(left<right){

9                 int mid = (left+right)/2;

10                 if(num == arr[mid]){

11                         printf("%d\n",mid);

12                         break;

13                 }

14                 else if(num > arr[mid])

15                         left = mid+1;

16                 else if(num < arr[mid])

17                         right = mid-1;

18                 else

19                         printf("not find\n");

20         }

21 }

22

23 int main(){

24         int arr[] = {1,2,3,4,5,6,7,8};

25         int len = sizeof(arr)/sizeof(arr[0]);

26         int num = 7;

27         binary_search(arr,len,num);

28 return 0;

29 }

但是这里有两个明显的bug:

1.  while(left<right)里边界判断条件应该写成while(left<=right),试想当数组只有一个元素时就会出现错误结果;

2. int mid = (left+right)/2;也有问题,当   left+right的值相当大超出了int型整数的范围时,就会溢出。应该写成 int mid = left+(right-left)/2 。

接下来我们来看看二分查找的时间复杂度为什么是O(logn)

关于二分查找的思想:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

关于满二叉树:一棵深度为h且有 2^h-1个结点的二叉树。满二叉树是一种特殊的完全二叉树。表示为:

假设现在有一棵满二叉树,他的左孩子都小于根节点,右孩子都大于根节点,然后我们发现二分查找(升序)其实就是满排序二叉树!!那么现在我们将根节点看作每次查找的arr[mid],要找到某一个元素需要将这一棵树展开,我们记作2^h-1=n,也就是说展开的次数h=log2^(n+1).

这里的h就是查找所需的次数,用O的渐进表示法就是O(log2^n).

楼主表达能力有限,各位有没有细思极恐嘞?

时间: 2024-12-29 23:13:47

二分查找和二叉树的羁绊!!的相关文章

在路上---学习篇(一)Python 数据结构和算法 (5)二分查找、二叉树遍历

独白: 利用算法进行查找指定元素,最近学习二分查找和二叉树遍历.二分查找前提是在有序中进行查找,二叉树引入了树的概念.树的概念其中有许多小知识点,也是一种新的数据结构.还是之前的感悟,需了解其本质才会写出更好的算法. 二分查找 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用

深入浅出数据结构C语言版(12)——从二分查找到二叉树

在很多有关数据结构和算法的书籍或文章中,作者往往是介绍完了什么是树后就直入主题的谈什么是二叉树balabala的.但我今天决定不按这个套路来.我个人觉得,一个东西或者说一种技术存在总该有一定的道理,不是能解决某个问题,就是能改善解决某个问题的效率.如果能够先了解到存在的问题以及已存在的解决办法的不足,那么学习新的知识就更容易接受,也更容易理解. 万幸的是,二叉树的讲解是可以按照上述顺序来进行的.那么,今天在我们讨论二叉树之前,我们先来讨论一种情形.一种操作:假设现在有一个数组,数组中的数据按照某

折半查找/二分查找 以及二叉树的 三种遍历方式

二分查找   线性查找 1.二分查找 public class BinarySearch { /** * 二分查找 * @param data * @return */ public int binarySearch(long[] data,long n) { //左右 端点 int left =0; int right =data.length-1; //中间元素 int mid=-1; while(left<right){ // 有两种情况 1.left = right 2. left>r

查找算法(I) 顺序查找 二分查找 索引查找

查找 本文为查找算法的第一部分内容,包括了基本概念,顺序查找.二分查找和索引查找.关于散列表和B树查找的内容,待有空更新吧. 基本概念 查找(search)又称检索,在计算机上对数据表进行查找,就是根据所给条件查找出满足条件的第一条记录(元素)或全部记录. 若没有找到满足条件的记录,则返回特定值,表明查找失败:若查找到满足条件的 第一条记录,则表明查找成功,通常要求返回该记录的存储位置或记录值本身,以便进行进一步处理:若需要查找到满足条件的所有记录,则可看做在多个区间内连 续查找到满足条件的第一

基础算法之二分查找

二分查找 利用分治法,逐渐苏小查找范围,适用于有序数组. 时间复杂度是O(log2N). PS:二分查找算法的判定过程实际上可以借助一棵平衡二叉树来描述,中间位置的关键字可以看成二叉树的根节点. C++代码如下: 1 #include <iostream> 2 using namespace std; 3 template<class DataType> int binSearch(DataType key[],int n,DataType k) 4 { 5 int low=0,h

数据结构之二分查找树总结

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 二分查找树BST(也叫二叉查找树.二叉排序树)的提出是为了提供查找效率,之所以称为二分查找树,因为该二叉树对应着二分查找算法,查找平均的时间复杂度为o(logn),所以该数据结构的提出是为了提高查找效率. 定义 二分查找树或者是一棵空树,或者具有下列性质: 1.若它的左子树不为空,则左子树上所有结点的值均小于根结点的值: 2.若它的右子树不为空,则右子树上所有结点的值均大于根结点的值: 3.它的左右子树均为二分查找树. 操作 二分查找树的操作主

转:线性表的查找-二分查找

转自:http://student.zjzk.cn/course_ware/data_structure/web/chazhao/chazhao9.2.2.1.htm 二分查找 1.二分查找(Binary Search)     二分查找又称折半查找,它是一种效率较高的查找方法.    二分查找要求:线性表是有序表,即表中结点按关键字有序,并且要用向量作为表的存储结构.不妨设有序表是递增有序的. 2.二分查找的基本思想    二分查找的基本思想是:(设R[low..high]是当前的查找区间) 

2. C#数据结构与算法 -- 查找算法(顺序查找,哈希查找,二分查找(折半),索引,二叉)

1. 顺序查找算法 ===================================================== 算法思想简单描述: 最突出的查找类型就是从记录集的开始处顺次遍历每条记录,直到找到所要的记录或者是 到达数据集的末尾.这就是所谓的顺序查找.顺序查找(也被称为线性查找)是非常容易实现 的.从数组的起始处开始,把每个访问到的数组元素依次和所要查找的数值进行比较.如果找 到匹配的数据项,就结束查找操作.如果遍历到数组的末尾仍没有产生匹配,那么就说明此数 值不在数组内. ==

八大排序算法二分查找

import java.util.ArrayList;import java.util.Arrays;import java.util.List; import org.junit.Test; public class InsertSort { public static void display(int[] arr){ System.out.print("["); for(int i=0;i<arr.length;i++){ if(i == arr.length-1){ Sys