
算法学习
文章平均质量分 70
DrCrypto
这个作者很懒,什么都没留下…
展开
-
二叉排序树序列判定
二叉排序树序列判定设二叉排序树中,关键字由1到1000的整数构成,现要查询关键字为363的结点,下述关键字序列中不可能是在二叉排序树上查找的序列是(C)A. 2,252,401,398,330,344,397,363 B. 924,220,911,244,898,258,362,363 C. 925,202,911,240,912,245,363 D. 2,399,387,219,266,38原创 2016-10-19 16:27:11 · 12538 阅读 · 2 评论 -
思考平衡树调整问题
思考平衡树调整问题@(算法学习)在这篇文章中讲到了如何根据型号记忆旋转的方向。但是还不够深入具体。http://blog.youkuaiyun.com/u011240016/article/details/52877474?locationNum=1&fps=1现在挑其中一种RL型举例说明,如何先R再L,对什么结点进行旋转。最简单的RL型是最让人难受的一种运用场景。针对无向图:连通:从顶点v到顶点w都有路径存在。极大连通子图:该连通子图包含所有的边极小联通子图:既要保持图的通畅,又要使得边数最少。图的生成树是极小连通子图。即:对于树而言,砍掉一条边,则会变成非连通图,若加上一条边则会形成一个回路。针对有向图:强连通:考虑方向,从顶点v到顶点w,从顶点w到顶点v都有路径,称之为强连通。弱连通:不考虑方向,即把有向图退化为无原创 2016-12-06 15:09:54 · 4200 阅读 · 0 评论 -
KMP原理及使用的再总结
KMP原理及使用的再总结@(算法学习)回顾之前写的文章,再看对其中的简单数学原理理解更深了。但是奇怪的是,看别人用有限自动机理论解释还是看不太懂,索性还是从这里起步推导为佳。http://blog.youkuaiyun.com/u011240016/article/details/52372086?locationNum=1&fps=1这篇主要说明了如何只根据模式串(待匹配的子串)自身推导得出下一个要比较的字符原创 2016-11-09 16:22:28 · 2571 阅读 · 0 评论 -
STL模板之vector与sort的使用
STL模板之vector与sort的使用@(算法学习)题目描述 题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩.都按先录入排列在前的规则处理。 例示: jack 70 peter 96 Tom 70 smith 67 从高到低 成绩 peter原创 2016-12-09 15:38:41 · 3044 阅读 · 0 评论 -
B-树关键字个数计算
B树关键字个数计算@(算法学习)(2014.9)在一棵具有15个关键字的4阶B树中,含关键字的结点个数最多是:D个。 A. 5 B. 6 C. 10 D. 15根据m阶B树定义,根结点至多有m棵子树,即至多有m-1个关键字若根结点不是终端结点,则至少有2棵子树除根以外的所有非叶结点至少有⌈m2⌉\lceil \frac{m}{2}\rceil棵子树,即至少含有⌈m2⌉−1\lceil \fr原创 2016-11-13 15:44:45 · 25352 阅读 · 6 评论 -
B-树的操作总结
B树的操作总结@(算法学习)B树的查找两个基本操作: + 在B树中找结点(粗粒度的寻找,快速,跨越式定位) + 在结点中找关键字B树结构通常存在磁盘上,因此第一个基本操作发生在磁盘上,,所以不宜进行次数过多。找到结点后,会把结点调入内存,在内存中进行关键字的查找。B树的插入主要把握插多了如何炸裂的问题。过程通常是先找到插入位置,再看插入后是否炸裂。不是先检查是否可能超过范围,避免后来的分裂。查原创 2016-11-16 16:11:46 · 897 阅读 · 3 评论 -
PAT1006题解
PAT1006题解At the beginning of every day, the first person who signs in the computer room will unlock the door, and the last one who signs out will lock the door. Given the records of signing in’s and ou原创 2017-01-18 20:50:02 · 668 阅读 · 0 评论 -
关于STL模板的使用效率与控制输出时最后不加空格问题
关于STL模板的使用效率与控制输出时最后不加空格问题题目:PAT 1009 149ms vs 7ms的写法的细微区别This time, you are supposed to find A*B where A and B are two polynomials.Input Specification:Each input file contains one test case. Each cas原创 2017-02-10 16:24:47 · 831 阅读 · 0 评论 -
基于层序+中序遍历序列构建二叉树
@算法学习问题是:基于层序遍历序列+中序遍历序列唯一建立一棵树,然后输出前序,后序遍历序列。四种遍历树的思路以及代码自然不必多言,有趣的是如何由层序+中序建立树。首先需要说的是,这个也是递归解法。http://paste.ubuntu.com/24084585/既然是递归解法,就需要想当前层的问题,给定一个层序遍历序列+中序遍历序列,当前能确定的根结点就是层序序列的第一个值,拿这个去在中序中找到根结原创 2017-02-28 23:50:40 · 5518 阅读 · 0 评论 -
拓扑排序算法
拓扑排序算法@(算法学习)AOV网说到拓扑排序首先需要看的一个概念是Activity On Vertex 网。关于AOE前面做过具体的探究。http://blog.youkuaiyun.com/u011240016/article/details/53171808?locationNum=1&fps=1关于如何寻找最大路径文中有具体的思考。而既然活动可以在边上,就必然意味着,活动可以在结点上。这样做有什么含义吗原创 2016-11-22 13:38:35 · 1259 阅读 · 1 评论 -
有序表的索引顺序结构查找次数分析
有序表的索引顺序结构查找次数分析@(算法学习) 为了提高查找效率,对65025个元素的有序顺序表建立索引顺序结构,在最好情况下查找到表中已有元素,平均需要执行(B)次关键字比较。 A. 10 B. 14 C. 20 D. 21分析:明确一个概念:索引顺序结构就是分块结构。综合了顺序查找和折半查找的优点。分析一下这种存储结构下查找的策略。分块查找的思路是:将查找表分为若干原创 2016-12-04 01:02:12 · 8553 阅读 · 8 评论 -
堆排序算法之初始堆建立总结
堆排序算法之初始堆建立总结@(算法学习)关于堆的插入和删除有过一篇思考,但是关于初始堆的构建,没有总结。简单说就下面几个要点(以大顶堆为例):首先根据序列构建一个完全二叉树在完全二叉树的基础上,从最后一个非叶结点开始调整:比较三个元素的大小–自己,它的左孩子,右孩子。分为三种情况: 自己最大,不用调整左孩子最大,交换该非叶结点与其左孩子的值,并考察以左孩子为根的子树是否满足大顶堆的要求,不满原创 2016-12-01 23:52:52 · 83362 阅读 · 12 评论 -
AOE问题总结
AOE问题总结@(算法学习)翻了一下笔记,发现对AOE问题当时的理解比现在的理解要深刻许多。看来许久不用,慢慢对概念的印象就会渐渐模糊。而对于那些精心思考过,有不同编码的信息,无论多久,想起来都非常形象深刻。所以,生活中还是需要刻意编码,编故事,联想,比喻,内化等。当知识真的为自己融会贯通时,就像问你求解一元二次方程,因式分解等问题时,那样不假思索,得心应手。你从不会怀疑自己不记得a,b,c这样的简原创 2016-11-15 15:27:58 · 5729 阅读 · 0 评论 -
霍夫曼编码判断
霍夫曼编码判断@(算法学习)霍夫曼编码一定是前缀编码,即,没有任何一个编码是另一个编码的前缀。此外,还需要明白霍夫曼编码构建的树中只有度为0和2的结点,不存在度为1的结点。这与玩全二叉树是不一样的概念,玩全二叉树允许有度为1的结点。看一道题目:(1.6)根据使用频率为5个字符设计的霍夫曼编码不可能是:DA. 000 ,001, 010, 011, 1 B. 0000 ,0001, 001, 01原创 2016-11-21 13:31:35 · 9009 阅读 · 6 评论 -
理解最小生成树与权值最小边无关
理解最小生成树与权值最小边无关@(算法学习)驳斥:具有n个顶点的有向图G的最小生成树不唯一,则其权值最小的边一定有多条。有两种最小生成树,但是实际上权值最小的边只有一条。更简洁的说,最小生成树与权值最小的边没有特别的关系。原创 2016-11-21 14:07:45 · 5608 阅读 · 1 评论 -
强连通分量
强连通分量@(算法学习)首先明白,这个概念是在有向图中的,其次是,如何有效寻找。图中强连通分量的个数是:4个。分析: 强连通分量的定义:有向图中,如果两个顶点vi,vjv_i,v_j之间存在:viv_i到vjv_j的路径vjv_j到viv_i的路径则称这两个顶点是强连通的。至于相对的弱连通,则抹去方向,相连即可。那么,道理很简单,如何应用呢?答案是先找回路,然后在回路的基础上,扩展结点。因为原创 2016-11-21 14:08:53 · 2526 阅读 · 0 评论 -
多级队列应用题-2016年408习题
多级队列@(算法学习)3) 设有如下的火车车轨,入口与出口之间有n条轨道,列车行进方向从左至右,列车可以驶入任意一条轨道,现在有编号为1~9列列车,驶入的次序一次是8,4,2,5,3,9,1,6,7。若期望驶出的顺序是1~9,则n至少是:A. 2 B. 3 C. 4 D. 5分析:拿到这样的题目会有一个典型的错误方向。认为一个轨道只能装一列火车,实际不是。因为题目并未直接告知,需要自己推断,假原创 2016-11-21 15:32:11 · 6506 阅读 · 7 评论 -
三对角矩阵压缩
三对角矩阵压缩在一个100阶的**三对角矩阵**M,其元素mi,j(1≤i≤100,1≤j≤100)m_{i,j}(1\leq i\leq 100, 1\leq j \leq 100),按照行优先顺序存入下标从0开始的一维数组N中,元素m30,30m_{30,30}在N中的下标是:BA. 86 B. 87 C. 88 D. 89首先需要对三对角矩阵要有清晰的认识:除了第一行和最后一行是每行2个元素外原创 2016-11-21 16:10:59 · 12045 阅读 · 0 评论 -
森林结点数,边数与树个数的关系
森林结点数,边数与树个数的关系@(算法学习)若森林F有15条边,25个结点。则F中包含树的个数是:A. 8 B. 9 C. 10 D. 11分析:森林中树的个数与结点数的关系推导。 先看一般性的解决策略:根据一棵树的边数+1=结点数。 可以知道,每多一棵树,结点数就少一个。 即, 一棵树时,边数 = 结点数-1 两棵树时,边数 = 结点数-2 …. n棵树时,边数 = 结点数-n于是得原创 2016-11-21 16:28:47 · 19324 阅读 · 4 评论 -
顺序表的动态存储细节
顺序表的动态存储细节@(算法学习) 在顺序表的动态存储定义中需要包含的数据成员是(C) I. 数组指针 II. 表中元素个数n III. 表的大小maxSize IV. 数组基址baseA. I 、II B. I 、II、IV C. I 、II、III D. 全部如果是在代码中写顺序表的动态存储方式,可能上手就知道要定义一个可动态增长的数组,通过malloc或者n原创 2016-12-03 21:42:45 · 2125 阅读 · 0 评论 -
狸猫换太子--删除无头单链表中结点
狸猫换太子–删除无头单链表中结点@(算法学习)学习自《编程之美》。很有意思的一种做法。 给定一个没有头指针的单链表,一个指针指向次单链表中的一个中间结点,删除此结点。分析:这种根本没法找到前驱的情况下,如何变通删除呢?既然每个结点只是内容不一样,但是形式相同,是否可以考虑鸠占鹊巢,狸猫换太子呢?当前结点内容更换为后面结点的内容,从内存中删除后继结点,这样,可以保证链表依旧相连,内容恰好是删除当原创 2016-12-14 22:33:34 · 636 阅读 · 0 评论 -
如何从一行输入的字符串中基于空格切割出单词
在C++中,可以考虑用已经写好的模板来解题:#include <iostream>#include <string>#include <sstream>#include <vector>using namespace std; int main() { string line,word; vector<string> s1; getline(cin,line); /原创 2017-03-01 02:46:42 · 2209 阅读 · 0 评论 -
递归判断两棵树是否相同
递归写法判断两棵树是否相同:bool flag = true; // 默认认为两棵树是相同的,递归判断过程中改变flag值,一旦有一个不同,就跳出void judge(node* root1, node* root2){ if(root1 == root2) return; // 这个相等其实是用来判断都为空的,那么不用改变flag if((root1 == NULL && ro原创 2017-03-01 13:24:33 · 6631 阅读 · 0 评论 -
统计图的连通块的个数的两种方法
@算法学习两种方法DFS遍历法并查集法1. DFS遍历计算连通块先上代码:#include <stdio.h>#include <vector>using namespace std;const int maxn = 100010;vector<int> G[maxn]; // 邻接表存储图bool vis[maxn] = {false}; // 标记是否访问void dfs(int v)原创 2017-03-01 13:45:36 · 7955 阅读 · 0 评论 -
并查集--Java实现
将展示三种不同的并查集实现,通过这样的演化过程来体会并查集的思想。三种实现里,都用到了一个id数组,但是具体的含义略有不同。quick-find这种实现里,id数组长度为N,如果p和q是相连的,那么它们的id数组里的值相同,即id[p] == id[q]。所以对于find函数,找到该元素的上级。// 初始化public QuickFindUF(int N) { id = new in...原创 2018-11-11 14:12:26 · 877 阅读 · 0 评论 -
【算法基础】动态规划的理解
本章是个很有趣的问题,也是难倒很多人的问题,同时这又是个会而不难的问题。动态规划的核心逻辑是:将问题分解为子问题。在《算法图解》这本书里,深入浅出得讲了递推公式的推演逻辑,但是在关键部分,递推公式部分,并没给出逻辑。整个过程好像是,前面一段道路很平缓,走起来很舒适,但是突然一个大台阶挡住了去路,本篇将试图为这个台阶做一下铺垫,让这个过程更加容易理解一些。主体仍然以书上的例子作为演示素材。—...原创 2018-11-22 18:40:24 · 762 阅读 · 1 评论 -
【算法基础】动态规划解题实例之野营问题
问题描述:假设你要去野营。你有一个容量为6磅的背包,需要决定该携带下面的哪些东西。其中每样东西都有相应的价值,价值越大意味着越重要:水(重3磅,价值10)书(重1磅,价值3)食物(重2磅,价值9)夹克(重2磅,价值5)相机(重1磅,价值6)请问携带哪些东西时价值最高?前文梳理了动态规划的基本思想以及推导过程。这里通过拆解一个案例来看看初阶的动态规划的用法。首先我们把基本信息...原创 2018-11-23 11:52:08 · 1003 阅读 · 0 评论 -
【Leetcode 795】Number of Subarrays with Bounded Maximum
难度:中等题目描述We are given an array A of positive integers, and two positive integers L and R (L &lt;= R).Return the number of (contiguous, non-empty) subarrays such that the value of the maximum array ...原创 2019-02-21 20:38:53 · 366 阅读 · 0 评论 -
数组的二路归并排序
归并算法的核心二路归并算法的核心是将两个有序向量(数组)通过“双指针法”合并起来。而归并排序针对的是整体无序的数组,因此我们需要用递归算法,递归基是单个元素时,肯定是有序的,相邻的两个单个元素的数组合并到一起,形成更大一点的有序向量。递的过程是:从原数组拆分到只剩下单个元素;归的过程:两两合并。归并算法代码#include &lt;stdio.h&gt;int a[4] = {2,...原创 2019-02-24 14:52:43 · 1277 阅读 · 1 评论 -
【LeetCode 148】链表的归并排序
上一篇文章用数组实现了二路归并排序,核心在于要对每次减半的元素进行实质性的改变,在数组中我们用临时数组记录每次merge的结果,在链表中用归并排序更加直接,因为我们操作的是结点的指针。题目描述难度:中等Sort a linked list in O(n log n) time using constant space complexity.Example 1:Input: 4->2...原创 2019-02-24 15:29:47 · 360 阅读 · 0 评论 -
LeetCode 144. 树的前序遍历迭代写法
Time: 20190224本题对应的是LeetCode 144,Medium难度(迭代算法的难度)。树的前序遍历Given a binary tree, return the preorder traversal of its nodes’ values.Example:Input: [1,null,2,3] 1 \ 2 / 3Output: ...原创 2019-02-24 20:56:09 · 702 阅读 · 0 评论 -
优先队列之Leetcode 23合并K个有序链表
优先队列要点复习这在之前专门写过一篇文章讲优先队列的使用方法:优先队列的优先级设置法对于优先队列,我们首先需要知道,它的底层是堆,或者说优先队列是堆的一种别称。堆自然就分成了两个方向:大顶堆小顶堆堆的结构维护着一种数据关系,我们通过q.top()可以取出顶部的数据,要么最大,要么最小,通过q.pop()可以弹出这个顶部,然后剩下的数据会自动维护同样的属性。关于堆,之前也写过另...原创 2019-02-19 16:39:33 · 1305 阅读 · 0 评论 -
Lintcode 138. 子数组之和 [Easy]
[20190331]题目描述给定一个整数数组,找到和为零的子数组。你的代码应该返回满足要求的子数组的起始位置和结束位置样例样例 1:输入: [-3, 1, 2, -3, 4]输出: [0,2] 或 [1,3]样例解释:返回任意一段和为0的区间即可。样例 2:输入: [-3, 1, -4, 2, -3, 4]输出: [1,5]注意事项:至少有一个子数组的和为 0题解可...原创 2019-03-31 14:03:08 · 560 阅读 · 2 评论 -
Leetcode 199
Type: Medium, BFS问题描述:Given a binary tree, imagine yourself standing on the right side of it, return the values of the nodes you can see ordered from top to bottom.Example:Input: [1,2,3,null,5,nul...原创 2018-10-10 10:33:40 · 332 阅读 · 0 评论 -
【Leetcode 687】递归求最大相同路径
类型:Easy, 递归题目描述:Given a binary tree, find the length of the longest path where each node in the path has the same value. This path may or may not pass through the root.Note: The length of path betw...原创 2018-10-16 11:30:00 · 479 阅读 · 1 评论 -
关于使用DFS,BFS的一些思考总结
总的来说,DFS和BFS是一种遍历策略,整体运行的框架是固定的,但是具体处理以及函数的形参是需要根据具体问题具体来定的。也就是说,在BFS或者DFS的时候,首先需要搞明白的是:遍历的目的是什么。标记结点已经访问(任何题目中必须有)遍历过程中计算参数(选择)计算参数是比较常见的题目,只标记结点是否访问在计算连通块个数时总结过。详细说一下计算参数问题。可以在形参中用参数引用,直接改变这个参数就等同原创 2017-03-01 15:04:04 · 2078 阅读 · 0 评论 -
Dijkstra+DFS模板总结
关于Dijstra的初级运用是,在第一标尺的基础上有下面三个角度:边权:c[maxn] = {maxn}, cost[manx][maxn] = {inf};点权:w[maxn] = {0}, weight[maxn] = {0};最短路径条数:num[maxn] = {0};a1003.cpp 用到了其中的两个,作为模板来刻意练习,练习如何将问题结构化,模板化。再额外补充边权的代码,不是这原创 2017-03-02 23:35:33 · 1330 阅读 · 0 评论 -
异或运算交换两个数
a = a^b;b = a^b;a = a^b; 这样就可以不借助第三个变量实现两个数的交换。基于如下几个性质:任意变量x与自身异或结果为0,即:x^x = 0任意变量x与0进行异或运算,结果不变,即:x^0 = x异或运算的结合性:a^b^c = (a^b)^c = a^(b^c)异或运算的交换性:a^b = b^a再来解释上面的交换为什么可行:a = a^b b = a^b --原创 2017-03-07 22:54:38 · 7433 阅读 · 0 评论 -
强化学习的基础总结(一)
强化学习的基础总结(一)@(Machine Learning)机器学习从大类上来分,可以有三种:监督学习无监督学习强化学习现在关注强化学习。强化学习泛泛来说,是一种决策方法。Q:强化学习的与众不同之处是什么? A:有以下几点。 + 无监督。只有奖励信号。而不是监督学习中的标记空间。 + 延迟反馈。奖励系统针对的是行为(action),是一种对动态的评价。 + 时间很重要。强化学习是用原创 2017-06-23 21:53:32 · 1900 阅读 · 0 评论