数据结构 101:数据结构和算法简介。

2025-06-08

数据结构 101:数据结构和算法简介。

介绍

数据是每个人都熟悉的东西,但了解如何组织、修改、管理和检索数据则更为重要。成为一名优秀的程序员,不仅仅取决于你的代码是否能运行,还取决于可读性和可扩展性,这指的是你的代码运行速度和内存利用效率。

透彻理解数据结构和算法将帮助你成为一名更优秀的程序员,因为你将更加注重编写易于理解、在时间和空间(内存)方面高度优化的优秀代码。
我相信这篇文章会教给你很多东西。🎉

先决条件

为了充分利用本系列,您应该熟悉至少一种编程语言的基础知识,最好是 Python,因为本课程将重点关注 Python 数据结构和算法。

学习和探索数据结构和算法的另一个要求是一颗开放的心。

乐于学习,并相信自己能够成功。你不必给自己施加压力,但我相信,只要你日复一日地坚持不懈地努力,你就能从这篇文章中获益匪浅。

本文的目标🎉

阅读完本文后,每位读者都应该能够:

  • 了解什么是数据结构,

  • 不同类型的数据结构,以及

  • 学习数据结构的原因。

什么是数据结构

简单来说

首先,我先简化数据结构和算法的整个概念。

算法只是一个用来解决问题的软件或一组解决问题指令的华丽说法。
算法乍一看可能有点像魔术表演。你可以看到这个魔术的输入和输出,但其间发生的一切都显得有些神奇。
我的目标是带你了解这个魔术的各个阶段,并解释你需要哪些材料才能完成它。
这些资源现在就是我们所说的数据结构,或者说是本例中问题中的常见模式。

然而,我不能保证我会仔细讲解每一个细节,但我相信在此之后,您将能够将算法应用于您作为开发人员可能遇到的问题。

让我们仔细看看 Python 数据结构

数据结构是一种数据存储和组织方法,它使修改、导航和访问数据变得更加容易。数据结构还决定了数据的收集方式、访问数据时可以使用的函数以及数据之间的关联方式。

数据结构的主要目的是提供一种组织数据的方法,以便有效地使用数据。市面上有多种适用于各种应用的数据结构,其中一些数据结构专门用于特定用途。

Python 算法是一系列详细的指令,有助于实现特定目的的数据处理。

现在让我们看看不同形式的数据结构。

不同类型的数据结构

数据结构有两种类型:原始数据结构和非原始数据结构,其中线性和非线性数据结构属于非原始类别。

线性数据结构

线性数据结构是指数据项按连续或线性顺序排列的结构,每个成员都与其前后相邻的元素关联。
线性数据结构只涉及一个层级。因此,我们只需一次运行即可探索所有元素。由于计算机内存是线性组织的,因此线性数据结构易于构建。列表、链表、堆栈和队列就是一些例子。

非线性数据结构

非线性数据结构是指数据元素并非按顺序或线性排序的数据结构。非线性数据结构不涉及任何层级。因此,我们无法在一次运行中遍历所有元素。与线性数据结构相比,非线性数据结构的构建难度更大。与线性数据结构相比,它能够更好地利用计算机内存。树和图就是两个例子。

展示我们拥有的数据结构类型的图表

数据结构的类型及其含义

我们在上一节中了解了线性和非线性数据结构,因此在本节中,我们将选择几种数据结构,了解它们的含义以及如何使用。
我们还将讨论 Python 中的集合、元组和字典,我相信它们也会引起我们的极大兴趣。

列表

在我看来,列表是最流行、最简单的数据结构,也是最常用的数据结构。列表是一种将数据存储在内存中以供后续使用的数据结构。每个列表包含预定数量的单元格,每个单元格都有一个匹配的数字索引,用于访问数据。每当您需要使用列表中的任何数据时,只需提供所需的索引即可检索它。

使用列表可以将多个项目存储在一个变量中。方括号 [] 用于创建列表,并用逗号分隔各个元素。在大多数情况下,列表可以包含单一类型的项目,但也可以包含多种不同类型的项目。为了像矩阵一样表示二维和三维网格,列表可以与其他列表嵌套。
列表示例

链表

链表是一种不依赖于内存中物理数据位置的数据结构。连接列表采用引用机制,而非索引或位置:元素存储在带有指向下一个节点的指针的节点中,依此类推,直到所有节点都链接起来。

这种方法可以快速放置和移除物品,而无需重新组织。
链表

集合是一组不按特定顺序排列的元素。每个集合元素都必须独一无二且不可更改。使用花括号或集合函数 set() 可以创建集合。集合与列表共享一些特性,例如可以使用 in 来判断集合中是否包含特定元素。

您必须使用 set() 来构造一个空集,因为 set{} 会创建一个空字典。

# empty set
print(set())
print(my_set:={})
Enter fullscreen mode Exit fullscreen mode

字典

字典是无特定顺序的元素的集合。它们是一种数据结构,允许你将任意键映射到任意值。当键已知时,字典会进行优化以检索值。

# empty dictionary
emoty_dict = {}

# dictionary with integer keys
num_dict = {1: "Vitalis", 2: "Kandie"}

Enter fullscreen mode Exit fullscreen mode

.get() 是一种很有用的字典技巧。它的工作原理与索引相同,但如果字典中找不到对应的键,则会返回另一个值(默认情况下为“None”)。

bird = {'name': 'screech', 'color': 'blue'}

print('Name: ', person.get('name'))

print('color: ', bird.get('color'))

# value is not provided
print('origin: ', bird.get('origin')) 

# value is provided
print('origin: ', bird.get('origin', 'United Kingdom'))

Enter fullscreen mode Exit fullscreen mode

元组

元组与列表类似,不同之处在于它们是不可变的(无法更改)。它们由括号 () 组成。我们使用索引(类似于列表)来检索元组中的值。当元组中的值被重新赋值时,会发生TypeError。元组比列表更快,但无法修改。

# Empty tuple
empty_tuple = ()
print(empty_tuple)

# Tuple having integers
num_tuple = (2, 5, 4)
print(num_tuple)

# tuple with mixed datatypes
mix_tuple = (2, "Hiya", 5.4)
print(mix_tuple)

# nested tuple
nest_tuple = ("here", [1, 2, 3], (4, 5, 6))
print(nest_tuple)

#indexing
print(nest_tuple[0])
#here

Enter fullscreen mode Exit fullscreen mode

堆栈是一种线性数据结构,其中的操作按特定顺序执行。该顺序可以是 LIFO(后进先出)或 FILO(先进后出)。

现实世界中有很多堆叠的例子。想象一下食堂,盘子一个接一个地堆在一起。最上面的盘子最先被拿走,但最下面的盘子却在堆叠中停留时间最长。因此,很容易观察到它遵循 LIFO(后进先出)/FILO(先进后出)的顺序。

堆栈解释

要实现如上图所示的堆栈,我们需要两个简单的操作:

  • push :将元素添加到堆栈顶部。

  • pop:从堆栈顶部取出一个元素并将其删除。

运营:

  • 添加 - 通过向堆栈中添加元素来增加堆栈的大小。添加操作发生在堆栈的最顶部。

  • 删除操作包含两个条件:首先,如果堆栈中没有元素,则堆栈将下溢;其次,如果堆栈包含元素,则将删除最顶部的元素。这会减小堆栈的大小。

  • 遍历需要检查堆栈的每一部分。

队列

队列和堆栈在概念上相似;两者都是顺序结构,但队列按照元素进入的顺序处理元素,而不是最新的元素。

因此,队列类似于堆栈的FIFO(先进先出)版本。它们充当请求缓冲区,保持请求按接收顺序排列,直到它们被处理为止。

Python中的队列

树木

树是另一种基于关系的数据结构,用于描述层次结构。节点类似于链表,包含数据和指示其与其他节点关系的指针。

每棵树都有一个“根”节点,所有其他节点都从该节点分支出来。根节点下方的所有项(称为“子节点”)都从根节点引用。此过程不断重复,每个子节点都会分支出更多子节点。

树木插图

图表

图是一种关系数据结构,可用于存储类似网络的关系。在图中,每个节点(或顶点)都有一个标题、一个值以及与其他顶点之间的链接列表(称为边)。
图表说明

图表描述 2

可以对数据结构执行的各种操作:

  1. 插入:向指定的数据项集合中添加新的数据项。

  2. 删除:从数据项集合中删除现有数据项。

  3. 遍历:仅访问每个数据项一次以便处理它。

  4. 搜索:如果数据项存在于给定的数据项集合中,则找到其位置。

  5. 排序需要按特定顺序排列数据项,例如,数字数据按升序或降序排列,字母数字数据按字典顺序排列。

数据结构有什么好处?

如果您想成为一名能够编写出优秀代码的熟练程序员,您必须了解数据结构以及如何对其执行各种操作😊。

结论

哇😍,我敢打赌你从这篇文章中学到了很多知识。在这个精彩的数据结构和算法入门系列中,请关注我的博客了解更多内容。
你也可以阅读这篇文章,了解更多关于字典、集合、元组和列表的知识。你可以在推特上
联系我,了解更多关于任何主题的信息,我都会回复。感谢你花时间阅读这篇文章😘。

享受🎉

鏂囩珷鏉ユ簮锛�https://dev.to/brayan_kai/introduction-to-data-structs-and-algorithms-with-python-3jhn
PREV
我开源了一个用 React 和 Tailwind 构建的作品集模板!
NEXT
ECMAScript 2022 的新 JavaScript 功能(附示例)