数据结构
文章平均质量分 84
土豆西瓜大芝麻
这个作者很懒,什么都没留下…
展开
-
float类型表示方式及范围深度解析
的尾数部分中小数点前还隐藏着一个固定的整数值整数1,尾数部分的23位只用来表示小数点后的值,这种方式可保证浮点数有唯一的表示形式。采用渐进式下溢出的原因是,如果不采用,0与绝对值最小的浮点数之间距离将大于两个相邻浮点数之间的距离,且前者是后者的。,转换成十进制原码为 -126 ~ 127,也就是整个指数部分(注意:只算指数部分)所能表示的最小的正数值为。最大绝对值就比较简单了,当尾数全为1,指数为127时为最大,也就是。,其中s为符号位-1或1,t为尾数,i为指数。尾数部分部分共23位,表示范围为。转载 2022-11-01 20:41:12 · 15285 阅读 · 2 评论 -
关于内核中用到的4层寻址方案的解释
前面,我大概讲过iblock[15]用于管理某种数据的地址空间的概念,也画过图,但是总有人会绕晕。在这里用更直白的话解释一下。 背景信息:对于一个传感器,其数据要附加时间信息、空间信息、属性信息等。这些附件的信息可用于检索,目的是实现快速定位满足用户设定条件的数据所在位置。这些数据连同传感器原始数据都存放在一个文件中,那么这些数据要如何组织和存放呢。 (1)分区存放,先预设一个文件大小,然后进行分区,每个分区放不同的数据。例如,前面放原始数据,后面放时间数...原创 2021-09-08 01:57:39 · 303 阅读 · 0 评论 -
空间数据索引RTree(R树)完全解析及Java实现
第一部分 空间数据的背景介绍空间数据的建模基于实体的模型(基于对象)Entity-based models (or object based)0-dimensional objects: 一般使用点point来表示那些对于不需要使用到形状信息的实体。 1-dimensional objects or linear objects: 用于表示一些路网的边,一般用于表示道路road。 (polyline) 2-dimensional objects or surfacic objects: 用.原创 2021-04-26 08:25:47 · 7364 阅读 · 5 评论 -
图解R树的内部结构及操作
本文是在https://blog.csdn.net/baimafujinji/article/details/89810217基础上增加了自己的理解和解释形成的。R树的基本情况R树(R-tree)是一种将B树(B+树和B树统称B树)扩展到多维情况下得到的数据结构,它最初由Antonin Guttman于1984年提出。B树的结点中会存储一个键的集合,这些键把线分成片段,沿着那条线的点仅属于一个片段(B+树中只有叶子节点才存储具体的key和内容,相当于叶子节点把数轴划分的更碎,而内部节点是把这些碎的偏原创 2021-04-22 21:30:49 · 6255 阅读 · 1 评论 -
图解B树和B+树
B树B树是为了磁盘或其它存储设备而设计的一种多叉平衡查找树,多叉就是多个分支的意思,二叉树就是最多只有两个分支的树。如下图所示,即是一棵B树。 一棵m阶的B树必须满足如下条件: 1)每个结点最多含有m个分支,也就是说:每个节点最多m−1个关键字。 2)根节点最少可以有1个关键字,其它节点最少有⌈m2⌉−1个关键字。 3)每个节点的内部结构为:n为节点中关键字的个数,Ki,i=1,2,...,n 为关键字,从小到大排列,Pi,i=0...转载 2021-04-17 10:01:22 · 1446 阅读 · 0 评论 -
图解数据库skyline查询
假设一个数据库存储每个酒店的以下信息:它的价格(夜间价格)、离海滩的距离。用户希望检索“最佳”酒店,如何比较两个酒店的质量呢? a比b好吗?是的,a酒店比b酒店更便宜,而且离海滩更近,我们说a支配b。 a是不是比i好呢?它们是不可比的。一些用户可能更喜欢a(因为它离海滩更近),而另一些用户可能更喜欢i(因为它更便宜)。skyline 包含了所有不受其它酒店支配的酒店。skyline ={a,i,k},而非 skyline 酒店在...转载 2021-04-16 14:59:59 · 3338 阅读 · 4 评论 -
时空数据库中的轨迹数据压缩
时空数据库管理移动对象,比如:汽车、飞机、地貌变化等。空间数据库是时空数据库的特例,即时刻固定。轨迹压缩每秒钟都会从 GPS 获取大量(x,y,t)格式的数据,如何在不降低物体轨迹精度的前提下减小数据量呢(也就是数据都完全采集到了,但是数据量太大了,所以我们想少存一些数据,但又不能造成数据失效,也就是存入的那些少量点连起来的轨迹和原始轨迹不能偏差太大)?主要有三个指标:处理时间、压缩率、误差测量。误差:原始轨迹位置与估计轨迹位置之间的距离。主要有两种误差测量指标:垂直欧式距离、时间同步欧式距..转载 2021-04-15 22:01:46 · 3449 阅读 · 0 评论 -
使用内核提供的container_of()函数获取结构体成员在结构体中的位置
本文介绍Linux 4.4内核容器container_of()。文件:include/linux/kernel.h,定义如下:/** * container_of - cast a member of a structure out to the containing structure * @ptr: the pointer to the member. * @type: the type of the container struct this is embedded in.转载 2021-04-15 20:15:37 · 816 阅读 · 0 评论 -
spatialite扩展的编译和安装
spatialite作为一个sqlite3数据库的extension,使得sqlite3具有地理空间数据的处理能力。spatialite在linux上的编译,中文资料太少了。在此记录一下编译及使用过程。开始编译依赖库!没错,spatialite依赖了很多很多库。列举如下(直接粘贴了我cmakelist的内容):#libproj.afind_library(Proj_LIBRARY NAMES libproj.a)link_libraries(${Proj_LIBRARY})MESSAG转载 2021-04-15 17:26:24 · 3203 阅读 · 0 评论 -
SpatiaLite 使用指南
SpatiaLite是一个用来扩展SQLite的内核的开源库,支持完全成熟的空间SQL功能。其特点有:一个实现完整的SQL引擎的轻量级库 标准的SQL执行:几乎完全的SQL-92标准 没有复杂的客户端/服务器结构 整个数据库简单地对应于单个文件,且文件大小没有限制 跨平台 无需安装,无需配置Spatialite提供一个完整而强大的空间数据库管理系统(主要是与OGC-SFS兼容),而且由于其跨平台及轻量级的特点,常被用于涉及LBS功能的移动端应用开发中。空间索引使用SpatiaLite转载 2021-04-15 17:13:54 · 3637 阅读 · 0 评论 -
SQLite的table和index 的组织形式B+树和B 树
本文主要基于https://blog.csdn.net/daliaojie/article/details/8230544进行修改。网上一些帖子说Sqlite中组织管理数据库文件存储的机制为B-树。实际上根据《the definitive guide to sqlite》SECOND EDITON中的描述发现,SQLite是把B树和B+树统称为B树,但两者在SQLite中都使用到了(也有一说是用了B*树和B树)。B+树用于组织table及其内容,叶子节点中存放的是数据记录record,内部节点不存放原创 2021-04-15 16:10:18 · 974 阅读 · 0 评论 -
图解R树的原理及相关操作
B树的搜索本质上是一维区间的划分过程,每次搜索节点所找到的子节点其实就是一个子区间。R树是把B树的思想扩展到了多维空间,采用了B树分割空间的思想,是一棵用来存储高维数据的平衡树。 对于一棵R树,叶子节点所在层次称为 Level1,根节点所在层次称为Level-h。一棵R树满足如下性质: 1)除根结点之外,所有非根结点包含有m至M个记录索引(条目)。根结点的记录个数可以少于m。通常m=M/2。 2)每一个非叶子结点的分支数和该节...转载 2021-04-15 14:20:23 · 8097 阅读 · 1 评论 -
R树与空间索引
B树或者B+树可以非常好的处理一维空间存储的问题。B树是一棵平衡树,它是把一维直线分为若干段线段,当我们查找满足某个要求的点的时候,只要去查找它所属的线段即可。依我看来,这种思想其实就是先找一个大的空间,再逐步缩小所要查找的空间,最终在一个自己设定的最小不可分空间内找出满足要求的解。一个典型的B树查找如下:要查找某一满足条件的点,先去找到满足条件的线段,然后遍历所在线段上的点,即可找到答案。B树是一种相对来说比较复杂的数据结构,尤其是在它的删除与插入操作过程中,因为它涉及到了叶子结点的分解.原创 2021-04-13 15:20:49 · 2180 阅读 · 0 评论 -
B树B+树B*树
在大规模数据存储中,实现索引查询这样一个实际背景下,树节点存储的元素数量是有限的(如果元素数量非常多的话,查找就退化成节点内部的线性查找了),这样导致二叉查找树结构由于树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下(为什么会出现这种情况,待会在外部存储器-磁盘中有所解释),那么如何减少树的深度(当然是不能减少查询的数据量),一个基本的想法就是:采用多叉树结构(由于树节点元素数量是有限的,自然该节点的子树数量也就是有限的)。也就是说,因为磁盘的操作费时费资源,如果过于频繁的多次查找势必效率转载 2021-04-12 22:03:29 · 276 阅读 · 0 评论 -
B树 B+树 B*树的区别和适用场合
一、B树1、B树的特性一棵m阶的B树的满足条件:(1)每个节点至多有m棵子树(2)根节点除外,其它每个分支节点至少有【m/2】棵子树(3)根节点至少有两棵子树(除非B树只包含一个节点)(4)所有叶子节点在同一层上,B树的叶子节点可以看成一种外部节点,不包含任何信息。(5)有j个孩子的非叶结点恰好有j-1个关键码,关键码按递增次序排列。B 树又叫平衡多路查找树。如图:2、B树的使用场景B树多用于做文件系统的索引。那么问题来了:为什么要用B树,红黑树不是就挺好的么?原因:B树和二叉转载 2021-04-09 10:06:20 · 2319 阅读 · 2 评论 -
redis中的跳表结构
redis的有序集合zset数据结构底层采用了跳表原理 时间复杂度O(logn)(阿里)redis使用跳表不用B+数的原因是:redis是内存数据库,而B+树纯粹是为了mysql这种IO数据库准备的。B+树的每个节点的数量都是一个mysql分区页的大小(阿里面试)敲黑板:每级遍历 3 个结点即可,而跳表的高度为 h ,所以每次查找一个结点时,需要遍历的结点数为 3*跳表高度 ,所以忽略低阶项和系数后的时间复杂度就是 ○(㏒n),空间复杂度是O(n)问题如果对以下问题感到困惑或一知半解转载 2021-04-09 09:55:25 · 408 阅读 · 0 评论 -
二叉树 红黑树 B树 B+树的优缺点
前言在MySQL中,无论是Innodb还是MyIsam,都使用了B+树作索引结构(这里不考虑hash等其他索引)。本文将从最普通的二叉查找树开始,逐步说明各种树解决的问题以及面临的新问题,从而说明MySQL为什么选择B+树作为索引结构。一、二叉查找树(BST):不平衡二叉查找树(BST,Binary Search Tree),也叫二叉排序树,在二叉树的基础上需要满足:任意节点的左子树上所有节点值不大于根节点的值,任意节点的右子树上所有节点值不小于根节点的值。如下是一颗BST(图片来源)。.转载 2021-04-09 09:48:25 · 7723 阅读 · 1 评论 -
B+树比B树更快的原因
B+树是B-Tree的改进版本,同时也是数据库索引索引所采用的存储结构。数据都在叶子节点上,并且增加了顺序访问指针,每个叶子节点都指向相邻的叶子节点的地址。相比B-Tree来说,进行范围查找时只需要查找两个节点,进行遍历即可。而B-Tree需要获取所有节点,相比之下B+Tree效率更高。为什么官方建议使用自增长主键作为索引?结合B+Tree的特点,自增主键是连续的,在插入过程中尽量减少页分裂,即使要进行页分裂,也只会分裂很少一部分。并且能减少数据的移动,每次插入都是插入到最后。总之就是减少.原创 2021-04-08 09:55:46 · 2453 阅读 · 0 评论 -
为什么说索引会加速查找过程
背景我相信大家在数据库优化的时候都会说到索引,我也不例外,大家也基本上能对数据结构的优化回答个一二三,以及页缓存之类的都能扯上几句,但是有一次阿里P9的一个面试问我:你能从计算机层面开始说一下一个索引数据加载的流程么?(就是想让我聊IO)废话不多说,我们就从计算机加载数据聊起,讲一下换个角度聊索引。正文MySQL的索引本质上是一种数据结构让我们先来了解一下计算机的数据加载。磁盘IO和预读:先说一下磁盘IO,磁盘读取数据靠的是机械运动,每一次读取数据需要寻道、寻点、拷贝到内转载 2021-04-08 09:25:28 · 356 阅读 · 0 评论 -
基于位表示的8叉树数据存储原理
3D物体建模在计算机辅助设计系统、医疗系统、机器人以及物体自动检测中扮演了越来越重要的角色。在这其中,八叉树是一种非常有效的储存数据的方法,尤其是对于像流形物体、点云图(point cloud)、体素(voxel)这样的稀疏化(sparse)数据来说,八叉树可以更好地展示数据的结构特性。图1 八叉树结构的数据存储原理图片来源:Figure 3, Riegler, G., Ulusoy, A. O., & Geiger, A. (2017, July). Octnet: Learnin.转载 2021-04-07 16:27:26 · 1858 阅读 · 0 评论 -
一个完整的B+树代码及详细注释
因为这一段在开发自己的文件系统,需要支持时间点和时间段的快速检索,所以考虑使用B+树构建时间索引。github上有不少B+树的源码,但是都比较复杂。这里找到一个非常简单的代码实现,代码设计的非常精妙,但是没有注释。连续看了几天,结合我自己对B+树的原理的理解,给代码增加了注释。后面我会基于此修改成满足项目需求的子模块。在这里先把代码贴出来吧。如果有问题,请在评论区讨论。/* * To conver to an append-only design, only the 'fwrite' in the原创 2021-03-30 10:51:30 · 3711 阅读 · 5 评论 -
红黑树的插入操作过程详细图解
说在前面对于文章中提到的左旋右旋等旋转详细过程请参考我的上一篇博客平衡二叉树插入操作的详细过程中的解决失衡的口诀方法,其中有旋转的详细图解过程红黑树 定义与性质 红黑树是一种含有红黑结点并能自平衡的二叉查找树 任意结点都有颜色,红色或者黑色 红黑树中根节点一定是黑色的 红黑树中的 null 位置看作是黑色 红黑树中红色不能与红色相邻 从根到所有 null 的路径上黑色结点的个数相同 红黑树中,最长的路径的长度,不会超过最短的路径的长度的2倍 时间复杂度:Olog转载 2020-05-09 15:30:04 · 4639 阅读 · 2 评论