当前位置: 首页 > news >正文

大数据算法系列4:二叉树,红黑树和B树

文章目录

  • 概述: 用于数据查找(搜索)的数据结构
  • 一. 散列表
  • 二. 布隆过滤器
  • 三. 二叉树
    • 3.1 二叉树
    • 3.2 平衡二叉树
  • 四. 红黑树
  • 五. B树
  • 六. 实例
  • 参考:

概述: 用于数据查找(搜索)的数据结构

前面的文章系列,我们都是讲排序,这次我们来讲讲另外一个应用场景: 数据搜索。

  1. 散列表
  2. 布隆过滤器
  3. 二叉树
  4. 红黑树
  5. B树

一. 散列表

通过hash函数,将数据均匀的分布在不同的bucket中,这样就大大减少了数据检索的时间。

image.png

散列函数:
散列表的性能取决于散列函数,散列函数决定了可以把原始数据集分布到多少的桶中。
image.png

动态散列表:
image.png

二. 布隆过滤器

布隆过滤器这个使用场景是比较多的。

原理是使用n个hash函数,然后分别对原始数据进行计算后存储hash函数计算之后的值。
如果它们有一个说元素不在集合中,那肯定就不在。

但是因为不同数值的hash值可能一致,所以当布隆过滤器判断数值在集合中存在的时候,不一定真的就存在,需要通过其它数据结构,再进行判断。

而且,当数据量越来越大,布隆过滤器的准确率也就越来越低。

image.png

三. 二叉树

3.1 二叉树

左边小于父节点的值
右边大于等于父节点的值
image.png

二叉树的弱点:
基于二叉查找树的这种特点,在查找某个节点的时候,可以采取类似于二分查找的思想,快速找到某个节点。n 个节点的二叉树,正常情况下,查找的时间复杂度为 O(logN)。之所以说是正常情况下,是因为二叉查找树有可能出现一种极端的情况,例如:
image.png

这种情况虽也满足二叉树的条件,但已经近似退化为一条链表,这样的二叉树的查找时间复杂度顿时变成了 O(n)。所以必须防止这种情况发生,于是引申出了平衡二叉树。

3.2 平衡二叉树

  1. 平衡二叉树是基于二分法的策略提高数据查找速度的二叉树的数据结构。

  2. 平衡二叉树是采用二分法思维把数据按规则组装成一个树形结构的数据,用这个树形结构的数据减少无关数据的检索,大大的提升了数据检索的速度。平衡二叉树的数据结构组装过程有以下规则:
    2.1) 非叶子节点只能允许最多两个子节点存在。
    2.2 ) 每一个非叶子节点数据分布规则为左边的子节点小当前节点的值,右边的子节点大于当前节点的值(这里值是基于自己的算法规则而定的,比如 hash 值)。

  3. 平衡二叉树特点:
    3.1) 非叶子节点最多拥有两个子节点。
    3.2) 非叶子节点值大于左边子节点、小于右边子节点。
    3.3)树的左右两边的层级数相差不会大于 1。
    3.4)没有值相等重复的节点。

右边的二叉树,如果是平衡二叉树的话,就会通过旋转,变化为左边的平衡二叉树。
image.png

四. 红黑树

虽然平衡树解决了二叉查找树退化为近似链表的缺点,能够把查找时间控制在 O(logn),却不是最佳的。因为平衡树要求每个节点的左子树和右子树的高度差至多等于 1,这个要求太严,导致每次进行【插入/删除】节点的时候,几乎都会破坏平衡树的第二个规则,进而都需要通过左旋和右旋来进行调整,使之再次成为一颗符合要求的平衡树。

image.png

五. B树

节点
image.png

树形
image.png

B树索引的弱点:
image.png

六. 实例

http://poj.org/problem?id=2503

package com.suanfa.数据结构;
import java.util.Scanner;
import java.util.Hashtable;

public class POJ2503 {
    public static void main(String[] args) {
        Scanner in = new Scanner( System.in );
        Hashtable<String, String> table = new Hashtable<String, String>();
        String input;
        String [] array = new String[2];
        while (in.hasNext()){
            input = in.nextLine();
            if (input.length()==0) break;
            array = input.split( " " );
            table.put( array[1], array[0] );
        }
        while (in.hasNext()){
            input= in.nextLine();
            if (table.get( input ) != null) System.out.println(table.get( input ));
            else System.out.println("eh");
        }
    }
}

参考:

  1. http://www.dataguru.cn/article-5747-1.html
  2. https://www.jianshu.com/p/b597aa97c9de
  3. https://www.iteye.com/blog/128kj-1734586

相关文章:

  • 想知道图片转表格用什么软件?不妨试试这些软件
  • 作为一名测试人员,如何拾开发者牙慧,开启兼职赚钱之路
  • Web自动化测试(二)—— Selenium-API操作
  • 【面试分享】Java 面试题(Spring Boot / Spring Cloud)
  • 【计算机毕业设计选题】10套易过的精品毕设分享(源码+论文)
  • 推荐一个最好用的高性能、低内存、跨平台的图片处理库
  • Windows使用内存映射文件
  • 基于Matlab使用激光雷达检测分类跟踪车辆仿真(附源码)
  • 火狐浏览器 优化教程
  • 计算机的发展史,让你想到了什么?
  • 记一次SQL注入的收获
  • 大数据必学Java基础(八十):网络编程的深入了解
  • 建议收藏丨你想了解的动捕内容全在这儿!
  • 基于蚂蚁-遗传优化算法的路径规划问题(Matlab代码实现)
  • 【数据结构】-----二叉树(递归、层次实现二叉树的遍历)
  • [译]Python中的类属性与实例属性的区别
  • Android开源项目规范总结
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • miaov-React 最佳入门
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • vue.js框架原理浅析
  • windows下mongoDB的环境配置
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 前端面试之闭包
  • 如何在 Tornado 中实现 Middleware
  • 实现菜单下拉伸展折叠效果demo
  • 线性表及其算法(java实现)
  • 自动记录MySQL慢查询快照脚本
  • Mac 上flink的安装与启动
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ‌内网穿透技术‌总结
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • (1)Android开发优化---------UI优化
  • (152)时序收敛--->(02)时序收敛二
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (3)(3.5) 遥测无线电区域条例
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (六)Hibernate的二级缓存
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (四)软件性能测试
  • (自适应手机端)响应式服装服饰外贸企业网站模板
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NetCore部署微服务(二)
  • .NetCore发布到IIS
  • .net和jar包windows服务部署
  • /var/log/cvslog 太大
  • @property python知乎_Python3基础之:property
  • [20171101]rman to destination.txt
  • [240727] Qt Creator 14 发布 | AMD 推迟 Ryzen 9000芯片发布
  • [4.9福建四校联考]
  • [Algorithm][综合训练][拜访][买卖股票的最好时机(四)]详细讲解