算法
文章平均质量分 74
TiWalker
冷静思考,坚持努力,勇敢前行!
展开
-
排序算法个人总结
最近在看算法,自然而然地就看到了排序。而归并排序又是一种非常常规的排序算法。首先我说说我理解的归并算法的核心:归即将数组中分为小部分的集合,其中也即数成为局部有序的集合。然后再将这些有序数组合并起来。归:一般以中点划分,不断地递归,以使数组有序,其实归和并是交互的。如8个数字,归为4,4。4又归为2,2。2又归为1,1。1,1之后不能再划分,就合并。合并之后是有序的,1,1合并为2,2,2原创 2015-12-20 20:35:39 · 418 阅读 · 0 评论 -
搜索二叉树转化为双向链表
1. 将搜索二叉树转化为双向链表 分析:二叉树问题一定要想递归,比如我们整体思考左子树转化为双向链表,右子树转化为双向链表,我们只用将根节点和左子树链表和右子树链表连接起来即可。好了,问题在于,连接的时候左子树形成链表的最后一个节点à根节点à右子树形成链表第一个节点。这样连起来就可以了。 左子树形成链表和右子树形成链表是大问题的两个子问题,就是用递归。而我原创 2016-09-08 15:16:05 · 1350 阅读 · 0 评论 -
KMP算法(代码+图解证明)
KMP算法用于字符串匹配,是相较于朴素字符串匹配。所谓朴素字符串匹配就是从头到尾开始一个位置一个位置匹配,当前位置匹配失败则会从下一个位置开始继续匹配。 KMP算法则是可以跳,能往前跳多远就往前跳多远。我们知道算法尽量要简化计算、去冗余、记忆搜索。KMP就是利用了去冗余的思想往前跳到某一位置继续匹配。而中间未匹配的丝毫不会有影响,这要归结于我们next数组的定义。原创 2016-09-08 17:09:13 · 5543 阅读 · 0 评论 -
动态规划-最长递增子序列
动态规划:动态规划是一种思想。是由暴力递归简化而来的编程思想,在编程中变化很大。我的总结如下:1. 最长递增子序列我们想要找到最长递增子序列,关键要遍历数组。问题:遍历数组,更新当前最长子序列。关键在于当前最长子序列怎么更新?假设我们有数组arr[n],那么遍历到i位置我们想要得到当前最长子序列。我们以dp[i]表示当前最长子序列的长度。第一步已经完成。因为我们关心的只有原创 2016-10-12 14:11:40 · 430 阅读 · 0 评论 -
动态规划-最长公共子序列
动态规划:动态规划是一种思想。是由暴力递归简化而来的编程思想,在编程中变化很大。我的总结如下:两个字符串的公共子序列。两个字符串str1和str2的公共子串,且为最长的公共子序列。第一步:我们用dp[i][j]表示str1[0…i]与str2[0…j]的最长公共子序列。第二步:dp[i][j]一般我们怎么计算嘞?dp[i][j]的计算可以分两种情况讨论:str1[i]和str2[j原创 2016-10-12 14:20:48 · 305 阅读 · 0 评论 -
动态规划-最长公共子串
动态规划:动态规划是一种思想。是由暴力递归简化而来的编程思想,在编程中变化很大。我的总结如下:两个字符串的最长公共子串,首先公共子串和子序列不同的是子串必须连续。那么dp[i][j]的表示含义会有所不同。第一步:dp[i][j]表示以str[i]和str[j]为结尾的最长公共子串。体会一下,不同在于子序列dp[i][j]我们说的是个区间,i和j是否匹配我们没定。而此时dp[i][j]我原创 2016-10-12 14:25:42 · 363 阅读 · 0 评论 -
动态规划-最优解
动态规划:动态规划是一种思想。是由暴力递归简化而来的编程思想,在编程中变化很大。我的总结如下:所谓求最优解就是先满足时间复杂度情况下,使用最小的空间最小编辑代价(距离):从str1变为str2,可以有三个操作,增加一个字符,删除一个字符,变换一个字符,求费用最小。第一步:以dp[i][j]表示str1[0….i-1]到str2[0….j-1]最小代价。因为我们加入了““串做匹配原创 2016-10-12 14:34:49 · 2777 阅读 · 0 评论 -
动态规划-交错组成
动态规划:动态规划是一种思想。是由暴力递归简化而来的编程思想,在编程中变化很大。我的总结如下:字符串A和B假如为“AB”和“12”,交错组成是两个字符串组成一个字符串。第一步:我们以dp[i][j]表示str1[0…i-1]和str2[0…j-1]交错组成aim串aim[0…i+j-1];第二步:dp[i][j]怎么计算?dp[0][0]代表空串可以组成空串,那么dp[i][j]=原创 2016-10-12 14:38:45 · 879 阅读 · 0 评论 -
动态规划-表达式得到期望结果的组成种数
【题目】给定一个只由0(假)、1(真)、&(逻辑与)、|(逻辑或)和^(异或)五种字符组成的字符串express,再给定一个布尔值desired。返回express能有多少种组合方式,可以达到desired的结果。【举例】express=“1^0|0|1”,desired=false。只有1^((0|0)|1)和1^(0|(0|1))的组合可以得到false。返回2。expre原创 2016-10-12 14:51:52 · 981 阅读 · 0 评论 -
动态规划-排成一条线的纸牌博弈问题
【题目】给定一个整型数组arr,代表数值不同的纸牌排成一条线。玩家A和玩家B依次拿走每张纸牌,规定玩家A先拿,玩家B后拿,但是每个玩家每次只能拿走最左或最右的纸牌,玩家A和玩家B都绝顶聪明。请返回最后获胜者的分数。【举例】arr=[1,2,100,4]。开始时玩家A只能拿走1或4。如果玩家A拿走1,则排列变为[2,100,4],接下来玩家B可以拿走2或4,然后继续轮到玩家A。如果开原创 2016-10-12 15:05:33 · 1274 阅读 · 0 评论 -
实习笔试题
第一题:十进制转化为二进制,二进制取反,再转化为十进制#include #include #include #include using namespace std;int getC1(int n){ int result,ret=0; char str[20]; result = atoi( itoa(n, str, 2) ); int size=strlen(st原创 2016-11-25 21:31:56 · 428 阅读 · 0 评论 -
关于水平集函数的重新初始化过程
转载自:水平集 关于水平1.对于曲线的水平集演化的理解1.1 基于水平集方法的曲线演化原理[1][2]曲线演化理论(Curve Evolution)是指仅利用曲线的单位法向量和曲率等几何测度来研究曲线随时间形变的理论。其基本公式如下: (1)其中,C(s,t) = (x(s,t),y(s,t)),为动态曲线,s表示曲线的参变量,转载 2017-04-09 09:07:20 · 7586 阅读 · 0 评论 -
卡特兰数应用
首先来回顾一下排列和组合的概念和计算公式。 (1)排列: 从n个不同元素中,任取m(m≤n)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号 A(n,m)表示. A(n,m)=n(n-1)(n-2)……(n-m+1)= n!/(原创 2016-07-28 09:35:59 · 1357 阅读 · 0 评论 -
蛇形矩阵求解
先放代码:#includeusing namespace std;int main(){ int n; cin>>n; int **a=new int*[n]; for(int i=0;i<n;i++) a[i]=new int[n]; for(int i=0;i<n;i++) a[0][i]=i+1; int count=n+1; bool s=true; i原创 2016-09-01 22:07:38 · 1471 阅读 · 0 评论 -
排序算法个人总结(2)
1.计数排序算法 计数排序算法的步骤为:首先进行计数、按照大小将数组中的数进行计数。比如1出现2次应该在1、2位置上,2没有出现,3出现一次应该在第3个位置上......也即这就是计数排序的核心,根据元素的大小,又根据计数的结果,就可以将元素安放在正确的位置上。 那么如何进行计数呢? 求出数组的最大值---->构建数组记录0-最大值之间所有数出现的频原创 2016-01-27 21:31:33 · 367 阅读 · 0 评论 -
约瑟夫问题(丢手帕)的实现
约瑟夫问题(或称丢手帕问题)是指n个人围成一圈,从第一个人开始数1,数到第m个人数m则将m位置删除,继续接着从1数,数到m则将m位置删除。如此循环,每次删除一个。这个问题的来源据说是39个传教士和2个朋友困在一个山洞中,传教士宁愿死也不愿被敌人抓到,故而决定大家一个一个自杀,这样可以避免同时自杀可能某些传教士后悔。但2朋友是不想死的,于是其中一个人将他俩的位置安排在16和31,这样最终避免了两个人原创 2016-02-21 18:50:08 · 697 阅读 · 0 评论 -
基数排序
首先定义下基数排序的规则。即根据个位上的数排序------>根据十位上的数排序------>根据百分位上的数排序------>根据千分位上的数排序------>依此类推......这样的话,我们首先分析一次排序的过程,之后的多次排序原理都是一样的。依据个位上的数字排序:这个第一步肯定是要先获取个位上的数字,获取个位数字的方法,即对10求余即可。(获取十位数字对100求余得到如12,再除以1原创 2016-04-12 21:52:59 · 589 阅读 · 0 评论 -
文本比较算法1
转载至点击打开链接最近看到有人在找关于文本比较的算法,刚好最近休假,研究了一下,终于找到一个简单有效的算法,和大家分享一下。算法本身很简单,但是要说清楚思路和原理就比较复杂了,打算分两次发表(明天就要上班拉!),分别对应文本比较算法中的两个主要问题:1。如何确定最大匹配率; 2。如何确定最优的匹配路径;算法本身是基于图论的,太麻烦了,所以不打算介绍整个思路,只将转载 2016-04-26 21:20:12 · 1649 阅读 · 0 评论 -
五子棋算法设计
昨天看了一个五子棋的算法,这个算法其实也并不复杂。主要包括赢法数组、每一种赢法的保存数组、每一个未投子的得分数组。1.赢法数组:记录可能的五个子相连的赢法种类,是一个三维数组。如a[i][j][k]。这样要对赢法数组进行初始化。假设棋盘大小为15*15,定义一个整数count来进行赢法计数。那么循环i,j,k(0注:赢法数组是不针对人或计算机的,而是对获胜种类的一种置位标记。2.每原创 2016-04-14 09:37:16 · 3302 阅读 · 0 评论 -
判断数A中是否存在一棵同构于B的子树
树的同构:我理解的同构应该是树原创 2016-04-14 21:44:44 · 749 阅读 · 0 评论 -
银行家算法
做面试题时,碰到银行家算法能够避免死锁。于是乎,找找资料来研究一下。银行家算法的由来是银行家向客户贷款这一实际问题。类似于操作系统给进程分配资源。它的数据结构包括:一维资源数组、二维进程资源最大需求数组、二维资源分配数组、二维目前资源需要数组。还有当进程请求资源时的资源请求数组。当系统处于安全状态下是不会进入死锁状态的,只有处于不安全状态下系统才会进入死锁状态。保证程序处于安全状态就可以避原创 2016-05-07 15:59:02 · 1409 阅读 · 2 评论 -
二叉树遍历(递归和非递归实现)
1. 采用递归和非递归的方法实现二叉树的先序、中序和后序遍历。先序遍历:递归实现:先打印当前节点,再递归左子树,最后递归右子树#include#includeusing namespace std;struct Node { int value; Node* left; Node* right; Node(int data) { value原创 2016-09-09 15:24:39 · 319 阅读 · 0 评论 -
最大搜索二叉树
本题考虑到用递归,即递归左子树找到最大搜索二叉树的头结点,递归右子树找到最大搜索二叉树的头结点,对于最大二叉搜索子树来说,我们要知道它的头结点,最大的size(即搜索二叉子树的大小)、搜索二叉子树的最小值,最大值。等于说我们在处理子问题时必须知道这四个参数。我们函数仅返回头结点,其余三个参数用全局数组record[]来保存。代码如下:#include#includeusing name原创 2016-09-09 15:59:50 · 348 阅读 · 0 评论 -
二叉树两个节点之间的最大距离
二叉树两个节点之间的最大距离,以根节点分析,最大距离可能有3种情况:左左+右右+左右左左相当于求左子树上的递归子问题,右右相当于求右子树的递归子问题。左右是需要我们处理的问题。我们使用record[]数组来记录左边的最大值和右边的最大值。#includeusing namespace std;struct Node { int value; Node* left;原创 2016-09-09 16:36:29 · 1001 阅读 · 0 评论 -
最低公共祖先问题的求解
1.树的公共祖先问题 首先明确一下这里的公共祖先的概念。所谓公共祖先,就是两节点位于不同分支或者同一分支,最近的公共的父节点(说父节点不太准确,可能是祖父节点等)。 我们先不考虑算法,让我们自己找两个节点的最低公共祖先,我们应该是要按照路径找到两个节点,然后看两条路径的交点。很好,我们自下而上找交点是我们解决问题的思想。 变形1:我们可以从根节点遍历原创 2016-08-30 21:28:14 · 870 阅读 · 0 评论 -
编程思想(1)
1.二叉树的序列化和反序列化 序列化即由一串数字构建一棵树,反序列化是遍历一棵树得到一串数字。对于一个节点来说,反序列化既要创建节点的值,又要获得左子树和右子树的序列并递归构建。 树的遍历分为前序遍历、中序遍历和后序遍历。前序遍历和中序遍历一起可以完成得到节点的值,左子树序列和右子树序列。 序列化树就是遍历二叉树。2.二叉树的打印原创 2016-08-31 09:05:49 · 266 阅读 · 0 评论 -
水平集——那些我膜拜过的牛人2
本篇是迄今为止数学味最浓的,主要用于介绍一个方法以及一个牛人李春明。又来一个明(上次是何凯明),要是中国的小明都这么厉害就了不得了。代表文章:《Level set evolution without re-initialization》,《Minimization of Region-Scalable Fitting Energy for Image Segmentation》,个人主页:转载 2017-04-09 09:57:40 · 11944 阅读 · 12 评论