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

摘要:动态规划实战 新的搜索问题:搜索引擎纠错功能实现? 量化字符串相似度--》编辑距离:将一个字符串转化成另一个字符串,需要的最少编辑操作次数(比如增加一个字符、删除一个字符、替换一个字符) 莱文斯坦距离(Levenshtein distance):允许增加、删除、替换字符这三个编辑操作 最长公共子串长 阅读全文
posted @ 2020-01-05 16:19 杨海星 阅读(233) 评论(0) 推荐(0)
摘要:动态规划理论 一个模型三个特征 多阶段决策最优解模型 最优子结构 最优子结构指的是,问题的最优解包含子问题的最优解。反过来说就是,我们可以通过子问题的最优解,推导出问题的最优解。 如果我们把最优子结构,对应到我们前面定义的动态规划问题模型上,那我们也可以理解为,后面阶段的状态可以通过前面阶段的状态推 阅读全文
posted @ 2020-01-03 20:30 杨海星 阅读(228) 评论(0) 推荐(0)
摘要:动态规划(Dynamic Programming) 初识 使用动态规划解决回溯算法中的 0-1背包问题: 把整个求解过程分为 n 个阶段,每个阶段会决策一个物品是否放到背包中。 每个物品决策(放入或者不放入背包)完之后,背包中的物品的重量会有多种情况,也就是说,会达到多种不同的状态,对应到递归树中, 阅读全文
posted @ 2020-01-02 20:42 杨海星 阅读(189) 评论(0) 推荐(0)
摘要:回溯算法 如何理解 人的一生中,会遇到很多重要的岔路口。在岔路口上,每个选择都会影响我们今后的人生。有的人在每个岔路口都能做出最正确的选择,最后生活、事业都达到了一个很高的高度;而有的人一路选错,最后碌碌无为。如果人生可以量化,那如何才能在岔路口做出最正确的选择,让自己的人生“最优”呢? 每个岔路口 阅读全文
posted @ 2019-12-26 16:37 杨海星 阅读(292) 评论(0) 推荐(0)
摘要:分治算法(divide and conquer) 算法思想 核心思想:分而治之 ,将原问题划分成 n 个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解。 适合用递归来实现。 分治算法的递归实现中,每一层递归都会涉及这样三个操作: 分解:将原问题分解成 阅读全文
posted @ 2019-12-25 17:53 杨海星 阅读(318) 评论(0) 推荐(0)
摘要:贪心算法 贪心算法问题解决步骤 本质就是"在满足限制条件下,只考虑当前最优的步骤,而不顾全大局" 贪心算法实战分析 分糖果:有 m 个糖果和 n 个孩子。要把糖果分给这些孩子吃,但是糖果少,孩子多(m<n),所以糖果只能分配给一部分孩子。每个糖果的大小不等,这 m 个糖果的大小分别是 s1,s2,s 阅读全文
posted @ 2019-12-25 11:44 杨海星 阅读(390) 评论(0) 推荐(0)
摘要:搜索算法 深度优先、广度优先搜索 简单、暴力 基于“图” 无向图的定义 public class Graph { // 无向图 private int v; // 顶点的个数 private LinkedList<Integer> adj[]; // 邻接表 public Graph(int v) 阅读全文
posted @ 2019-12-24 18:53 杨海星 阅读(245) 评论(0) 推荐(0)
摘要:图(Graph) 概念 顶点--图中的元素 边--顶点与顶点之间的关系 度--连向某顶点的边的个数称为该顶点的度 无向图、有向图、加权图 无向图--没有方向,关系是相互的,应用如微信好友,好友关系是相互的 有向图--有方向,度分为入度和出度,应用如微博关注,关注是有可以单向的 带权图--关系增加权重 阅读全文
posted @ 2019-12-19 21:53 杨海星 阅读(165) 评论(0) 推荐(0)
摘要:Trie树 概念 多叉树,节点为字符串中的单个字符。 Trie 树的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起。 将多个字符串按字符拆分插入Trie树,用于字符串查找,关键词提示等 举例:我们有 6 个字符串,它们分别是:how,hi,her,hello,so,see。我们希望在里面 阅读全文
posted @ 2019-12-18 14:57 杨海星 阅读(231) 评论(0) 推荐(0)
摘要:字符串匹配 在字符串 A 中查找字符串 B 主串为A 模式串为B BF算法(Brute Force) 最简单、粗暴的字符串匹配算法。 实现思路是,拿模式串与主串中是所有子串匹配,看是否有能匹配的子串。时间复杂度也比较高,是 O(n*m),n、m 表示主串和模式串的长度。 满足KISS(Keep it 阅读全文
posted @ 2019-12-18 10:07 杨海星 阅读(140) 评论(0) 推荐(0)
摘要:堆 概念 堆是一个完全二叉树; 堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。 根据节点值跟子树的大小关系分为:大顶堆和小顶堆。 如何实现 如何存储 二叉树章节有讲到完全二叉树适合用数组存储,所以用数组来存储堆 二叉树章节有讲到完全二叉树适合用数组存储,所以用数组来存储堆 有哪 阅读全文
posted @ 2019-12-13 00:24 杨海星 阅读(191) 评论(0) 推荐(0)
摘要:二叉树(Binary Tree) 树 根节点、父节点、兄弟节点、叶子节点 高度、深度、层的概念 二叉树 顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子节点和右子节点,并不要求都要有二个节点,有的只有左节点,有的只有右节点 满二叉树 图中编号2的二叉树,叶子节点全都在最底层,除了叶子 阅读全文
posted @ 2019-12-11 18:30 杨海星 阅读(208) 评论(0) 推荐(0)
摘要:散列表 概念 1.散列表来源于数组,它借助散列函数对数组这种数据结构进行扩展,利用的是数组支持按照下标随机访问元素的特性。2.需要存储在散列表中的数据我们称为键,将键转化为数组下标的方法称为散列函数,散列函数的计算结果称为散列值。3.将数据存储在散列值对应的数组下标位置。 散列函数 1.散列函数计算 阅读全文
posted @ 2019-12-11 14:25 杨海星 阅读(268) 评论(0) 推荐(0)
摘要:跳表 定义 为一个值有序的链表建立多级索引,比如每2个节点提取一个节点到上一级,我们把抽出来的那一级叫做索引或索引层。如下图所示,其中down表示down指针,指向下一级节点。以此类推,对于节点数为n的链表,大约可以建立log2n-1级索引。像这种为链表建立多级索引的数据结构就称为跳表。 时间复杂度 阅读全文
posted @ 2019-12-11 11:11 杨海星 阅读(215) 评论(0) 推荐(0)
摘要:如何选择排序 小规模用插入排序 大规模用快速排序 通用用快速排序 特殊场景用桶排序、计数排序、基数排序 为什么用快速排序不用归并排序 归并排序虽然在最坏情况下时间复杂度为O(nlogn),比快速排序好,但不是原地排序,空间复杂度过高,意味着耗费较多内存 快速排序在最坏情况下时间复杂度为O(n2),可 阅读全文
posted @ 2019-12-02 09:42 杨海星 阅读(176) 评论(0) 推荐(0)
摘要:线性排序 线性排序即时间复杂度为O(n)的排序算法 桶排序 >分桶+归并排序-->取出结果 计数排序 >分桶+计数-->先统计计数,再取出来,实现排序 基数排序 >在每个位上桶排序 桶排序的思想可用来对数据分类 桶排序--将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行排序(桶内使用归并排 阅读全文
posted @ 2019-12-02 00:23 杨海星 阅读(201) 评论(0) 推荐(0)
摘要:排序算法 如何分析一个“排序算法”?三个方面着手: 执行效率 如何分析一个“排序算法”?三个方面着手: 内存消耗 稳定性 排序比较 排序比较 排序算法动画演示:https://visualgo.net/zh/sorting 插入排序比冒泡排序高效--冒泡排序的数据交换有三个操作,插入排序数据移动只有 阅读全文
posted @ 2019-11-29 19:02 杨海星 阅读(178) 评论(0) 推荐(0)
摘要:递归 搞懂递归非常重要:递归应用非常广泛,很多数据结构和算法的编码实现都要用到递归,比如 DFS 深度优先搜索、前中后序二叉树遍历等等。 简单讲就是自己调自己 两个步骤:递--层层调用的过程;归--层层返回的过程 可以写出递推公式,如: 优点:代码的表达力很强,写起来简洁。 缺点:空间复杂度高、有堆 阅读全文
posted @ 2019-11-28 15:41 杨海星 阅读(143) 评论(0) 推荐(0)
摘要:栈 操作受限的线性表 先进后出,后进先出;只能一头进出 顺序栈--基于数组; 链式栈--基于链表 动态扩容栈--基于动态数组结构 栈应用:函数调用栈,表达式求值(操作数栈,运算符栈(比较优先级决定是出栈运算还是入栈)),括号匹配 浏览器前进后退功能实现:两个栈A和B,依次打开的链接,依次入栈A, 后 阅读全文
posted @ 2019-11-27 17:38 杨海星 阅读(127) 评论(0) 推荐(0)
摘要:数组 线性表 连续内存空间和相同数据类型 随机访问高效,插入删除低效(n数据移动) 容器方案:ArrayList(JAVA),vector(C++) 链表 线性表 非连续内存空间,数据类型可不同,通过指针连接多个结点实现 插入删除高效,查询低效(n遍历) 多种实现:单向链表,循环链表,双向链表 回文 阅读全文
posted @ 2019-11-26 17:22 杨海星 阅读(113) 评论(0) 推荐(0)