随笔分类 - 数据结构与算法
摘要:刷链表题目(训练递归思维) 递归反转链表的一部分 Leetcode [92][206]. 反转链表ii&i-输入一个链表,反转链表后,输出链表的所有元素。 如何k个一组反转链表 Leetcode 25. K 个一组反转链表 如何判断回文链表 Leetcode [234] 回文链表 回文 链表 二叉树
阅读全文
摘要:基本技巧 动态规划解题套路框架 基础代码框架介绍 动态规划答疑篇 最优子结构 状态压缩:对动态规划进行降维打击 动态规划和回溯算法到底谁是谁爹? 子序列类型问题 经典动态规划:编辑距离 Leetcode 72 编辑距离edit-distance-动态规划,计算两词之间变换的最小步数 信封嵌套问题 L
阅读全文
摘要:本文用pat表示模式串,长度为M,txt表示文本串,长度为N。KMP 算法是在txt中查找子串pat,如果存在,返回这个子串的起始索引,否则返回 -1。 一、KMP 算法概述 首先还是简单介绍一下 KMP 算法和暴力匹配算法的不同在哪里,难点在哪里,和动态规划有啥关系。 暴力的字符串匹配算法很容易写
阅读全文
摘要:递归算法 二叉树的递归算法非常简单,设置好递归出口之后,根据遍历的顺序,对当前节点的左右子递归调用自身即可。其前序、中序、后序遍历的代码如下。 void preorder1(Node *root) //递归前序遍历 { if (root == NULL) return; printf("%d ",
阅读全文
摘要:memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中。 但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开销。 memmove的处理措施: (1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝 (2
阅读全文
摘要:让我们通过考虑下面的问题来理解线段树。 给定一个数组arr[0 . . . n-1],我们要对数组执行这样的操作: 1 计算从下标l到r的元素之和,其中 0 <= l <= r <= n-12 修改数组指定元素的值arr[i] = x,其中 0 <= i <= n-1 一个简单的方案是从l到r执行
阅读全文
摘要:一.LCA详解 转自:https://www.cnblogs.com/ECJTUACM-873284962/p/6613379.html 首先是最近公共祖先的概念(什么是最近公共祖先?): 在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点,而最近公共祖先,就是两个节点在这棵树上深度最大的公共的
阅读全文
摘要:来看一个实例,HDU1232畅通工程 首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的。最后要解决的是整幅图的连通性问题。比如随意给你两个点,让你判断它们是否连通,或者问你整幅图一共有几个连通分支,也就是被分成了几个互相独立的块。像畅通工程这题,问还需要修
阅读全文
摘要:一、概念 1、回文(palindrome) 回文就是正读和反读都一样的字符串,如aba,abba,abcba等。 2、字符子串和字符子序列的区别 (1)字符字串指的是字符串中连续的n个字符,如abcdefg中,ab,cde,fg等都属于它的字串。 (2)字符子序列指的是字符串中不一定连续但先后顺序一
阅读全文
摘要:1.摘要:继上篇最长上升子序列后,本篇主要讲述最长公共子序列 (LCS) 。 2.LCS定义: 最长公共子序列,英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序
阅读全文
摘要:1.摘要: 关于LIS部分,本篇博客讲一下LIS的概念定义和理解,以及求LIS的三种方法,分别是O(n^2)的DP,O(nlogn)的二分+贪心法,以及O(nlogn)的树状数组优化的DP,最后附上几道非常经典的LIS的例题及分析。 2.LIS的定义: 最长上升子序列(Longest Increas
阅读全文
摘要:1、排序解决法 如果是一个有序数组,那么寻找第k的大数则相当简单了,且效率为1。数组排序算法中相对较优的算法为快速排序,效率为N*lgN,将数组从到到小排列,第k大的数则为array[k-1]。 快排的思想为,从数组中取任意一个值key,将大于key的值放在key右边,小于key的值放在key左边。
阅读全文
摘要:动态规划的定义:动态规划是运筹学的一个分支,是求解决策过程的最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程的优化问题时,提出了著名的最优化原理,把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法——动态
阅读全文
摘要:由来:FNV哈希算法全名为Fowler-Noll-Vo算法,是以三位发明人Glenn Fowler,Landon Curt Noll,Phong Vo的名字来命名的,最早在1991年提出。 特点和用途:FNV能快速hash大量数据并保持较小的冲突率,它的高度分散使它适用于hash一些非常相近的字符串
阅读全文
摘要:我对这些hash的散列质量及效率作了一个简单测试,测试结果如下: 测试1:对100000个由大小写字母与数字随机的ANSI字符串(无重复,每个字符串最大长度不超过64字符)进行散列: BKDRHash SDBMHash RSHash APHash ELFHash JSHash DEKHash FNV
阅读全文
摘要:单链表的特点是:单向。设头结点位head,则最后一个节点的next指向NULL。如果只知道头结点head,请问怎么将该链表排序? 设结点结构为 struct Node{ int key; Node* next; }; 那么一般人见到这种题目,立马就会想到指针交换。是的,大家被指针交换的题目做多了,形
阅读全文
摘要:consistent hashing 算法早在 1997 年就在论文 Consistent hashing and random trees 中被提出,目前在 cache系统中应用越来越广泛; 1 基本场景 比如你有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 obje
阅读全文
摘要:题目:请简要介绍FIFO、LRU、LFU的含义和原理 含义: FIFO:First In First Out,先进先出LRU:Least Recently Used,最近最少使用 LFU:Least Frequently Used,最不经常使用 以上三者都是缓存过期策略。 原理和实现: 一、FIFO
阅读全文
摘要:本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(log n)的时间复杂度
阅读全文
摘要:B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如: B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中; 否则,如果查询关键字比结点
阅读全文