• 数据结构-查找-折半查找-二叉排序树查找


                    折半查找

      对于关键码有序的数列,用二分法查找。

      比如123456789,要找2,先折半找5,2比5小,继续向左查找,找3,2比3小,继续向左查找,2匹配成功。

      可以想到这是个递归的过程我这里递归非递归都写一遍。

      首先是非递归的算法。

    • 传入一个vector<int> &v和一个 待查找数值k
    • 设定查找的下界=0;上界为v.size();
    • 开始循环,跳出循环有2种情况,1找到了数值,2-就是下界比上界大的情况
    • 这里开始while(下界<=上界)
    • {
    • 设置中界为(上界+下界)/2
    • if(待查值小于中间值)就把上界设置为中间位置-1
    • else if(待查值大于中间值)就把下界设置为中间位置+1
    • else 这种情况就是查找到了直接return mid中间位置就行
    • }
    • int search(vector<int>& v,int k)
      {
          int low=0,high=v.size();
          while(low<=high)
          {
              int mid=(low+high)/2;
              if(k<v[mid])high=mid-1;
              else if(k>v[mid])low=mid+1;
              else return mid;
          }
      }

      接着是递归算法,递归和非递归一个思想

    • 因为是递归很容易想到,参数要4个,1-传入数组,2-传入下界,3-传入上界,4-待查数字
    • 递归边界也像上面非递归一样,low>high或者找到的时候
    • int bin_search(vector<int>& v,int low,int high,int k)
    • 如果high<low return 0;//没找到的
    • else{中间位置=(low+high)/2;
    • 假如待查值小于中间值,则 递归调用return bin_search(v,low,mid-1,k)
    • 假如待查值大于中间值,则递归调用return bin_search(v,mid+1,high,k)
    • 找到值return mid;
    • int bin_search(vector<int>& v,int low,int high,int k)
      {
          if(low>high)return 0;
          else
          {
              int mid=(low+high)/2;
              if(k<v[mid])return bin_search(v,low,mid-1,k);
              else if(k>v[mid])return bin_search(v,mid+1,high,k);
              else return mid;
          }
      }
      //要调用就是int i=bin_search(v,0,v.size(),待查值即可).

                 和折半查找类似的是二叉排序树查找

    • 明显,二叉数的查找肯定是递归。这里默认都会二叉排序树的构建。
    • 和上面递归的查找没啥区别。
    • 直接上代码
    • BiNode<int>* bt_search(BiNode<int> *&root,int k)
      {
          if(root==NULL)return NULL;
          else if(root->data==k)return root;
          else if(root->data>k)return bt_search(root->rightchild,k);
          else return bt_search(root->leftchild,k);
      }
          
  • 相关阅读:
    CS224d lecture 6札记
    CS224d 干货(视频,笔记,论文)
    Github
    【转】在Unity中读写文件数据:LitJSON快速教程
    【转】通过制作Flappy Bird了解Native 2D中的RigidBody2D和Collider
    【转】通过制作Flappy Bird了解Native 2D中的Sprite,Animation
    【转】Unity3D Transform中有关旋转的属性和方法测试
    unity射线碰撞检测+LayerMask的使用
    【转】Unity3D 关于贝赛尔曲线,平滑曲线,平滑路径,动态曲线
    【转】Itween 贝塞尔曲线(一)
  • 原文地址:https://www.cnblogs.com/DJC-BLOG/p/9077646.html
Copyright © 2020-2023  润新知