2019独角兽企业重金招聘Python工程师标准>>>

1  二分查找

算法思想:

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

二分查找的时间复杂度为O(logN)

算法实现:

递归算法:

//递归算法
public int rank(Key key, int lo, int hi) {if(hi<lo)  return lo;int mid = lo + (hi-lo)/2;int cmp = key.compareTo(keys[mid]);if(cmp<0)   return rank(key,lo,hi-1);if(cmp>0)   return rank(key,mid+1,hi);else return mid;
}

非递归算法:

//非递归算法
public int rank(Key key) {int lo = 0, hi = N-1;while(lo<=hi) {int mid = lo + (hi-lo)/2;int cmp = key.compareTo(keys[mid]);if(cmp<0) hi = mid-1;if(cmp>0)    lo = mid+1;else return mid;}return lo;
}

2  二叉查找树

定义:

二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:

  • 若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;
  • 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
  • 左、右子树也分别为二叉排序树;

步骤:

若根结点的关键字值等于查找的关键字,成功。否则,若小于根结点的关键字值,递归查左子树。若大于根结点的关键字值,递归查右子树。若子树为空,查找不成功。

二叉查找树的时间复杂度为O(logN)

算法实现:

结点类:

private class Node{private Key key;private Value val;private Node left,right;private int N;public Node(Key key,Value val, int N) { this.key = key; this.val = val; this.N = N; }
}

其中N为以该节点为根的子树的节点总数,计算方法如下:

size(x) = size(x.left) + size(x.right) + 1

查找方法:

递归查找,如果小于当前结点,递归去左子树查找;如果大于当前结点,递归去右子树查找。

public Value get(Key key) {return get(root,key);
}
public Value get(Node x,Key key) {if(x==null)return null;int cmp = key.compareTo(x.key);if(cmp<0) return get(x.left,key);if(cmp>0) return get(x.right,key);else return x.val;
}

插入方法:

先查找,如果树中已经存在相应的键,只需更新值;如果查询无果,指针也已经指向了应该插入的位置,用要插入的键值对新创结点并插入到相关位置。

public void put(Key key,Value val) {root = put(root,key,val);
}
private Node put(Node x,Key key,Value val) {if(x == null) return new Node(key,val,1);int cmp = key.compareTo(x.key);if(cmp<0) x.left = put(x.left,key,val);//插入左子树if(cmp>0)   x.right = put(x.right,key,val);//插入右子树else x.val = val;//更新值x.N = size(x.left) + size(x.right)+1;return x;
}

删除方法:

  1. 即将被删除的节点记为t
  2. x指向它的后继节点min(t.right)
  3. 将x的右链接链接到x的父节点的左链接上(即替换掉原x的位置)
  4. 用x节点替换t节点(将t.left和t.right设为x.left和x.right)
public void delete(Key key) {root = delete(root,key);
}
private Node delete(Node x,Key key) {if(x == null)    return null;int cmp = key.compareTo(x.key);if(cmp<0)    x.left = delete(x.left,key);if(cmp>0)   x.right = delete(x.right,key);else {if(x.right == null)      return x.left;if(x.left == null)      return x.right;Node t = x;x = min(t.right);x.right = deleteMin(t.right);x.left = t.left;}x.N = size(x.left)+size(x.right)+1;return x;
}

转载于:https://my.oschina.net/HuoQibin/blog/1590855

二分查找和二叉查找树相关推荐

  1. 数据结构与算法——二分查找与二叉查找树汇总整理

    目录 预备知识:二分查找基础知识 例1:插入位置(easy) (二分查找) 例2:区间查找(medium)(二分查找) 例3:旋转数组查找(medium)(二分查找) 预备知识:二叉查找(排序)树基础 ...

  2. 二分查找--AVL查找树

    Data Mining 开启阅读模式 二分查找--AVL查找树 二分查找可以找到元素在数组中的下标位置,而查找树由于采用的是树结构,所以只能判断出元素是不是在树中以及给出最大/小值,而不能确定指定元素 ...

  3. 插入,冒泡,选择,快速排序,二分查找

    一. 直接插入排序 void insertSort(int[] a){       for(int i=1;i<a.length; i++){            if (a[i]<a[ ...

  4. 数据结构树之二分查找树

    二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树: ...

  5. 《漫画算法2》源码整理-1 二分查找树 AVL树 红黑树

    二分查找树 public class BinarySearchTree {private Node root;//查找结点public Node search(int data) {Node targ ...

  6. 二分查找法的实现和应用汇总

    此文转自:http://www.cnblogs.com/ider/archive/2012/04/01/binary_search.html 在学习算法的过程中,我们除了要了解某个算法的基本原理.实现 ...

  7. 索引存储模型-二分查找

    双十一过去之后,你女朋友跟你玩了一个猜数字的游戏. 猜猜我昨天买了多少钱,给你五次机会. 10000?低了.30000?高了.接下来你会猜多少? 20000.为什么你不猜11000,也不猜29000 ...

  8. 【数据结构与算法】二分查找

    一.什么是二分查找? 二分查找针对的是一个有序的数据集合,每次通过跟区间中间的元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间缩小为0. 二.时间复杂度分析? 1.时间复杂度 ...

  9. POJ 2785 有多少种4个数相加等于0的方案(二分查找 or hash)

    文章目录 1.二分查找法 1.1 思路: 1.2 AC代码 2.hash查找法 2.1 思路: 2.2 Wrong Answer 代码 2.3 Time Limit Exceeded 代码 2.4 偷 ...

最新文章

  1. android 按住拖动gallery防止马上加载数据导致gallery卡的方法
  2. Linux head和tail指令
  3. Oracle的下载安装教程以及所出现的问题
  4. python数据挖掘课程】十七.社交网络Networkx库分析人物关系(初识篇)
  5. oracle根据当前月份往前,oracle获取系统日期--当前时间+前一天+当前月+前一个月...
  6. 计算机视觉实战(十一)Scale Invariant Feature Transform(SIFT)(附完整代码)
  7. Data Structures(Chapter 3 of The Algorithm Design Manual)
  8. 是时候更换你的无线路由器(wifi暴力破解)
  9. 微软私有云的数据保护之神——DPM
  10. 分布式事务 - 两阶段提交与三阶段提交
  11. 发现孔子家谱很有意思事情,南宗,北宗是怎么回事?
  12. win10取消微软帐户绑定使用本地账户登录的解决方法
  13. 如何在Excel中调用Python脚本,实现数据自动化处理!
  14. 一篇可能让你每年多赚5万的写简历技术贴!
  15. 【钱包·RPC搭建】以太坊主网节点搭建
  16. flash读取xml简明实例教程
  17. 通信系列1: 电话的前世今生
  18. 【fcgi-2.4.0】移植fcgi-2.4.0到armv7平台
  19. 将光驱文件拷入linux系统方法
  20. 使用程序员的电脑是怎样一种体验?网友:被打了,,

热门文章

  1. 单链表(不带头结点)
  2. 小米wifi每天晚上准时断网_小米 11再次确定,将于28日准时发布,售价更感人
  3. java boolean是什么_java中的boolean与Boolean有什么不同
  4. python中astr是啥_python的基本操作
  5. java做 binggo,Linux启动与停止spring boot工程的脚本示例
  6. php 5.3.9 漏洞,PHP-5.3.9远程执行任意代码漏洞(CVE-2012-0830) 详解
  7. db2 空值转换函数_Hive常见函数的使用
  8. 安卓mysql插入数据_【11-25求助】关于Android 的SQLite数据库插入数据报错问题
  9. 星光 SaaS 伙伴甄云科技:如何构建更适合快成长企业的数字化采购管理平台?
  10. 适用于Linux的Windows子系统WSL