<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>数据结构 on 张同的博客</title><link>https://www.zhangblogs.cn/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/</link><description>Recent content in 数据结构 on 张同的博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Fri, 16 Aug 2024 17:37:47 +0800</lastBuildDate><atom:link href="https://www.zhangblogs.cn/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/index.xml" rel="self" type="application/rss+xml"/><item><title>数据结构简介</title><link>https://www.zhangblogs.cn/archives/1723799959465/</link><pubDate>Fri, 16 Aug 2024 17:37:47 +0800</pubDate><guid>https://www.zhangblogs.cn/archives/1723799959465/</guid><description>&lt;img src="https://www.zhangblogs.cn/upload/gd0Kwuo%253D.webp" style="display: inline-block" /&gt;
&lt;h2&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;数据结构简介&lt;/span&gt;&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;为了更好的理解数据库中数据的存储，组织和操作，数据结构是绕不开的一个基础项目。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;系统的理解数据结构，对于高效开发是非常有必要的。对于运维工作而言，学习数据结构可以让功力加深，尤其是对软件架构部分。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;常用的数据结构包括 &lt;/span&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;数组、链表、堆栈、队列、树和图&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;1. 什么是数据结构&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;按照wiki的说法，&lt;/span&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;数据结构&lt;/span&gt;&lt;/strong&gt;&lt;span fontsize="" color=""&gt;是一种&lt;/span&gt;&lt;a href="https://en.wikipedia.org/wiki/Data" target="_blank" rel="noopener noreferrer nofollow"&gt;&lt;span data-fontsize="" color=""&gt;数据&lt;/span&gt;&lt;/a&gt;&lt;span fontsize="" color=""&gt;组织，以及通常为&lt;/span&gt;&lt;a href="https://en.wikipedia.org/wiki/Efficiency" target="_blank" rel="noopener noreferrer nofollow"&gt;&lt;span data-fontsize="" color=""&gt;有效&lt;/span&gt;&lt;/a&gt;&lt;a href="https://en.wikipedia.org/wiki/Data_access" target="_blank" rel="noopener noreferrer nofollow"&gt;&lt;span data-fontsize="" color=""&gt;访问&lt;/span&gt;&lt;/a&gt;&lt;span fontsize="" color=""&gt;数据而选择的&lt;/span&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;存储格式&lt;/span&gt;&lt;/strong&gt;&lt;span fontsize="" color=""&gt;。更准确的说，是一种&lt;/span&gt;&lt;a href="https://en.wikipedia.org/wiki/Algebraic_structure" target="_blank" rel="noopener noreferrer nofollow"&gt;&lt;span data-fontsize="" color=""&gt;代数结构&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;数据结构提供给函数或者操作集合具体的数据值。定义数据结构是为了更好的使用数据。&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;2. 数据结构分类&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;img src="https://www.zhangblogs.cn/upload/data_structures.drawio.png" style="display: inline-block" /&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;为了方便理解，我们将数据结构进行了分类&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;线性结构&lt;/span&gt;&lt;/strong&gt;&lt;span fontsize="" color=""&gt;:数据元素按顺序或线性排列的数据结构，其中每个元素都附加到其上一个和下一个相邻元素，称为线性数据结构&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;静态数据结构&lt;/span&gt;&lt;/strong&gt;&lt;span fontsize="" color=""&gt;:静态数据结构具有固定的内存大小。访问静态数据结构中的元素更容易&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;动态数据结构&lt;/span&gt;&lt;/strong&gt;&lt;span fontsize="" color=""&gt;:在动态数据结构中，大小不固定。它可以在运行时期间随机更新。这在代码的内存（空间）复杂性方面可能被认为是高效的&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;非线性数据结构&lt;/span&gt;&lt;/strong&gt;&lt;span fontsize="" color=""&gt;:数据元素不按顺序或线性放置的数据结构称为非线性数据结构。在非线性数据结构中，我们无法仅通过一次遍历就访问所有元素。非线性数据结构的例子有树和图。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;注意，许多数据结构是复合型的，比如B+树就是一个平衡二叉树+链表实现的，这里的数据结构只是一个轮廓，是基础。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;往往人们容易将数据类型和数据结构混肴，这里给出两者的不同之处&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;属性&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;数据类型&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;数据结构&lt;/span&gt;&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;span fontsize="" color=""&gt;定义&lt;/span&gt;&lt;/td&gt;
 &lt;td&gt;&lt;span fontsize="" color=""&gt;变量的形式，可以赋值。定义特定变量只会分配给定数据类型的值。&lt;/span&gt;&lt;/td&gt;
 &lt;td&gt;&lt;span fontsize="" color=""&gt;不同类型数据的集合。整个数据可以用一个对象表示，并在整个程序中使用。&lt;/span&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;span fontsize="" color=""&gt;持有值&lt;/span&gt;&lt;/td&gt;
 &lt;td&gt;&lt;span fontsize="" color=""&gt;只能持有值，但不能持有数据。因此，它是无数据的。&lt;/span&gt;&lt;/td&gt;
 &lt;td&gt;&lt;span fontsize="" color=""&gt;可以在单个对象中持有多种类型的数据。&lt;/span&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;span fontsize="" color=""&gt;实现&lt;/span&gt;&lt;/td&gt;
 &lt;td&gt;&lt;span fontsize="" color=""&gt;数据类型的实现称为抽象实现。&lt;/span&gt;&lt;/td&gt;
 &lt;td&gt;&lt;span fontsize="" color=""&gt;数据结构的实现称为具体实现。&lt;/span&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;span fontsize="" color=""&gt;时间复杂度&lt;/span&gt;&lt;/td&gt;
 &lt;td&gt;&lt;span fontsize="" color=""&gt;没有时间复杂度。&lt;/span&gt;&lt;/td&gt;
 &lt;td&gt;&lt;span fontsize="" color=""&gt;在数据结构对象中，时间复杂度起着重要作用。&lt;/span&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;span fontsize="" color=""&gt;内存&lt;/span&gt;&lt;/td&gt;
 &lt;td&gt;&lt;span fontsize="" color=""&gt;数据类型的值不存储，因为它只表示可以存储的数据类型。&lt;/span&gt;&lt;/td&gt;
 &lt;td&gt;&lt;span fontsize="" color=""&gt;数据结构中，数据及其值占据计算机主内存的空间。数据结构可以在一个对象中持有不同类型和种类的数据。&lt;/span&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;span fontsize="" color=""&gt;示例&lt;/span&gt;&lt;/td&gt;
 &lt;td&gt;&lt;span fontsize="" color=""&gt;int, float, double 等。&lt;/span&gt;&lt;/td&gt;
 &lt;td&gt;&lt;span fontsize="" color=""&gt;栈、队列、树等。&lt;/span&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;下面我们将对这几类主要的数据结构做一个简单介绍&lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;2.1 数组&lt;/span&gt;&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;数组是一种线性数据结构。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;它是存储在连续内存位置上的项目集合。其核心思想是将多种相同类型的项目&lt;/span&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;集中存放在一个地方&lt;/span&gt;&lt;/strong&gt;&lt;span fontsize="" color=""&gt;。这使得在相对&lt;/span&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;较短的时间内处理大量数据&lt;/span&gt;&lt;/strong&gt;&lt;span fontsize="" color=""&gt;成为可能。数组的第一个元素通过下标0进行索引。在数组中可以进行不同的操作，例如搜索、排序、插入、遍历、反转和删除。&lt;/span&gt;&lt;/p&gt;
&lt;img src="https://www.zhangblogs.cn/upload/Array.drawio.png" style="display: inline-block" /&gt;
&lt;p&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;数组的特征&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;数组使用基于索引的数据结构，这有助于使用索引轻松识别数组中的每个元素。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;如果用户想要存储相同数据类型的多个值，则可以有效地利用数组。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;数组还可以通过将数据存储在二维数组中来处理复杂的数据结构。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;数组还用于实现其他数据结构，如堆栈、队列、堆、哈希表等.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;数组中的搜索过程可以非常容易地完成。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;数组的操作&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;Initialization&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;初始化&lt;/span&gt;&lt;/strong&gt;&lt;span fontsize="" color=""&gt;：可以在声明时或稍后使用赋值语句用值初始化数组。&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;Accessing elements&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>