随笔分类 -  数据结构与算法

摘要:贪心算法 「贪心算法 greedy algorithm」是一种常见的解决优化问题的算法,其基本思想是在问题的每个决策阶段,都选择当前看起来最优的选择,即贪心地做出局部最优的决策,以期获得全局最优解。贪心算法简洁且高效,在许多实际问题中有着广泛的应用。 贪心算法和动态规划都常用于解决优化问题。它们之间 阅读全文
posted @ 2024-03-01 10:16 Blue Mountain 阅读(50) 评论(0) 推荐(0) 编辑
摘要:初探动态规划 「动态规划 dynamic programming」是一个重要的算法范式,它将一个问题分解为一系列更小的子问题,并通过存储子问题的解来避免重复计算,从而大幅提升时间效率。 给定一个共有 (n) 阶的楼梯,你每步可以上 (1) 阶或者 (2) 阶,请问有多少种方案可以爬到楼顶? 如图 1 阅读全文
posted @ 2024-03-01 09:58 Blue Mountain 阅读(70) 评论(0) 推荐(0) 编辑
摘要:回溯算法 「回溯算法 backtracking algorithm」是一种通过穷举来解决问题的方法,它的核心思想是从一个初始状态出发,暴力搜索所有可能的解决方案,当遇到正确的解则将其记录,直到找到解或者尝试了所有可能的选择都无法找到解为止。 回溯算法通常采用“深度优先搜索”来遍历解空间。在“二叉树” 阅读全文
posted @ 2024-02-28 16:58 Blue Mountain 阅读(20) 评论(0) 推荐(0) 编辑
摘要:分治算法 「分治 divide and conquer」,全称分而治之,是一种非常重要且常见的算法策略。分治通常基于递归实现,包括“分”和“治”两个步骤。 分(划分阶段):递归地将原问题分解为两个或多个子问题,直至到达最小子问题时终止。 治(合并阶段):从已知解的最小子问题开始,从底至顶地将子问题的 阅读全文
posted @ 2024-02-28 15:51 Blue Mountain 阅读(25) 评论(0) 推荐(0) 编辑
摘要:排序算法 「排序算法 sorting algorithm」用于对一组数据按照特定顺序进行排列。排序算法有着广泛的应用,因为有序数据通常能够被更高效地查找、分析和处理。 评价维度 运行效率:我们期望排序算法的时间复杂度尽量低,且总体操作数量较少(时间复杂度中的常数项变小)。对于大数据量的情况,运行效率 阅读全文
posted @ 2024-02-28 15:23 Blue Mountain 阅读(106) 评论(0) 推荐(0) 编辑
摘要:二分查找 「二分查找 binary search」是一种基于分治策略的高效搜索算法。它利用数据的有序性,每轮缩小一半搜索范围,直至找到目标元素或搜索区间为空为止 给定一个长度为 (n) 的数组 nums ,元素按从小到大的顺序排列且不重复。请查找并返回元素 target 在该数组中的索引。若数组不包 阅读全文
posted @ 2024-02-26 17:35 Blue Mountain 阅读(14) 评论(0) 推荐(0) 编辑
摘要:图 「图 graph」是一种非线性数据结构,由「顶点 vertex」和「边 edge」组成。我们可以将图 (G) 抽象地表示为一组顶点 (V) 和一组边 (E) 的集合。以下示例展示了一个包含 5 个顶点和 7 条边的图。 [ \begin{aligned} V & = { 1, 2, 3, 4, 阅读全文
posted @ 2024-02-26 11:37 Blue Mountain 阅读(15) 评论(0) 推荐(0) 编辑
摘要:堆 「堆 heap」是一种满足特定条件的完全二叉树,主要可分为两种类型 *「小顶堆 min heap」:任意节点的值 (\leq) 其子节点的值。 *「大顶堆 max heap」:任意节点的值 (\geq) 其子节点的值。 堆的常用操作 许多编程语言提供的是「优先队列 priority queue」 阅读全文
posted @ 2024-02-26 10:45 Blue Mountain 阅读(53) 评论(0) 推荐(0) 编辑
摘要:二叉树 「二叉树 binary tree」是一种非线性数据结构,代表“祖先”与“后代”之间的派生关系,体现了“一分为二”的分治逻辑。与链表类似,二叉树的基本单元是节点,每个节点包含值、左子节点引用和右子节点引用。 /* 二叉树节点结构体 */ type TreeNode struct { Val i 阅读全文
posted @ 2024-02-21 14:38 Blue Mountain 阅读(30) 评论(0) 推荐(0) 编辑
摘要:哈希表 哈希表 hash table」,又称「散列表」,它通过建立键 key 与值 value 之间的映射,实现高效的元素查询。具体而言,我们向哈希表中输入一个键 key ,则可以在 (O(1)) 时间内获取对应的值 value 。 除哈希表外,数组和链表也可以实现查询功能,它们的效率对比如表 6- 阅读全文
posted @ 2024-02-20 17:46 Blue Mountain 阅读(27) 评论(0) 推荐(0) 编辑
摘要:栈 我们把堆叠元素的顶部称为“栈顶”,底部称为“栈底”。将把元素添加到栈顶的操作叫作“入栈”,删除栈顶元素的操作叫作“出栈”。 栈的常用操作 /* 初始化栈 */ // 在 Go 中,推荐将 Slice 当作栈来使用 var stack []int /* 元素入栈 */ stack = append 阅读全文
posted @ 2024-02-20 16:59 Blue Mountain 阅读(26) 评论(0) 推荐(0) 编辑
摘要:数组 「数组 array」是一种线性数据结构,其将相同类型的元素存储在连续的内存空间中。我们将元素在数组中的位置称为该元素的「索引 index」 数组常用操作 初始化、访问、插入、删除、遍历、查找、扩容 总的来看,数组的插入与删除操作有以下缺点。 时间复杂度高:数组的插入和删除的平均时间复杂度均为 阅读全文
posted @ 2024-02-20 15:51 Blue Mountain 阅读(43) 评论(0) 推荐(0) 编辑
摘要:数据结构分类 逻辑结构:线性与非线性 逻辑结构揭示了数据元素之间的逻辑关系。 线性数据结构:数组、链表、栈、队列、哈希表。 非线性数据结构:树、堆、图、哈希表。 非线性数据结构可以进一步划分为树形结构和网状结构。 线性结构:数组、链表、队列、栈、哈希表,元素之间是一对一的顺序关系。 树形结构:树、堆 阅读全文
posted @ 2024-02-20 14:17 Blue Mountain 阅读(124) 评论(0) 推荐(0) 编辑