数组 (Array)
概述: 数组是最基本的数据结构之一,它是具有固定大小、同类型数据的集合,所有元素的地址在内存中是连续的,可以通过索引(下标)直接访问每个元素。
操作:
- 访问: 通过索引 O(1)
- 插入: 如果插入到数组末尾,时间复杂度为 O(1);如果插入到数组中间,需要移动元素,时间复杂度为 O(n)。
- 删除: 如果删除末尾元素,时间复杂度为 O(1);删除中间元素需要移动元素,时间复杂度为 O(n)。
优缺点:
- 优点: 随机访问快,简单易用。
- 缺点: 插入和删除较慢,大小固定,初始化时需要预留足够的空间。
应用场景:
- 适用于需要频繁访问元素且数组大小固定的场景,例如二维数组表示矩阵,或用于存储少量数据的程序。
链表 (Linked List)
概述: 链表是由一系列节点组成的,每个节点包含数据域和指针域,指针域指向下一个节点。链表不需要连续的内存空间。
操作:
- 访问: 由于链表没有索引,必须从头部开始遍历,时间复杂度为 O(n)。
- 插入: 在链表的任意位置插入只需改变指针,时间复杂度为 O(1)。
- 删除: 删除操作只需修改指针,时间复杂度为 O(1)(但需先找到要删除的节点,O(n))。
类型:
- 单链表: 每个节点只指向下一个节点。
- 双向链表: 每个节点指向前后两个节点。
- 循环链表: 最后一个节点指向头节点,形成循环。
优缺点:
- 优点: 动态分配内存,插入和删除操作高效。
- 缺点: 随机访问较慢,查找元素需要遍历。
应用场景:
- 适用于需要频繁插入、删除操作的场景,如实现队列、栈、缓存系统等。
栈 (Stack)
概述: 栈是一种线性数据结构,遵循“先进后出”(LIFO)的规则,即最后一个被插入的元素最先被取出。
操作:
- push: 将元素压入栈,O(1)。
- pop: 将栈顶元素弹出,O(1)。
- peek: 获取栈顶元素但不删除它,O(1)。
优缺点:
- 优点: 操作简单,栈的插入和删除操作非常高效。
- 缺点: 只能访问栈顶元素。
应用场景:
- 函数调用栈:管理程序中的递归和函数调用。
- 表达式求值:如中缀转后缀表达式,括号匹配。
- 回溯问题:如深度优先搜索、八皇后问题。
队列 (Queue)
概述: 队列是一种线性结构,遵循“先进先出”(FIFO)的原则。即最先进入队列的元素最先被取出。
操作:
- enqueue: 入队,将元素加入队尾,O(1)。
- dequeue: 出队,移除并返回队首元素,O(1)。
类型:
- 普通队列: 先进先出。
- 双端队列 (Deque): 可以从队首和队尾进行插入和删除操作。
- 优先队列 (Priority Queue): 每个元素有优先级,优先级高的元素先出队。
优缺点:
- 优点: 插入和删除操作高效,时间复杂度为 O(1)。
- 缺点: 只能访问队首和队尾元素,随机访问较慢。
应用场景:
- 广度优先搜索 (BFS)、任务调度系统、CPU 任务排队等。
哈希表 (Hash Table)
概述: 哈希表是一种通过哈希函数将键映射到数组中的一个位置的结构,可以实现快速的查找、插入和删除操作。
操作:
- 插入: O(1) 平均时间复杂度(假设冲突较少)。
- 删除: O(1) 平均时间复杂度。
- 查找: O(1) 平均时间复杂度。
哈希冲突处理:
- 链地址法: 每个数组位置存储一个链表,冲突的元素存入链表中。
- 开放地址法: 在发生冲突时寻找下一个空闲位置。
优缺点:
- 优点: 查找、插入和删除操作非常高效,时间复杂度为 O(1)。
- 缺点: 可能会发生哈希冲突,哈希函数设计不当会影响性能。
应用场景:
- 常用于需要高效查找的场景,如数据库索引、缓存系统、集合等。
树 (Tree)
概述: 树是一种分层的、非线性的数据结构,由节点和边组成,每个节点可以有多个子节点。
二叉树: 每个节点最多有两个子节点(左、右)。
- 二叉搜索树 (BST): 左子节点小于父节点,右子节点大于父节点。
- 平衡二叉树: 保证树的高度平衡,常见的平衡树有 AVL 树、红黑树等。
操作:
- 查找: 在平衡二叉搜索树中,时间复杂度为 O(log n)。
- 插入: O(log n)。
- 删除: O(log n)。
优缺点:
- 优点: 能够快速查找、插入、删除元素。
- 缺点: 实现较为复杂,尤其是平衡操作。
应用场景:
- 文件系统的目录结构、数据检索、排序算法(如堆排序)等。
堆 (Heap)
概述: 堆是一种特殊的完全二叉树,分为最大堆和最小堆。最大堆中每个节点的值大于等于其子节点,最小堆则相反。
操作:
- 插入: O(log n),新元素插入到堆的最后,调整堆。
- 删除: O(log n),通常是删除堆顶元素(最大或最小),调整堆。
优缺点:
- 优点: 可以高效地获取最大值或最小值。
- 缺点: 维护堆的结构需要调整元素位置,操作复杂度较高。
应用场景:
- 优先队列、图的最短路径算法(如 Dijkstra)、事件调度系统等。
图 (Graph)
概述: 图是一种由顶点和边组成的非线性数据结构。顶点通过边连接,可以表示复杂的关系。
类型:
- 无向图: 边没有方向。
- 有向图: 边有方向。
- 加权图: 边有权重。
表示方式:
- 邻接矩阵: 使用矩阵表示顶点之间的连接关系。
- 邻接表: 每个顶点存储一个列表,列表中是其直接相邻的顶点。
操作:
- 广度优先搜索 (BFS) 和 深度优先搜索 (DFS) 用于遍历图。
- 最短路径算法: Dijkstra、Floyd-Warshall。
- 最小生成树: Kruskal、Prim 算法。
应用场景:
- 社交网络分析、地图导航、路径规划、网络通信等。
集合 (Set)
概述: 集合是一种无序且不允许重复元素的数据结构。
操作:
- 添加: O(1) 平均时间复杂度。
- 删除: O(1)** 平均时间复杂度。
- 查找: O(1) 平均时间复杂度。
优缺点:
- 优点: 插入、删除、查找操作非常高效。
- 缺点: 没有顺序性,无法通过索引直接访问元素。
应用场景:
- 数据去重:如从一个集合中去除重复元素。
- 集合操作:支持快速的集合运算,如并集、交集、差集,适用于社交网络的好友推荐、文本搜索引擎中的关键词处理等。
字典 (Map)
概述: 字典是一种键值对 (key-value) 数据结构,每个键唯一映射到一个值,支持快速查找、插入、删除操作。
操作:
- 插入/更新: O(1) 平均时间复杂度。
- 删除: O(1) 平均时间复杂度。
- 查找: O(1) 平均时间复杂度。
实现方式:
- 哈希表: 大部分字典使用哈希表实现,键通过哈希函数映射到存储位置。
- 平衡二叉树: 如红黑树,确保键的排序,适用于需要按顺序遍历键的情况。
优缺点:
- 优点: 插入、删除和查找操作非常高效,时间复杂度通常为 O(1)。
- 缺点: 可能会发生哈希冲突,且键不能重复。
应用场景:
- 配置文件存储:使用键值对存储配置信息。
- 数据索引:如数据库的索引结构,缓存系统中的快速查找。
- 缓存机制:如 LRU (Least Recently Used) 缓存实现。

3352

被折叠的 条评论
为什么被折叠?



