<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Data Structure on Leanku</title>
    <link>https://blog.leanku.com/categories/data-structure/</link>
    <description>Recent content in Data Structure on Leanku</description>
    <image>
      <url>https://blog.leanku.com/papermod-cover.png</url>
      <link>https://blog.leanku.com/papermod-cover.png</link>
    </image>
    <generator>Hugo -- gohugo.io</generator>
    <lastBuildDate>Sun, 12 Mar 2023 22:46:01 +0800</lastBuildDate><atom:link href="https://blog.leanku.com/categories/data-structure/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>B&#43;Tree</title>
      <link>https://blog.leanku.com/post/data-structure/b&#43;tree/</link>
      <pubDate>Sun, 12 Mar 2023 22:46:01 +0800</pubDate>
      
      <guid>https://blog.leanku.com/post/data-structure/b&#43;tree/</guid>
      <description>B+Tree B+Tree 是一种平衡多路搜索树，广泛应用于数据库和文件系统等领域，其核心优势在于优化磁盘存储效率和查询性能.
MySQL的InnoDB存储引擎使用的索引结构就是 B+树，它是B树的一个重要变种。
1. 从B树到B+树 B树：一种自平衡的、多路的搜索树。它允许每个节点有多个子节点（多于两个，所以不是二叉树）。
B+树：在B树基础上优化而来的数据结构，是现代数据库系统中事实上的标准索引结构。
MySQL的InnoDB使用的正是 B+树。
2. 为什么数据库需要B+树？ 要理解B+树，必须先理解它的设计目标。数据库的数据存储在磁盘上，磁盘I/O（读写磁盘）的速度比内存访问慢几个数量级。因此，数据库索引的核心目标是：最大限度地减少磁盘I/O次数。
B+树通过以下方式完美地实现了这一目标：
矮胖：与“瘦高”的二叉树相比，B+树每个节点可以存储非常多的键，这使得树的层级非常少（通常只有3-4层），从而保证在亿万级数据量下，查找任何一条记录最多只需要3-4次磁盘I/O。
顺序访问友好：B+树非常适合磁盘的预读特性，能够高效地进行范围查询。
3. B+树的详细结构 它由两种类型的节点组成：内部节点 和 叶子节点。
内部节点（非叶子节点） 作用：仅充当导航目录。
存储内容：只存储键值（索引列的值）和指向子节点的指针。
不存储：实际行的数据。
叶子节点 作用：存储实际的数据。
存储内容：
在 主键索引（聚簇索引） 中：叶子节点存储的就是完整的行数据。
在 辅助索引（二级索引） 中：叶子节点存储的是该索引的键值和对应的主键值。
关键特性：所有叶子节点通过指针相互连接，形成了一个有序的双向链表。这是B+树与B树的一个核心区别。
4. B+树的核心特性与优势（对比B树） 特性 B树 B+树 B+树的优势 数据存储位置 内部节点和叶子节点都存储数据。 只有叶子节点存储数据，内部节点仅为索引。 更“矮胖”的树。因为内部节点不存数据，所以一个节点能容纳的键更多，扇出（子节点数）更大，树高更低，I/O次数更少。 叶子节点链接 叶子节点之间没有链接。 叶子节点通过双向链表连接。 无敌的范围查询。要查询age BETWEEN 20 AND 30的所有记录，B+树只需找到20，然后顺着链表遍历即可。B树则需要不断地在树的中上层和下层之间来回跳跃，性能极差。 扫描和全表遍历 需要对整棵树进行复杂的中序遍历。 只需遍历底层的链表即可获得所有数据，非常高效。 对数据仓库、聚合查询等场景非常友好。 查询稳定性 由于数据可能在内部节点找到，查询时间不稳定。 任何查询都必须走到叶子节点，查询时间非常稳定。 保证了可预测的性能。 5. 在MySQL中的具体体现：聚簇索引 在MySQL InnoDB中，主键索引就是一颗B+树，并且这棵B+树的叶子节点直接存储了完整的行数据。这种索引组织表的方式被称为“聚簇索引”。
表数据文件本身就是按B+树结构组织的一个索引文件。
如果你没有定义主键，InnoDB会选择一个唯一的非空索引代替，如果没有这样的索引，它会隐式地定义一个主键。
辅助索引（二级索引） 也是一颗B+树，但它的叶子节点存储的是该索引列的值和对应记录的主键值。当通过二级索引查找数据时，需要先找到主键，再回到主键索引（聚簇索引）中查找完整数据，这个过程称为“回表”。</description>
    </item>
    
    <item>
      <title>数据结构</title>
      <link>https://blog.leanku.com/post/data-structure/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/</link>
      <pubDate>Sun, 12 Mar 2023 22:46:01 +0800</pubDate>
      
      <guid>https://blog.leanku.com/post/data-structure/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/</guid>
      <description>数据结构 一、说明 数据结构是计算机科学中一个非常基础和核心的概念，它对于编程、算法设计和软件工程都至关重要。
简单来说，数据结构是一种在计算机中组织、管理和存储数据的方式，目的是为了实现高效地访问和修改。
可以把它想象成一个储物系统：
把一堆书随便堆在地上，这是一种“存储”，但找起来非常困难。
使用一个带标签的书架，把书分门别类地放好，找书、放书就高效得多。
这个“书架”以及“如何给书分类、摆放”的规则，就是一种“数据结构”。
为什么数据结构如此重要？ 选择合适的数据结构可以极大地影响程序的性能和效率。一个精心选择的数据结构可以让操作（如搜索、插入、删除）变得非常快；而错误的选择则可能导致程序运行缓慢甚至崩溃。
二、 常见的数据结构分类和类型 数据结构主要可以分为两大类：线性结构和非线性结构。
一、 线性数据结构 元素按顺序排列，形成一条“线”。
数组：在内存中连续存储相同类型的元素。通过索引可以快速访问任意元素。
优点：随机访问速度快。
缺点：大小固定（在某些语言中），插入和删除元素效率低。
链表：由一系列节点组成，每个节点包含数据和指向下一个节点的指针。
优点：大小动态，插入和删除元素效率高。
缺点：不能随机访问，必须从头开始遍历。
栈：一种后进先出的结构，像一摞盘子。只能在顶部进行添加（压栈）和移除（弹栈）操作。
应用：函数调用栈、撤销操作、表达式求值。 队列：一种先进先出的结构，像排队一样。从队尾添加元素，从队首移除元素。
应用：任务调度、消息队列、广度优先搜索。
变种：双端队列、优先队列。
二、 非线性数据结构 元素之间不是简单的前后关系，可能存在多个连接。
树：一种分层结构，由节点和边组成。最顶端的节点叫根节点。
二叉树：每个节点最多有两个子节点。
二叉搜索树：左子树所有节点的值小于根节点，右子树所有节点的值大于根节点。这使得搜索非常高效。
应用：文件系统、数据库索引、决策树。
图：由顶点和连接顶点的边组成。可以表示任意复杂的关系网络。
应用：社交网络、地图导航、网络路由。 哈希表：通过一个哈希函数将键映射到一个位置来访问记录，以实现极快的查找速度。
优点：在平均情况下，插入、删除和查找的时间复杂度都是 O(1)。
应用：字典、集合、缓存。
三、核心操作与算法 对于每种数据结构，我们通常关心以下几个核心操作的效率：
访问
搜索
插入
删除
这些操作的效率通常用 大O表示法 来衡量，它描述了算法时间或空间复杂度随数据规模增长的趋势。
四、作用 数据结构是构建高效算法的基石。学习数据结构能帮助你：
写出更高效的代码：理解不同操作的代价。
解决复杂问题：很多复杂问题本质上就是数据组织和处理的问题。
更好地理解计算机系统：从内存管理到数据库，底层都离不开数据结构。</description>
    </item>
    
  </channel>
</rss>
