Skip to content

数据结构基础

在学习算法之前,我们需要掌握一些基本的数据结构。这些数据结构是解决问题的核心工具,了解它们的特点和适用场景可以帮助我们选择合适的解决方案。

数组 (Array)

定义:数组是一种线性数据结构,它通过连续的内存位置存储一组固定大小的数据元素。

特点

  • 索引访问:数组支持通过索引快速访问元素,时间复杂度为 O(1)
  • 大小固定:在初始化时必须指定数组的长度。
  • 插入和删除慢:在数组中插入或删除元素可能需要移动其他元素,时间复杂度为 O(n)

使用场景

  • 需要随机访问数据。
  • 数据大小已知且不会频繁改变。

链表 (Linked List)

定义:链表是一种线性数据结构,其中每个元素(称为节点)包含一个数据值和一个指向下一个节点的指针。

特点

  • 动态大小:链表的大小可以动态变化。
  • 插入和删除快:在链表中插入或删除元素的时间复杂度为 O(1)(如果有指针指向目标位置)。
  • 访问慢:无法通过索引直接访问元素,必须从头开始遍历,时间复杂度为 O(n)

使用场景

  • 数据大小不固定且需要频繁插入或删除。

栈 (Stack)

定义:栈是一种遵循 后进先出(LIFO) 原则的线性数据结构,即最后插入的元素最先被删除。

特点

  • 主要操作
  • push:将元素压入栈顶。
  • pop:从栈顶弹出元素。
  • peek:查看栈顶元素。
  • 操作时间复杂度为 O(1)

使用场景

  • 实现递归(函数调用栈)。
  • 表达式求值(中缀转后缀)。
  • 浏览器的前进和后退功能。

队列 (Queue)

定义:队列是一种遵循 先进先出(FIFO) 原则的线性数据结构,即最先插入的元素最先被删除。

特点

  • 主要操作
  • enqueue:将元素添加到队尾。
  • dequeue:从队头移除元素。
  • 操作时间复杂度为 O(1)(对于双端队列或循环队列)。

特殊队列

  • 优先队列:元素按照优先级出队,而不是按照插入顺序。

使用场景

  • 排队系统(如打印队列、任务调度)。
  • 广度优先搜索(BFS)算法。

哈希表 (Hash Table)

定义:哈希表是一种存储键值对的数据结构,通过一个哈希函数将键映射到值的位置。

特点

  • 快速查找:平均情况下,查找、插入和删除的时间复杂度为 O(1)
  • 冲突处理:常见方法包括链地址法和开放地址法。

使用场景

  • 实现键值对存储(如字典、缓存)。
  • 检测重复元素。

树 (Tree)

定义:树是一种非线性数据结构,由节点组成,每个节点包含一个数据值,并可以有多个子节点。树的顶层节点称为根节点,最底层的节点称为叶节点。

特点

  • 层级关系:用于表示层级结构的数据。
  • 常见类型
  • 二叉树:每个节点最多有两个子节点。
  • 二叉搜索树:左子树的值小于根节点,右子树的值大于根节点。
  • 堆:一种特殊的二叉树,用于实现优先队列。

使用场景

  • 文件系统目录结构。
  • 表达式树(数学表达式求值)。
  • 搜索和排序(如二叉搜索树)。

图 (Graph)

定义:图是一种非线性数据结构,由一组节点(称为顶点)和一组连接这些节点的边组成。

特点

  • 有向图和无向图:边可以是有方向的或无方向的。
  • 加权图:边可以带有权值。
  • 存储方式
  • 邻接矩阵:使用二维数组存储顶点间的连接关系。
  • 邻接表:使用链表存储顶点及其邻居。

使用场景

  • 表示网络结构(如社交网络、路由图)。
  • 实现图搜索算法(如深度优先搜索、广度优先搜索)。

总结

以上数据结构是算法学习的基础。通过熟悉它们的定义、特点和使用场景,你将能够在解决实际问题时选择适合的数据结构,从而提高代码效率。