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

摘要:一、定义 特点: 1、有多层链表,每层都是排序好的 2、每一个级别都是其更低级别的子集 3、除最底层Level0,每层每个索引节点包含两个指针,一个向下,一个向右; 如下: 二、复杂度 增删查可以在O(logn)时间内完成 数组可以二分,跳表就是实现可以二分的链表, 查询时从最上层开始,只要右侧节点 阅读全文
posted @ 2020-06-10 23:04 蓝天随笔 阅读(207) 评论(0) 推荐(0)
摘要:一、定义 LSM(Log Structured Merge Trees)日志结构合并树。 其实不是一种树,是一种思想 根B/B+树一样,常用于一些nosql数据库的索引结构(如Hbase Cassandra SQLite)。 它的出现时为了解决B+树 磁盘IO随机读取的效率问题。 LSM索引只做ap 阅读全文
posted @ 2020-06-06 23:24 蓝天随笔 阅读(1364) 评论(0) 推荐(0)
摘要:一、定义 Trie树,又叫前缀树、字典树 典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计 特点:额外构造一颗Trie树,后续查询以O(len) (len为字符串长度) 时间复杂度完成查找和统计,以空间换时间 Trie树的基本性质: (1)根节点不包含 阅读全文
posted @ 2020-06-06 23:20 蓝天随笔 阅读(201) 评论(0) 推荐(0)
摘要:一、定义 Huffma树,霍夫曼树 或 哈夫曼树,是一种带权路径和最短的树,也叫最优二叉树 一个树的带权路径和=每个叶子节点的带权路径长度之和 一个叶子节点的带权路径长度 = 节点权值 * 层高 如下,节点1的带权路径长度=1*2(层高)=2 整个树的带权路径长度=1*2 + 2*2 + 3*2 + 阅读全文
posted @ 2020-06-06 22:55 蓝天随笔 阅读(348) 评论(0) 推荐(0)
摘要:一、B树 二叉树只有最多2个分支,B树可以有多个分支,可以理解为"平衡多叉树" B树相对二叉树在于每个节点可存储多个值,这样整体树将变得 ”矮胖“,树的高度比小,这样查询的效率就会变高。 数据库一次读操作以block为单元,一个block一般4K,我们把一个block数据尽量放入一个节点中,就避免数 阅读全文
posted @ 2020-06-04 22:46 蓝天随笔 阅读(424) 评论(0) 推荐(0)
摘要:一、二叉搜索树(BST) 每个非叶子节点最多只有左右两个子节点。 左子节点的值 < 父节点的值 右子节点的值 > 父节点的值 层数从1开始, 1、第i层最多有2^(i-1)个节点 2、树高为i层,最多有2^i - 1 个节点 二叉搜索树的遍历: 中序遍历:父节点放在中间 前序遍历:父节点放在前面 后 阅读全文
posted @ 2020-06-02 23:04 蓝天随笔 阅读(196) 评论(0) 推荐(0)
摘要:一、区别 给定两个字符串,求LCS 最长公共子串 (Longest Common Substring): 要求是连续的字符串 最长公共子序列(Longest Common Subsequence):要求子字符串相对顺序不变即可 二、动态规划求解 1、最长公共子串 给定两个字符串A 和 B 用二维数组 阅读全文
posted @ 2020-06-01 22:48 蓝天随笔 阅读(355) 评论(0) 推荐(0)
摘要:一、算法介绍 SPFA算法(Shortest Path Faster Algorithm)是基于Bellman-Ford算法的优化 Bellman-Ford算法复杂度: O(V*E) (V:点个数 E:边个数) SPFA算法复杂度:O(k*E) k为所有顶点进队的平均次数 缺点:SPFA的算法时间效 阅读全文
posted @ 2020-05-31 18:08 蓝天随笔 阅读(343) 评论(0) 推荐(0)
摘要:一、算法介绍 Dijkstra算法不能适用有负权边的情况 1、单源 求某个节点到其他所有节点的最短距离 2、适用有负权边的情况 3、动态规划思想 对经历的边数进行迭代计算(n个节点最多经历n-1次计算,超过n-1次则说明有负权环存在) 第一次迭代 ,从源点出发经历一条边所能达到的最短距离 第二次迭代 阅读全文
posted @ 2020-05-31 18:00 蓝天随笔 阅读(401) 评论(2) 推荐(1)
摘要:一、算法介绍 迪杰斯特拉(Dijkstra)算法用于计算一个节点到其他所有节点的最短路径。 1、单源 2、贪心算法 3、适用无负权边的情况 二、算法思想 准备2个集合 S 和 U S保存已经计算好的源节点到此节点最短距离 U保存未计算好最短记录的点 每次从U中取出最小的值,放入S中,其他节点根据此节 阅读全文
posted @ 2020-05-31 17:22 蓝天随笔 阅读(847) 评论(0) 推荐(0)
摘要:一、使用场景 频繁修改场景下用于求前缀和 前缀积等(区间和可以通过前缀和计算而来) 查询和修改的时间复杂度都是O(logN) 二、原理 如求前缀和 (树桩数组只是存一段区间的统计值,如求前缀和就存这段区间的和;如果求出现次数就存这段区间的数出现的次数) 一个原始数组A 对应一个树桩数组C C[1]= 阅读全文
posted @ 2020-04-10 23:16 蓝天随笔 阅读(390) 评论(0) 推荐(0)
摘要:一、使用场景 线段树又叫区间树,也是一种二叉树 场景 1、通常用于求解区间和(积、最大值、最小值)(满足结合律) 2、节点值会不断修改 如下:每个节点至少有2个属性:区间、区间值 二分的思想:每个节点把区间的和保存起来 这样可以在O(logN)时间内查询出区间和 二、线段树构建 由数组递归构建 /* 阅读全文
posted @ 2020-04-07 23:10 蓝天随笔 阅读(436) 评论(0) 推荐(0)
摘要:一、稳定性 何为稳定:假设A==B 排序前A再B前面,排序后A依然在B前面,这就是稳定的排序算法 如冒泡排序 插入排序 归并排序可以是稳定的。快速排序 选择排序是不稳定的。 稳定性跟具体算法实现有关:我们说冒泡排序是稳定的 如果我们的冒泡算法判断A>=B 则交换A和B,这种写法那就不稳定了 因为A= 阅读全文
posted @ 2020-03-18 23:34 蓝天随笔 阅读(213) 评论(0) 推荐(0)
摘要:一、场景 并查集多数是用来解决连通性问题的 如至少修建几条路可以使所有路口可以相通 把互通的路口当做一个群组,那问题就是有几个这样的群组 如有N个群组 那至少修N-1条路 就可以把所有路口相连。 二、使用 并查集分两步 1、合并 合并就是把相连的多个节点划到一个群组中 可以定义数组parent[] 阅读全文
posted @ 2020-03-16 22:39 蓝天随笔 阅读(173) 评论(0) 推荐(0)
摘要:一、分类 深度搜索:不断的搜索或计算子问题,直到某个分支结束,再回溯到上一个子问题,用途广泛 递归的实现就是一种深度搜索。 用的是栈的结构 广度搜索: 每次搜索下一个阶段的所有选项,都结束后 再来下一个阶段 用于求最短路径之类的问题。 用的是队列的结构 二、二叉树前序 后序 中序遍历 这3种都属于深 阅读全文
posted @ 2020-03-11 22:13 蓝天随笔 阅读(461) 评论(0) 推荐(0)
摘要:一、思想 贪心算法考虑的是眼前的利益,是局部最优解 ,并不能保证最终最优解 如果能从局部最优解 推断出 问题的解,才适用,适用场景较少 如经典的换钱币问题,有 1元 3元 4元的钱币 问给定N元 可以换最少的个钱币个数 局部最优的话 ,那每次当然换4元的钱币 这样才是最优的。但最终不是最优的 如6元 阅读全文
posted @ 2020-03-11 21:25 蓝天随笔 阅读(121) 评论(0) 推荐(0)
摘要:一、思想 取某一维度的中间值 分成两半,每次只需要跟其他一半查找或计算 如:对于一个有序的数组 查找某个值 ,那二分可以直接对数组下标进行二分 输入: nums = [-1,0,3,5,9,12], target = 9 输出: 4 解释: 9 出现在 nums 中并且下标为 4 二、解题模式 常用 阅读全文
posted @ 2020-03-11 21:15 蓝天随笔 阅读(175) 评论(0) 推荐(0)
摘要:一、一般使用场景 常用于多阶段决策问题 最优解问题 区别于贪心算法只考虑眼前的局部利益 动态规定求解的是整体的最优值 如:求A到B的最短路径 A出发可达 A1 A2 A3 A1 出发可达 B1 B2 A2 出发可达 B2 B3 .... 二、特点 最优子结构 : 最优解的问题可以由子问题的最优解转换 阅读全文
posted @ 2020-03-11 20:50 蓝天随笔 阅读(121) 评论(0) 推荐(0)