二分查找和二叉查找树
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;
}
删除方法:
- 即将被删除的节点记为t
- x指向它的后继节点min(t.right)
- 将x的右链接链接到x的父节点的左链接上(即替换掉原x的位置)
- 用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:插入位置(easy) (二分查找) 例2:区间查找(medium)(二分查找) 例3:旋转数组查找(medium)(二分查找) 预备知识:二叉查找(排序)树基础 ...
- 二分查找--AVL查找树
Data Mining 开启阅读模式 二分查找--AVL查找树 二分查找可以找到元素在数组中的下标位置,而查找树由于采用的是树结构,所以只能判断出元素是不是在树中以及给出最大/小值,而不能确定指定元素 ...
- 插入,冒泡,选择,快速排序,二分查找
一. 直接插入排序 void insertSort(int[] a){ for(int i=1;i<a.length; i++){ if (a[i]<a[ ...
- 数据结构树之二分查找树
二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树: ...
- 《漫画算法2》源码整理-1 二分查找树 AVL树 红黑树
二分查找树 public class BinarySearchTree {private Node root;//查找结点public Node search(int data) {Node targ ...
- 二分查找法的实现和应用汇总
此文转自:http://www.cnblogs.com/ider/archive/2012/04/01/binary_search.html 在学习算法的过程中,我们除了要了解某个算法的基本原理.实现 ...
- 索引存储模型-二分查找
双十一过去之后,你女朋友跟你玩了一个猜数字的游戏. 猜猜我昨天买了多少钱,给你五次机会. 10000?低了.30000?高了.接下来你会猜多少? 20000.为什么你不猜11000,也不猜29000 ...
- 【数据结构与算法】二分查找
一.什么是二分查找? 二分查找针对的是一个有序的数据集合,每次通过跟区间中间的元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间缩小为0. 二.时间复杂度分析? 1.时间复杂度 ...
- 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 偷 ...
最新文章
- android 按住拖动gallery防止马上加载数据导致gallery卡的方法
- Linux head和tail指令
- Oracle的下载安装教程以及所出现的问题
- python数据挖掘课程】十七.社交网络Networkx库分析人物关系(初识篇)
- oracle根据当前月份往前,oracle获取系统日期--当前时间+前一天+当前月+前一个月...
- 计算机视觉实战(十一)Scale Invariant Feature Transform(SIFT)(附完整代码)
- Data Structures(Chapter 3 of The Algorithm Design Manual)
- 是时候更换你的无线路由器(wifi暴力破解)
- 微软私有云的数据保护之神——DPM
- 分布式事务 - 两阶段提交与三阶段提交
- 发现孔子家谱很有意思事情,南宗,北宗是怎么回事?
- win10取消微软帐户绑定使用本地账户登录的解决方法
- 如何在Excel中调用Python脚本,实现数据自动化处理!
- 一篇可能让你每年多赚5万的写简历技术贴!
- 【钱包·RPC搭建】以太坊主网节点搭建
- flash读取xml简明实例教程
- 通信系列1: 电话的前世今生
- 【fcgi-2.4.0】移植fcgi-2.4.0到armv7平台
- 将光驱文件拷入linux系统方法
- 使用程序员的电脑是怎样一种体验?网友:被打了,,
热门文章
- 单链表(不带头结点)
- 小米wifi每天晚上准时断网_小米 11再次确定,将于28日准时发布,售价更感人
- java boolean是什么_java中的boolean与Boolean有什么不同
- python中astr是啥_python的基本操作
- java做 binggo,Linux启动与停止spring boot工程的脚本示例
- php 5.3.9 漏洞,PHP-5.3.9远程执行任意代码漏洞(CVE-2012-0830) 详解
- db2 空值转换函数_Hive常见函数的使用
- 安卓mysql插入数据_【11-25求助】关于Android 的SQLite数据库插入数据报错问题
- 星光 SaaS 伙伴甄云科技:如何构建更适合快成长企业的数字化采购管理平台?
- 适用于Linux的Windows子系统WSL