Python学习
一、学前花絮
数据结构是所有的计算机语言中非常重要的一部分,前面文章讲述了线性结构的“数组”、“栈”、“队列”、“链表”的实现和用途。今天我们继续数据结构部分的学习,重点讲述一下非线性数据结构的“树”、“图”和“多维数组”,也以C语言和python进行对比。
根据数据元素之间的逻辑关系来划分,我们可以把“数据结构”想象成一个社交网络:
下面拆解这两者的区别和特点:
1. 线性结构 (Linear Structure)
核心定义: 数据元素之间存在一对一的线性关系。
形象理解: 就像一条线,把所有的数据串起来。除了第一个和最后一个元素,其他的每个元素都只有一个前驱(前面的元素)和只有一个后继(后面的元素)。
主要特征:
有序性: 元素是按顺序排列的。
单一关系: 逻辑上是直的,没有分叉。
常见的线性结构:
数组 (Array): 最基础的线性结构,内存连续。
链表 (Linked List): 通过指针链接,内存可以不连续。
栈 (Stack): 只能在一端操作(后进先出 LIFO)。
队列 (Queue): 在两端操作(先进先出 FIFO)。
2. 非线性结构 (Non-linear Structure)
核心定义: 数据元素之间存在一对多或多对多的关系。
形象理解: 这就像是一个复杂的网状关系。一个元素可能对应多个前驱或多个后继,数据不再是简单的“一条线”,而是有了“层级”或“网络”。
主要特征:
非顺序性: 元素之间没有严格的先后顺序。
复杂关系: 逻辑上是分叉的、网状的。
常见的非线性结构:
① 树 (Tree):
关系: 一对多(层级关系)。
② 图 (Graph):
关系: 多对多(网状关系)。
③ 多维数组:
虽然也是数组,但因为涉及多个下标(如矩阵),元素之间不再是简单的线性对应,通常也被归类为非线性结构。
下面是线性结构和非线性结构的对比:
二、Python和C语言如何实现非线性数据结构
2.1 非线性数据结构的树、图和多维数组简单示例
1. 树 (Tree)
核心概念: 一对多的层级关系。像家谱、目录结构。
Python 实现 (二叉树节点)
Python 的类写法非常直观,直接定义节点的“左孩子”和“右孩子”。
输出结果:
C 语言实现 (二叉树节点)
C 语言需要手动管理内存和指针。
输出结果:
树的适合场景
文件系统: 目录和子目录的层级关系。
DOM 树: 网页 HTML 标签的嵌套结构。
数据库索引: B+树用于加速数据查询。
决策逻辑: 游戏 AI 或专家系统的决策树。
2. 图 (Graph)
核心概念: 多对多的网状关系。节点之间可以任意连接。
Python 实现 (邻接表)
使用字典来表示图是最 Pythonic 的方式,键是节点,值是相邻节点的列表。
输出结果:
C 语言实现 (邻接表)
C 语言实现稍微复杂,我们用结构体来模拟一个简单的无向图节点连接。
输出结果:
图的适合场景
3.多维数组 (Multi-dimensional Array)
输出结果:
C 语言实现 (二维数组)
C 语言对多维数组有原生支持,内存是连续的。
输出结果:
多维数组的适合场景
2.2非线性数据结构总结对比:
对于数据结构中的线性和非线性总结:
三、小结
本文针对非线性数据结构的树、图和多维数组进行了论述,并举例说明。至此,我们对于数据结构的学习暂告一个段落。应该说数据结构是任何计算机语言学习中的重点,我们通过python与C语言的对比,才知道为什么说python语法简单:其实本质原因是python隐藏了特别难以理解的底层知识比如指针、内存管理等,Python 让你从繁琐的“系统级”操作中解放出来,专注于“应用级”的逻辑实现。
让我们保持学习热情,多做练习。我们下期再见!