算法知识点
文章平均质量分 78
Virtual_Func
小风扇吹风好吵
展开
-
关于序列旋转(辗转相除求取最大公约数)
看STL看到 rotate ,关于序列旋转学习到很多东西,先说一下旋转,旋转的意思如下:输入:1 2 34 5 6 7,翻转点为 4输出:4 5 6 71 2 3即要求将序列从D开始反转。在《编程珠玑》中说过关于 [ A B ] 转到 [ B A ] 的情况,采用的方法类似翻手掌的方法,方法如下:1.先将 A ,B 分别逆序。得到: 3 2 17 6 5 42.再将原创 2015-10-30 18:44:28 · 803 阅读 · 0 评论 -
辗转相除法求得最大公约数的证明
描述:关于辗转相除法的具体实现在这里就不具体说明了,本文要记录的是辗转相除法应用于求最大公约数的算法证明过程。 假设:求m和n的最大公约数。a,b分别是m除以n的商和余数,即m=na+b。gcd(m,n)表示m和n的最大公约数。 求证:gcd(m,n)=gcd(n,b) 证明: 设c=gcd(m,n), d=gcd(n,b) 1转载 2016-04-08 11:15:32 · 7476 阅读 · 0 评论 -
字符串匹配的KMP算法
字符串匹配是计算机的基本任务之一。 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"? 许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth。 这种算法不太容转载 2016-03-25 10:46:14 · 569 阅读 · 0 评论 -
AVL树的思想与C++实现
AVL树(Adelsin-Velskii-Landis Tree)是平衡二叉搜索树的一种,它要求任何节点的左右子树的高度相差最多为1。现在将总结AVL树的基本操作。1.关于树的节点的一些常用术语的定义a.路径长度(length):根节点至任意节点之间有唯一路径,该路径所经过的边数即为路径长度b.深度(depth):根节点至任意节点的路径长度即为该节点的深度c.高度(heig原创 2015-10-04 17:10:47 · 692 阅读 · 0 评论 -
线性时间排序C++代码集合(计数排序,基数排序,桶排序([0~1)的浮点数))
1. 计数排序输入:待排序数组 vec输出:排序结果数组 res占用额外空间:max_value(vec) 大小的数组void countSort(vector & vec,vector & result){ vector c_vec; //额外空间 result.resize(vec.size()); //输出预留空间 for (auto val : vec)原创 2016-03-09 11:40:26 · 752 阅读 · 0 评论 -
二叉树前序、中序、后序遍历非递归写法的透彻解析
前言在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历。递归写法,只要理解思想,几行代码。可是非递归写法却很不容易。这里特地总结下,透彻解析它们的非递归写法。其中,中序遍历的非递归写法最简单,后序遍历最难。我们的讨论基础是这样的: [cpp] view plain copy //Binary Tree Node转载 2016-03-08 09:10:19 · 1615 阅读 · 0 评论 -
求数组中若干个元素之和等于给定值
这个问题的基础版本是:在数组中找两个元素,使其之和等于某个给定值。解法简单:将数组排序后,用两个指针分别位于数组首与数组尾,然后计算两个指针所指元素的和,若大于给定的元素,则尾部的指针向前移动;若小于给定的元素,则首部的指针向后移动。但该问题提升后,成为了子集和问题,这是一个NP问题。在leetcode上还有升级版本的问题:求给定数组中四个元素之和等于给定元素的所有元素的子集。该问题,只能用暴原创 2016-03-19 15:52:57 · 10152 阅读 · 0 评论 -
动态规划之整齐打印
算法描述部分转自:点击打开链接''' 乍一看以为是空格个数和,如此可以使用“贪心算法”求解,即从第一行开始尽可能多的放置单词,可以证明这个“贪心解”也是最优的,假设有一个最优解从某行开始和“贪心解”不相同,我们可以从这行开始进行构造证明,将下一行的某些单词拿到行尾来使得当前行为“贪心解”,如此“贪心解”的行数必定不大于“最优解”,如此命题得证。此处的空格立方和,有点类似数学期望的方差,原创 2016-03-18 11:43:51 · 2208 阅读 · 0 评论 -
最长递增子序列的求解(O(n*n),O(nlogn))——动态规划
该问题均使用动态规划来解决1.在O(n*n)的复杂度下求解最长递增子序列1) 描述最优子结构序列中每个元素维护两个额外信息量,均假设当前元素(i)是 (0~i-1)个元素子序列中作为递增子序列的最后一个元素,则维护当前元素最后最后一个元素的递增子序列的长度,并维护该序列中当前元素的前一个元素。如:{1,5,6,7,3} 中,元素1 维护的信息量分别为:(1)从0~0的子序列原创 2016-03-17 11:55:04 · 1244 阅读 · 1 评论 -
算法导论有趣题——4-2,6-3
4-2:题目描述:某数组A[1,2,...n]含有所有从0到n的证书,但其中一个整数不在数组中。通过辅助数组B[0,...n]来记录A中出现的整数(1)在O(n)时间找到缺失整数(2)若数组中每个数值是二进制的,不能直接对每个数取出其数值,则如何找到缺失解答:(1)遍历数组A,将每个出现的值存储在B中下标对应值,之后遍历一次B即可eg:for val原创 2016-03-05 09:57:01 · 762 阅读 · 0 评论 -
算法导论有趣题——第二章集合
题目:有两个各存放在数组A和数组B中的n位二进制整数,考虑其相加问题。将所得结果以二进制形式存放在数组C中,C的维数为[n+1]。写出伪代码解决:func(A,B,C):carry_bit = 0for i = 1 ~ n:v = A[i] + B[i] + carry_bitC[i] = v % 2carry_bit = v / 2C[n原创 2016-03-04 09:51:36 · 596 阅读 · 0 评论 -
STL 中 lower_bound 与 upper_bound 与 二分查找
首先,先说明 lower_bound 与 upper_bound 的含义。对于区间 [first,last) 内的元素:1.lower_bound :寻找最远的 i,使得 [ first, i ) 中的每个迭代器 j 都满足 *j 2.upper_bound:寻找最远的 i,使得 [ first, i ) 中的每个迭代器 j 都不满足 *j > value示例:序列: 1,原创 2015-11-01 12:07:18 · 794 阅读 · 0 评论 -
牛客网刷题的知识点积累
关于树1. 树中节点的度数与树的关系a) 树的分支数=度数为1的节点数*1 + 度数为2的节点数*2 + 度数为3的节点数*3....b) 树的分支数=树的节点数 - 1c) 树的节点数=度数为1的节点数+度数为2的节点数+度数为3的节点数....原创 2016-08-15 09:53:26 · 772 阅读 · 0 评论