📈 时间 & 空间复杂度
✏️ 常用数据结构
📌 数组 (Array
)
- 🎯 特点:
- 📎 固定大小(在某些实现中)
- 📎 元素存储在连续的内存位置
- 📎 通过索引对任何元素进行恒定时间的访问
- 📎 插入和删除需要线性时间
- 🔗 链接: 数组
- 🔍 结构: 数组的结构是线性的,每个元素都有一个与其关联的索引。
📌 链表 (Linked List
)
- 🎯 特点:
- 📎 元素不需要存储在连续的内存位置
- 📎 每个元素都存储有指向下一个元素的指针
- 📎 插入和删除操作通常具有恒定的时间复杂度
- 📎 随机访问较慢,访问链表中的特定元素需要从头开始遍历,直到找到所需的元素。
- ⚡️ 使用:
- 动态数据:当你不确定数据的数量,并需要经常插入或删除数据时。
- 不需要随机访问:如果不需要经常进行随机访问,链表可能是一个好选择。
- 实现高级数据结构:链表常用作其他数据结构,如堆栈和队列的基础。
- 内存管理:由于链表元素不需要连续的内存,它们是动态数据结构的理想选择,特别是在内存碎片化可能成问题的场景中。
- 大数据操作:插入和删除大量数据时,链表通常比数组更高效。
- 🔗 链接: 链表
- 🔍 结构: 链表由节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。
📌 栈 (Stack
)
- 🎯 特点:
- 📎 后进先出(
LIFO
)数据结构 - 📎 主要操作有推入(
push
)和弹出(pop
) - 📎 只能从
栈顶
访问元素,不能从中间
访问。
- 📎 后进先出(
- 🔗 链接: 栈
- 🔍 结构: 栈可以基于数组或链表来实现。
📌 队列 (Queue
)
- 🎯 特点:
- 📎 先进先出(
FIFO
)数据结构,队列中的元素按照它们被添加的顺序进行检索。 - 📎 主要操作有入队(
enqueue
)和出队(dequeue
) - 📎 从一端(
队尾
)进入,并从另一端(队头
)出来
- 📎 先进先出(
- ⚡️ 使用:
- 任务调度: 使用优先级队列来调度任务的执行。
- 数据流处理: 在多线程环境中,生产者-消费者模型常用队列来传递数据。
- 并发控制: 使用阻塞队列来控制并发访问数量。
- 🔗 链接: 队列
- 🔍 结构: 队列可以基于数组或链表来实现。
📌 二叉树 (Binary Tree
)
- 🎯 特点:
- 📎 有明确的根节点
- 📎 每个节点最多有两个子节点
- 📎 用于高效的查找、插入、删除操作。
- 📎 有许多特殊的子类,如满二叉树、完全二叉树、平衡二叉树等
- 🔗 链接: 二叉树
- 🔍 结构: 由节点组成,每个节点包含一个数据元素,一个指向左子节点的指针和一个指向右子节点的指针。
📌 图 (Graph
)
- 🎯 特点:
- 📎 由节点(顶点)和边组成
- 📎 可以是有向或无向的
- 📎 可以表示多对多的关系
- 🔗 链接: 图
- 🔍 结构: 图的结构由顶点集合和边集合组成。
📌 哈希表 (Hash Table
)
- 🎯 特点:
- 📎 快速的查找、插入和删除 由于直接访问内存位置,常数时间复杂度内可以完成操作。
- 📎 键值对存储 存储数据的形式为键值对。
- 📎 冲突处理 当两个键的哈希值相同时,需要一种机制来处理这种冲突,常见的方法有链地址法和开放地址法等。
- 📎 动态扩容 为了保持操作的效率,当哈希表的装载因子超过一定阈值时,通常需要进行扩容。
- 🔗 链接: 哈希表
- 🔍 结构: 哈希表由一系列的桶或槽组成,每个桶或槽可以存储一个或多个键值对。
🚀 常用算法
📌 排序算法 (Sorting Algorithm
):
- 🎯 特点:
- 用于重新排列数据集,使其按某种顺序(通常是升序或降序)排列。
- 常见的排序算法包括冒泡排序、选择排序、插入排序、归并排序、快速排序等。
- 🔗 链接
- 💡 形象理解: 就像整理书架,确保每本书都按照字母顺序或大小排列。
📌 搜索算法 (Searching Algorithm
):
- 🎯 特点:
- 用于在数据集中查找特定的元素或满足某些条件的元素。
- 常见的搜索算法包括线性搜索、二分搜索等。
- 🔗 链接
- 💡 形象理解: 就像在图书馆中查找一本特定的书。
📌 递归算法 (Recursive Algorithm
):
- 🎯 特点:
- 通过自身调用来解决问题的算法。
- 常用于问题可以分解为更小、相似的子问题的情况。
- 🔗 链接
- 💡 形象理解: 就像俄罗斯套娃,每个娃娃都包含一个更小的、类似的娃娃。
📌 分治算法 (Divide and Conquer Algorithm
):
- 🎯 特点:
- 将大问题分解为小问题,独立解决小问题,然后组合结果。
- 递归经常用于实现分治算法。
- 🔗 链接
- 💡 形象理解: 就像拼图,每个小片段都被独立解决,然后所有的片段组合成完整的图片。
📌 贪心算法 (Greedy Algorithm
):
- 🎯 特点:
- 在每一步都做出在当前看来最好的选择。
- 不总是产生最优解,但在某些情况下很有效。
- 🔗 链接
- 💡 形象理解: 就像在超市抢购商品,每次都选择当前最有价值的商品,而不是长远地考虑。
📌 动态规划 (Dynamic Programming
):
- 🎯 特点:
- 将问题分解为小问题,并存储小问题的解,以避免重复计算。
- 用于解决具有重叠子问题和最优子结构的问题。
- 🔗 链接
- 💡 形象理解: 就像爬楼梯,每次决策都基于之前的选择,以最少的步骤到达顶部。
📌 图算法 (Graph Algorithm
):
- 🎯 特点:
- 用于处理图数据结构的算法。
- 常见的图算法包括图的遍历、最短路径、最小生成树等。
- 🔗 链接
- 💡 形象理解: 就像导航系统,帮助你找到从一个地方到另一个地方的最佳路径。