二分查找和二叉查找树

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539827.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

台式计算机技术方案,2017年4月自考02316计算机应用技术真题及答案

本文提供的是2017年4月自考02316计算机应用技术真题及答案&#xff0c;真题不仅能帮助考生复习巩固学到的知识&#xff0c;还能让考生了解以往考试难易程度&#xff0c;真正掌握一套真题那么考试也不用担心了。要考试的你一定要多多练习啊。2017 年 4 月高等教育自学考试全国统…

理解lua中 . : self

文章目录[点击展开](?)[] 前言点号定义和调用冒号定义和冒号调用运行结果相互调用相互调用运行结果总结前言 在LUA中&#xff0c;经常可以看到&#xff1a;. self&#xff0c;今天在CSDN上看到一篇博客写的很清楚&#xff0c;转载过来 原文出处&#xff1a;http://blog.csdn.n…

SecureCRT配置

一、下载 路径&#xff1a;http://www.pc6.com/softview/softview_24396.html 里面有破解教程 二、配置 1、选择仿真环境养眼的绿色字体黑色背景配置&#xff0c;选择 traditional option->Global options –>default session -> edit default settings -> 修改…

怎么用计算机弹c哩c哩,计算器音乐c哩c哩乐谱 | 手游网游页游攻略大全

发布时间&#xff1a;2016-06-29铲子骑士乐谱有什么用 铲子骑士乐谱卖不了怎么办.不少铲子骑士玩家收集了一些乐谱,那么这些乐谱功能是什么呢?下面99单机网小编给大家介绍铲子骑士乐谱有什么用 铲子骑士乐谱卖不了怎么办. 乐谱可以卖钱,还可以更换游戏中的音乐 ...标签&#x…

Windows 7 资源管理器搜索Channel 9 视频

在Windows 7 中Federated Search 可以通过OpenSearch 协议访问到远程数据资源&#xff0c;也就意味着用户可以使用资源管理器&#xff08;Windows Explorer&#xff09;搜索并浏览远程数据。本篇我们将制作一个搜索连接器&#xff08;Search Connector&#xff09;查找Channel …

sts html视图编辑器,免费的HTML可视化编辑器HBuilder前端开发编辑器 | 老疯子

互联网上几款比较热门的编辑器Dreamweaver、Notepad、Sublime Text、Vim、Emacs等&#xff0c;这些或许你用过其中之一或许听说过它们。这些都是国外人员开发的有些甚至被公认为是最受专业程序员喜爱的代码编辑器(Vim和Emacs)。都是国外的&#xff0c;那国内的呢&#xff1f;当…

sum(x) over( partition by y ORDER BY z ) 分析

参考的博文出处&#xff1a;http://www.cnblogs.com/luhe/p/4155612.html&#xff0c;对博文进行了修改新增&#xff0c;修改了错误的地方 之前用过row_number()&#xff0c;rank()等排序与over( partition by ... ORDER BY ...)&#xff0c;这两个比较好理解: 先分组&#xff…

idea数据库反向生成实体类_IntelliJ IDEA 的数据库管理工具实在太方便了

1. 前言对于一个有软件洁癖的人&#xff0c;能用现有的软件解决问题的绝不安装新的软件。Java后端开发主要跟数据库打交道&#xff0c;所以数据库图形化界面&#xff08;GUI&#xff09;是少不了的。通常图形化操作关系型数据库&#xff08;RMDBS&#xff09;大多数人会选择Nav…

家装强电弱电布线图_关于你不知道的弱电改造详解 提早了解好做准备

在我们的日常生活中&#xff0c;没有一处是不用电的。洗衣、做饭、看电视&#xff0c;这些我们生活中看起来平淡无奇的小事&#xff0c;离开电却难以为继。今天&#xff0c;装一网为大家介绍弱电改造&#xff0c;很多业主不知道弱电改造是什么意思&#xff0c;也不知道弱电改造…

SecureCRT配置前--Linux网卡设置

在用SecureCRT连接Linux的时候&#xff0c;需要设置Linux的网卡信息。 1、输入命令&#xff1a;setup&#xff0c;弹出配置&#xff0c;选择Network configuration&#xff0c;配置网络 2、选择device configuration 配置网卡 3、选择eth0&#xff0c;第一块网卡 4、配置eth0网…

cdn节点人少延迟高_让你刷剧一直爽,CDN原理是什么

鼠年春节&#xff0c;一个特别的春节。受疫情影响&#xff0c;假期比往年长了一些。这么长时间宅在家中&#xff0c;想必大家除了睡觉&#xff0c;花费时间最多的就是“刷剧”了。今天讲的技术主题就和“刷剧”有关&#xff0c;它是CDN。我们通过观察CDN的技术来看CDN的产业发展…

图形的装饰教案计算机,《电脑图案设计师》教案教学设计

《电脑图案设计师》教案教学设计《电脑图案设计师》是湖北长江出版集团出版的小学《信息技术》四年级上册第四单元第二次活动的内容。这节课研究的是Windows画图软件中的“翻转/旋转”和“拉伸/扭曲”两条命令。根据我们对学生的了解和教材的分析&#xff0c;认为这两个知识点如…

boot spring 没有父子容器_Spring 系列(二):Spring MVC的父子容器

1.背景在使用Spring MVC时候大部分同学都会定义两个配置文件&#xff0c;一个是Spring的配置文件spring.xml&#xff0c;另一个是Spring MVC的配置文件spring-mvc.xml。在这里给大家抛个问题&#xff0c;如果在spring.xml和spring-mvc.xml文件中同时定义一个相同id的单例bean会…

Linux创建目录【命令】

创建一个hello目录 mkdir /hello -------------------------------------- mkdir 相当于 make directory 相对路径&#xff1a;不从/开始&#xff0c;而是从当前目录开始&#xff0c;例如&#xff1a;data/ ,mnt/zmg绝对路径&#xff1a;从/开始的目录&#xff0c;就叫绝对…

手术后多久可以做胆摘除_近视手术后多久可以化眼妆?

今天小编就和大家聊聊&#xff0c;做完近视手术后&#xff0c;多久可以画眼妆&#xff1f;很多女生做完手术后&#xff0c;非常关心的一件事情就是多久可以化妆&#xff0c;化妆对手术效果有没有影响&#xff1f;今天&#xff0c;小编就此问题特别咨询了屈光手术专家。专家建议…

【CentOS 7LAMP架构4】,PHP5和PHP7的安装和配置#171219

2019独角兽企业重金招聘Python工程师标准>>> hellopasswd 安装PHP5 PHP官网www.php.net当前主流版本为5.6/7.1cd /usr/local/srcwget http://cn2.php.net/distributions/php-5.6.30.tar.bz2bzip2 -d php-5.6.30.tar.bz2tar xvf php-5.6.30.tarcd php-5.6.30./config…

Linux修改文件内容【命令】

在/opt/hello/world.txt文件中增加一行 hello linux world ! 方法一&#xff1a; 命令是&#xff1a;vi&#xff0c;vim vi 编辑器&#xff0c;相当于记事本&#xff0c;有编辑功能&#xff0c;但较弱 vim 复杂的编辑器&#xff0c;相当于windows的 editplus, notepad 等 …

hadoop中的9000端口代表什么_hadoop服务快速部署

这篇文章记录下针对不同的hadoop版本进行服务部署的过程&#xff0c;希望可以帮到你们安装docker hadoop2.7.0一键部署docker hadoop3.0.0集群(一个master 三个slave)安装docker hadoop 3.2.0 a、docker启动 b、docker compose方式启动安装hadoop 2.7.0版本安装命令docker run …

迷你世界电锯机器人_迷你世界:生产果冻的机器人,1分钟产出500个,10种口味随意挑选...

迷你世界是一款具有创意性和想象力的3D沙盒游戏&#xff0c;在游戏中玩家们总是能造出各种好玩的建筑物&#xff0c;毕竟背包里拥有成百上千的道具可供玩家们随意使用&#xff0c;而且一些道具相互叠加使用&#xff0c;还能产生更有趣的效果。近日就有一位大神使用多种道具&…

底层实现红黑树_图解:红黑树

注&#xff1a;本文比较硬核但是很值得大家花心思看完&#xff0c;看完你一定会有所收获的红黑树是面试中一个很经典也很有难度的知识点&#xff0c;网传字节跳动面试官最喜欢问这个问题。很多人会觉得这个知识点太难&#xff0c;不想花太多功夫去了解&#xff0c;也有人会认为…