随笔分类 - AL
摘要:缓存置换算法 缓存置换算法 操作系统本质上是一个多级缓存系统,从cpu寄存器,cpu一级缓存,cpu二级缓存,cpu三级缓存,主内存,硬盘,从右到左访问效率依次提升。如何在有限的资源内处理无限的数据?最理想的情况是置换出未来短期内不会被再次访问的数据,但是我们无法预知未来,所以只能从数据在过去的访问
阅读全文
摘要:树链剖分原理和实现 理解 树链剖分就是将树分割成多条链,然后利用数据结构(线段树、树状数组等)来维护这些链。首先就是一些必须知道的概念:重结点:子树结点数目最多的结点;轻节点:父亲节点中除了重结点以外的结点;重边:父亲结点和重结点连成的边;轻边:父亲节点和轻节点连成的边;重链:由多条重边连接而成的路
阅读全文
摘要:树状数组的原理和实现 概念 树状数组或者二叉索引树也称作Binary Indexed Tree,又叫做Fenwick树;它的查询和修改的时间复杂度都是log(n),空间复杂度则为O(n),这是因为树状数组通过将线性结构转化成树状结构,从而进行跳跃式扫描。通常使用在高效的计算数列的前缀和,区间和。 其
阅读全文
摘要:跳跃表原理和实现 前提 有时候会被问到链表如果做到二分搜索,可能会有部分的人会去把链表中的值保存到数组来进行二分,但是如果知道跳跃表的话,那么这个数据结构就可以解决这个困惑,它允许快速查询一个有序连续元素的数据链表,它的效率可以做到和二分相同,都是O(logn)的平均时间复杂度,其空间复杂度为O(n
阅读全文
摘要:前言 的确,我一开始的时候也认为二分查找挺简单的,但是在我对二分查找进行总结的时候,发现虽然思路很简单,但是代码要写的正确就不容易了。 区间 需要注意的是 注意计算的区间是左闭右开区间[)还是左闭右闭区间[],两者的代码是不太一样的。 左闭右闭区间 如果说你使用的是左闭右闭区间: int searc
阅读全文
摘要:求二叉树中任意两个结点的距离 实现步骤: 1 class Node(object): def __init__(self, value=0): self.value = value self.left = self.right = None def get_path_length(root, n,
阅读全文
摘要:排序算法 下面算法均是使用Python实现: 插入排序 原理:在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。通常使用在长度较小的数组的情况以及作为其它复杂排序算法的一部分,比如mergesort或qui
阅读全文
摘要:最短路径算法 最短路径算法通常用在寻找图中任意两个结点之间的最短路径或者是求全局最短路径,像是包括Dijkstra、A*、Bellman-Ford、SPFA(Bellman-Ford的改进版本)、Floyd-Warshall、Johnson、BFS等等,这里要集中介绍Dijkstra和Floyd,前
阅读全文
摘要:最小生成树算法 一个连通图可能有多棵生成树,而最小生成树是一副连通加权无向图中一颗权值最小的生成树,它可以根据Prim算法和Kruskal算法得出,这两个算法分别从点和边的角度来解决。 Prim算法 理解 Prim算法从单一顶点开始,其按照以下步骤逐步扩大树中所包含顶点的数目,直到遍及连通图的所有顶
阅读全文
摘要:LRU算法总结 无论是哪一层次的缓存都面临一个同样的问题:当容量有限的缓存的空闲空间全部用完后,又有新的内容需要添加进缓存时,如何挑选并舍弃原有的部分内容,从而腾出空间放入这些新的内容。解决这个问题的算法有几种,如最近使用算法(LRU)、先进先出算法(FIFO)、最近最少使用算法(LFU)、非最近使
阅读全文
摘要:LCA算法 朴素算法 也就是我们所说的暴力算法,大致的思路是从树根开始,往下迭代,如果当前结点比两个结点都小,那么说明要从树的右子树中找;相反则从左子树中查找;直到找到一个结点在当前结点的左边,一个在右边,说明当前结点为最近公共祖先,如果一个结点是另外一个结点的祖先,那么返回前面结点的父亲结点即可。
阅读全文
摘要:B树和B+树总结 B树 简介 这里的B树,也就是英文中的B-Tree,一个 m 阶的B树满足以下条件: 每个结点至多拥有m棵子树; 根结点至少拥有两颗子树(存在子树的情况下),根结点至少有一个关键字; 除了根结点以外,其余每个分支结点至少拥有 m/2 棵子树; 所有的叶结点都在同一层上,B树的叶子结
阅读全文
摘要:哈希算法总结 散列函数 除法散列法乘法散列法全域散列法 冲突解决办法 拉链法开放寻址法线性探查二次探查双重散列 线性探查二次探查双重散列 直接寻址法 直接寻址技术,顾名思义,为每一个关键字分配一个槽,适用于全域数量较少,并且对内存并不要求的情况下,这种方法可以保证了其每一个操作的时间复杂度都是O(1
阅读全文
摘要:删除 因为根据BST中的规则,选择该结点的左子树中最大值和右子树中最小值替代掉原本要删除的点的值,再将改点删掉即可,所以这里只会讨论那个删掉的点。 分为以下情况: 1. 删除结点的左右子结点均为空,则将其直接删除即可; 2. 删除结点的左右子结点其中一方为空,则将存在的那一方的子结点替代掉删除结点即
阅读全文
摘要:红黑树 性质 1. 红黑树的结点都是红色或者黑色 2. 根结点是黑色 3. 所有叶子都是黑色(这里的叶子结点是空结点) 4. 每个红色结点必须有两个黑色的子结点 5. 从任何一个节点到其每个叶子的所有简单路径都包含相同数目的黑色结点 性质1和性质3总是能够保持着; 性质4只有在这些情况下才会发生作用
阅读全文
摘要:O(n) 排序算法 前言 前面有总结过各类常用的排序算法,但是那些排序算法平均的时间复杂度是O(nlogn),所以我要介绍三种时间复杂度为O(n)的线性时间复杂度的排序算法。 计数排序 计数排序利用了哈希的性质,将一个中间数组来记录数值对应的下标,最后查询对应的下标进行放置; 步骤如下: 1. 找出
阅读全文
摘要:排序算法总结 直接插入排序 基本思想:将一个值插入到已经排好序中的相应位置。 冒泡排序 基本思想:两两比较相邻纪录的关键字,如果是反序的则进行交换。 简单选择排序 基本思想:从一个数组中选择一个最小(或者最大)的值和第一个位置进行交换,接着选择次的值和第二个位置交换,以此类推。 cpp void S
阅读全文
摘要:贪心算法的原理和实现 1 基本思想 从问题的某一个初始解出发,通过一系列的贪心选择-当前状态下的 局部最 优选择,逐步逼近给定的目标; 在每个阶段,都作出一个按照()某个评价函数最优的决策,这个评价函数最优称为贪心准则(类似于动态规划的状态转移方程) 2 基本步骤 和动态规划类似 3 性质 一般具有
阅读全文
摘要:1 动态规划 1.1 定义 动态规划的核心是状态和状态转移方程。 在记忆化搜索中,可以为正在处理的表项声明一个引用,简化对它的读写操作; 动态规划解决的是多阶段决策问题; 和分治法最大的区别在于:适合于用动态规划的问题,经过分解以后得到的子问题往往不是相互独立的(即下一个子阶段的求解是建立在上一个子
阅读全文
摘要:定义 在图论中,由一个 有向无环图 组成的序列,只要满足下面两种情况则称为拓扑排序: 每个顶点只允许访问 一次 ; 若顶点A在图中存在到达顶点B的路径,则不会存在顶点B到顶点A的路径,也就是说这条路径是 单向 的; 可以从这副图中发现,如果按照DFS的思想,那么其访问结点的结果为 5,2,3,1,0
阅读全文