概述

二叉树BSTs很容易实现,并且如果BSTs的键插入的顺序非常接近随机模型,那么BSTs能够提供快速搜索和插入。

很多程序开发者选用BSTs来实现symbol-table(键值对表),因为这样的实现支持快速的rank(查询第几位的值),select、delete、和范围查询操作。

但是,最坏的情况下,使用二叉树,其性能仍然是不能让人忍受的。基于二叉树的实现,好的性能是基于键基本满足随机的键,这样能保证树不可能包含太多的长的路径。

使用快速排序的时候,我们能够使随机化;但是使用一个symbole-table的API,我们没有这种自由,因为客户控制着混合操作。

实际上,二叉树最坏的情况不是不可能出现——当客户按照正向顺序或逆向顺序插入键(keys)的时候,最坏的情况就出现了。

剖析二分查询树

每个节点都有两个分叉;

左分叉上的节点值小于父节点的值,右分叉上的节点值大于父节点上的值;

从上往下将二分查询树的节点投影到一条线上,从左到右,节点的值依次增大;

任何一个节点x上,其元素的个数为: size(x)=size(x.left)+size(x.right)+1

一、基本的结构

public class BinarySearchTreeSymbolTable<Key extends Comparable<Key>, Value> {private Node root;private class Node{private Key key;private Value value;private Node left,right;private int N;public Node(Key key, Value value, int N){this.key = key;this.value = value;this.N = N;}}public int size(){return size(root);}public int size(Node x){if (x == null) return 0;return x.N;}
}

二、查询和插入

查询一个key对应的value值

    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);else if (cmp>0) return get(x.right, key);else return x.value;}

插入key和value值

    public void put(Key k, Value v){root = put(root, k, v);}public Node put(Node x, Key k, Value v){if (x==null) return new Node(k, v, 1);int cmp = k.compareTo(x.key);if (cmp<0) x.left = put(x.left, k, v);else if (cmp>0) x.right = put(x.right, k, v);else x.value = v;x.N = size(x.left) + size(x.right) + 1;return x;}

三、最大值、最小值和地板、天花板

最大值和最小值

    public Key min(){if (root==null) return null;return min(root).key;}public Node min(Node x){if (x.left == null) return x;return min(x.left);}public Key max(){if (root==null) return null;return max(root).key;}public Node max(Node x){if (x.right == null) return x;return max(x.right);}

地板(floor):在BST中查找一个最大值,这个最大值小于或等于key

    /*** the largest key in the BST less than or equal to key* @param key* @return*/public Key floor(Key key){Node x = floor(root, key);if (x == null) return null;return x.key;}private Node floor(Node x, Key key){if (x==null) return null;int cmp = key.compareTo(x.key);if (cmp==0) return x;if(cmp<0) return floor(x.left, key);Node t = floor(x.right, key);if (t!=null) return t;else return x;}

天花板(ceiling):在BST中查找一个最小值,这个最小值大于或等于Key

    /*** the smallest key in the BST greater than or equal to key* @param key* @return*/public Key ceiling(Key key){Node x = ceiling(root, key);if (x == null) return null;return x.key;}public Node ceiling(Node x, Key key){if (x==null) return null;int cmp = key.compareTo(x.key);if (cmp == 0) return x;if (cmp>0) return ceiling(x.right, key);Node t = ceiling(x.left, key);if (t!=null) return t;else return x;}

四、查询第几个元素、查询元素的位置

查询第k个位置的元素(从0开始计数):select

    public Key select(int  ki){Node x = select(root, ki);if (x!=null) return x.key;return null;}public Node select(Node x, int ki){if (x==null) return null;int t = size(x.left);if (t>ki) return select(x.left, ki);else if (t<ki) return select(x.right, ki-t-1);else return x;}

查询比元素key小的元素个数:rank

   public int rank(Key key){return rank(root, key);}public int rank(Node x, Key key){if (x==null) return 0;int cmp = key.compareTo(x.key);if (cmp<0) return rank(x.left, key);else if (cmp>0) return size(x.left) + 1 + rank(x.right, key);else return size(x.left);}

五、遍历二分查询树、查询一个范围内的所有值

按照下面做,能够按照顺序进行遍历

    public Iterable<Key> keys(){return keys(min(), max());}public Iterable<Key> keys(Key lo, Key hi){Queue<Key> queue = new Queue<>();keys(root, queue, lo, hi);return queue;}private void keys(Node x, Queue<Key> queue,Key lo, Key hi){if (x==null) return;int cmpLo = lo.compareTo(x.key);int cmpHi = hi.compareTo(x.key);if (cmpLo<0) keys(x.left, queue, lo, hi);if (cmpLo<=0 && cmpHi>=0) queue.enqueue(x.key);if (cmpHi>0) keys(x.right, queue, lo ,hi);}

基于二分查询树(BinarySearchTrees)实现的键值对表(symbole-table)相关推荐

  1. 语言非递归求解树的高度_算法素颜(11):无死角“盘”它!二分查找树

    引言 <菜鸟也能"种"好二叉树!>一文中提到了:为了方便查找,需要进行分层分类整理.而满足这种目标的数据结构之一就是树. 树的叶子节点可以看作是最终要搜寻的目标物:叶子 ...

  2. 基于LSM-Tree的键值存储引擎的设计与实现

    资源下载地址:https://download.csdn.net/download/sheziqiong/85709667 资源下载地址:https://download.csdn.net/downl ...

  3. mybatis返回map键值对_mybatis返回map结果集怎么配置

    匿名用户 1级 2018-06-10 回答 一.概述 MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返 ...

  4. mybatis返回map键值对_mybatis返回map key怎么指定

    展开全部 一.概述 MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是 ...

  5. 分布式键值存储ETCD

    分布式键值存储 前言 实现分布式系统的目标以及挑战 分布式ETCD存储 etcd介绍 基于etcd的使用场景 1.键值对存储 2.服务注册与发现 3.消息发布与订阅 4.分布式锁 etcd相关术语(关 ...

  6. 集合与泛型集合与键值对集合

    1,集合 (Connections) ArrayList arr = new ArrayList();//可以add arr.Add("Hello girls!");//支持添加o ...

  7. LeetCode 981. 基于时间的键值存储(哈希+二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 创建一个基于时间的键值存储类 TimeMap,它支持下面两个操作: set(string key, string value, int timestamp ...

  8. 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)

    议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...

  9. 数据蒋堂 | 用HBase做高性能键值查询?

    作者:蒋步星 来源:数据蒋堂 本文共1400字,建议阅读9分钟.本文与你探讨HBase做高性能键值查询的可行性. 最近碰到几家用户在使用HBase或者试图使用HBase来做高性能查询,场景也比较类似, ...

  10. 二分查找树性能分析(Binary Search Tree Performance Analysis)

    经典算法系(21)-二分查找树性能分析(Binary Search Tree Performance Analysis)https://www.douban.com/note/221942390/   ...

最新文章

  1. 导出数据库API接口文档
  2. Mycat原理、应用场景
  3. 深入云原生 AI:基于 Alluxio 数据缓存的大规模深度学习训练性能优化
  4. 鸿蒙手机启动器apk下载,澪Pro启动器本体下载最新版
  5. php中update()函数,update_option()函数
  6. Layui的轮播事件和echarts插件事件
  7. 最大功率点跟踪_华北电力大学颜湘武团队特稿:基于变功率点跟踪和超级电容器储能协调控制的双馈风电机组一次调频策略...
  8. iphone登录不了媒体服务_ios快捷指令一键登录校园网(桂航为例,哆点认证)
  9. php 如果判断是utf,php 判断网页是否是utf8编码的方法_PHP教程
  10. linux的/dev内容介绍
  11. WebService的简单实现
  12. java连接数据库增删改查公共方法
  13. 《Python数据挖掘:概念、方法与实践》一1.3 在数据挖掘中使用哪些技术
  14. windows程序设计简介
  15. 桌面共享工具(可以实现RTMP直播、K歌、投屏等功能)
  16. npcap关闭_npcap是什么软件
  17. mybatisplus代码生成器
  18. 戴尔服务器虚拟光驱,SupportAssist
  19. UE4中的委托和事件
  20. 全市场等权中位数_市场指数估值周报20200406

热门文章

  1. java不显示图片_java图片显示不出来应该如何解决
  2. java超类_Java——超类和子类对象之间的转换
  3. 用html+css制作简单好看的登陆注册界面
  4. 内存条带宽的换算方法以及DDR4内存理论带宽
  5. python 爬取taptap热门榜
  6. 高级计算机器,高级计算器最新版
  7. Github上Python超越Java,应届人工智能程序员年薪30w+
  8. 支付系统中,账户体系的设计与记账处理
  9. 打开计算机文件反应慢怎么解决方法,电脑反应慢怎么办?常见原因与解决办法...
  10. python 读取.sgy地震文件到三维ndarray矩阵,(全网仅此一份)