mysql详解之B树的查询时间复杂度

news2024/12/30 3:11:22

前言

本文是我在看了这篇文章之后(这篇文章对b树的时间复杂度总结的很全面),关于B树(或B+树)时间复杂度做的进一步思考(如果对解题过程不感兴趣,可以直接看最后的总结)。

正题

在这篇文章中,得知B树在内存里的时间复杂度是:

O ( log ⁡ 2 m ⋅ log ⁡ m n ) O(\log_2^m \cdot \log_m^n) O(log2mlogmn)

然后我就想比较一下B树和二叉树的时间复杂度。我们知道二叉树的时间复杂度是O(logn)【计算机行业的简写:把底数2给省略了】,完整的数学公式是:

O ( log ⁡ 2 n ) O(\log_2^n) O(log2n)

怎么比较呢?前者有两个变量,后者只有一个变量。我们可以给m固定几个数,然后观察几条函数曲线。

使用一个在线函数绘制工具

在这里插入图片描述

第一个是二叉树的时间复杂度函数。后三个分别是b+树的时间复杂度函数,m分别为3,4,5。

发现一个惊人的结果:他们看起来好像都完全重合了

莫非 log ⁡ 2 m ⋅ log ⁡ m n = log ⁡ 2 n \log_2^m \cdot \log_m^n = \log_2^n log2mlogmn=log2n

在网上搜了一下相关的对数公式,没什么解题思路。

难道他们只是约等于? 只是误差很小,看不出来?不过也有可能是自己高中数学知识还给老师了,不会解而已(因为我把这个函数曲线无论怎么放大,或者往后看,都是一样的,应该不至于误差那么小)。

但当我用m去假设,带入m=2。m=4。 m=8尝试化简,结合一个对数公式,居然找到解题思路了。


解:

根据公式

m n ⋅ log ⁡ a b = log ⁡ a n b m \frac{m}{n} \cdot \log_a^b = \log_{a^n}^{b^m} nmlogab=loganbm

m = 2 x m = 2^x m=2x

变换( n = n 1 n = n^1 n=n1)之后,根据前面的那个公式,可得到

log ⁡ 2 m ⋅ log ⁡ m n = log ⁡ 2 2 x ⋅ log ⁡ 2 x n 1 = x ⋅ ( 1 x ⋅ log ⁡ 2 n ) = log ⁡ 2 n \log_2^m \cdot \log_m^n = \log_2^{2^x} \cdot \log_{2^x}^{n^1} = x \cdot ( \frac{1}{x} \cdot \log_2^n) = \log_2^n log2mlogmn=log22xlog2xn1=x(x1log2n)=log2n


稍微解释一下:m 为什么可以等于 2 x 2^x 2x
m在这里就是大于2的自然数,这句话其实就是问 2 x 2^x 2x能不能表示任意一个大于2的自然数。当然是可以的,因为 2 x 2^x 2x是一条大于0的连续曲线。

所以:在内存里,当元素一样,b+树在一个节点内也采用二分法查找元素(最快的方式)。b树和二叉树的时间复杂度都是O(logN)

总结

在内存里(不考虑磁盘io的特殊性),n叉树的查询时间复杂度都是O(logN)。

其他

关于开头那篇博客的最后一句:

log ⁡ m N 可 以 简 写 为 l o g N \log_m^N 可以简写为 logN logmNlogN

我是不太认同的。

按照作者的意思,底数m的变化对结果影响不大,可以省略。

下面这几条曲线从上到下,依次对应左边从上到下的四个函数(m=2,m=3,m=100,m=1000)

在这里插入图片描述

看函数曲线,对数函数确实变化非常缓,底数对结果影响也没那么明显。

当n=1000000(一百万)时

二叉树需要遍历20次,而“1000叉树”只需要2次。如果在内存里,差别确实不大,都会非常快。

但作者那句话的前提是:考虑磁盘IO。也就是说这是在讨论类似数据库的场景。

在100万正常数据量的情况下,二叉树需要磁盘io达到20次,这肯定是不可接受的。

而m=1000就是mysql一般的分叉数量级(度数),这也就我们说的:mysql的B+索引树一般就是3层

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

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

相关文章

Java继承(extends)简明教程

继承是面向对象的三大特征之一。继承和现实生活中的“继承”的相似之处是保留一些父辈的特性,从而减少代码冗余,提高程序运行效率。 Java 中的继承就是在已经存在类的基础上进行扩展,从而产生新的类。已经存在的类称为父类、基类或超类&…

物联网和大数据可应用在哪些领域?

物联网和大数据可应用在哪些领域?物联网和大数据是近年来最受媒体和企业关注的两大宏观技术趋势。两者也并驾齐驱,物联网旨在特定组织或环境中创建一个互联网络,使用该网络来收集数据并集中执行特定功能。物联网部署会生成大量以前未开发的数…

【MR】C++ bullet客户端基于MR的动力学仿真

程序基于(A minimal example showing how to use PyBullet from C over shared memory.一个展示如何在共享内存上从c使用PyBullet的最小示例。https://github.com/erwincoumans/pybullet_cpp_sharedmemory_example)实现与pybullet服务器通信交互。加上MR…

MySql按条件插入数据,MySQL插入语句写where条件,MySQL在插入时做幂等

文章目录写在前面根据条件插入数据1、先准备测试数据2、正常的插入语句3、有条件的插入语句(重点)4、查看最终结果总结分析写在前面 使用MySQL的删、改、查功能时,我们都可以根据where条件来对指定数据进行操作。 插入语句如何通过where条件…

Git —— 关于创建多对非对称公钥时对不同服务器的匹配问题

Git —— 关于创建多对非对称密钥时对不同服务器的匹配问题 《工欲善其事,必先利其器》—— 既然点进来了,麻烦你看下去,希望你有不一样的收获~ 《 前言 》 大概是半年前,我写过一篇关于 git 连接托管平台提示 permission denied…

经典算法冒泡排序之标志位优化版

前言 今天总结一下优化版的经典算法——冒泡排序,不同于以往的暴力二重for循环,这里的冒泡排序增加了一个标志位。我们要理解该冒泡排序的概念,算法流程与算法思想,探讨时间复杂度。 冒泡排序算法解析 一、理解冒泡排序思想 1…

Selenium4+Python3系列(十一) - Page Factory设计模式

写在前面: Page Object模式,目的是将元素定位和元素操作分层,只接触测试内容,不写基础内容,便于后续对自动化测试用例体系的维护,这是中心思想,也是核心。 那么我们继续将简洁延续&#xff0c…

Allegro如何铺网格铜详细操作指导

Allegro如何铺网格铜的三种方法操作指导 在做PCB设计的时候,时常需要铺网格铜,尤其是对于绕性有要求的时候,Allegro可以快捷铺出网格铜,类似下图 具体操作如下 直接铺网格铜 选择Shape add Rect命令 Option Type选择Static Crosshatch 画出需要的图形 鼠标右击done,…

详解go语言包管理方式(go mod), 分析多目录多文件下的管理,不同工程下包的相互调用

先明白一个点, 想要成功运行一个go程序, 有两种模式 一: 以前的默认模式,必须将项目放在gopath/src下 二:使用go mod 包管理方式, 项目可以放到任意位置,这样目录下需要有go.mod文件 下边我会分…

毕业设计 stm32单片机的目标检测与跟踪系统 -物联网 openmv 嵌入式

文章目录0 前言课题简介设计框架3 硬件设计4 软件设计对被测物体的识别判断被测物体所在区域5 最后0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年…

力扣(LeetCode)1812. 判断国际象棋棋盘中一个格子的颜色(C++)

数学 如果我们把国际象棋的横轴看做从 111 到 888 ,那么每个棋子的坐标形如 a1(1,1)a1(1,1)a1(1,1) c4(3,4)c4(3,4)c4(3,4) ,想想坐标之和有没有什么规律。 规律 : 黑子坐标之和为偶数,白子坐标之和为奇数。 横轴坐标是我们自定义的&#x…

基于蚁群算法的三维路径规划算法以及蚁群算法的优化计算——TSP优化(Matlab代码实现)

目录 1 概述 1.1简介 1.2 改进的蚁群算法 2 部分运行结果 2.1 三维路径规划算法 2.2 TSP优化算法 3 Matlab代码实现 4 参考文献 1 概述 1.1简介 当前社会, 很多用户需要在复杂的没有公路的山地地形, 快速、准确的规划出三维路径, 在避过障碍的同时达到某项指标最优。…

【C++笔试强训】第四天

文章目录选择题编程题选择题 #include<iostream> #include<cstdio> using namespace std; int main(){int m0123, n123;printf("%o %o\n", m, n);return 0; }程序运行后的输出结果是&#xff08;&#xff09; A 0123 0173 B 0123 173 C 123 173 D 173 1…

RabbitMQ基本使用

先会用&#xff0c;知道mq是干嘛的&#xff0c;怎么用RabbitMQ 再去考虑一系列深入东西 一&#xff1a;什么是MQ MQ消息队列详解、四大MQ的优缺点分析_从百草园杀到三味书屋&的博客-CSDN博客 理解什么是MQ MQ在企业/程序中的作用是什么&#xff1f; MQ&#xff0c;中文是…

Fluent的porous jump边界条件

1 porous jump简介 多孔介质指内部具有连通的空洞&#xff0c;可使流体穿过的固体。多孔介质具有以下特点&#xff1a; 流道极复杂&#xff0c;活性炭过滤器等随机排布的多孔介质甚至不存在可通过曲面和实体表征的确定流道多孔介质只是流场的一部分&#xff0c;通常不关注多孔…

DataSphere Studio数据应用开发管理集成框架【DSS基础】

https://github.com/WeBankFinTech/DataSphereStudio/https://gitee.com/WeBank/DataSphereStudio 基于插拔式的集成框架设计&#xff0c;及计算中间件 Linkis &#xff0c;可轻松接入上层各种数据应用系统&#xff0c;让数据开发变得简洁又易用。在统一的 UI 下&#xff0c;Da…

[附源码]Python计算机毕业设计Django中小学课后延时服务管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

前端_Vue_2.创建一个Vue应用、模板语法

文章目录一、创建一个Vue应用1.1. 应用实例1.2. 根组件1.3. 挂载应用1.3.1. DOM中的根组件模板1.4. 应用配置1.5. 多个应用实例二、模板语法2.1. 文本插值2.2. 原始HTML2.3. Attribute绑定2.3.1. 简写2.3.2. 布尔型 Attribute2.3.3. 动态绑定多个值2.4. 使用JavaScript表达式2.…

记录一次Sql性能优化

场景&#xff1a; 主业务表 contract&#xff08;合同表&#xff09;&#xff0c;对于不同主体&#xff08;人员&#xff09;&#xff0c;能查看的合同是不一样的。系统企业业务用到了&#xff0c;系统资源表 PERMISSION_RESOURCE 、员工对于资源关系表&#xff1a;ENTRY_JOIN…

物联卡批发为什么那么火爆?

2022年物联网行业开始爆发&#xff0c;针对于企业设备联网的物联卡就显得格外重要了&#xff0c;而共享单车&#xff0c;移动支付&#xff0c;智慧城市&#xff0c;自动售卖机等企业采购物联卡会面临着各种问题&#xff0c;低价陷阱&#xff0c;流量虚假&#xff0c;管理混乱&a…