常用数据结构与算法 (一篇文章带你玩转各种技术)


📈 时间 & 空间复杂度


✏️ 常用数据结构


📌 数组 (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):

  • 🎯 特点:
    • 用于处理图数据结构的算法。
    • 常见的图算法包括图的遍历、最短路径、最小生成树等。
  • 🔗 链接
  • 💡 形象理解: 就像导航系统,帮助你找到从一个地方到另一个地方的最佳路径。

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yueerba126

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值