01 2018 档案
摘要:二叉树的遍历是指通过一定顺序访问二叉树的所有结点。遍历方法一般有四种:先序遍历、中序遍历、后序遍历及层次遍历。 一、先序遍历 对先序遍历来说,总是先访问根结点 root,然后才去访问左子树和右子树,因此先序遍历的遍历顺序是根结点 -> 左子树 -> 右子树。代码如下: 对一棵二叉树的先序遍历序列,序
阅读全文
摘要:一、二叉树的递归定义 二、二叉树的存储结构 一般来说,二叉树使用链表来定义。二叉树每个结点有两条出边,因此指针域有两个——分别指向左子树和右子树的根结点地址,因此右把这种链表叫做二叉链表。其定义方式如下: 如果需要新建结点,可以使用下面的函数: 三、二叉树的基本操作 二叉树的常用操作有以下几个:二叉
阅读全文
摘要:设想我们现在身处一个巨大的迷宫中,我们只能自己想办法走出去,下面是一种看上去很盲目但实际上会很有效的方法。 以当前所在位置为起点,沿着一条路向前走,当碰到岔道口时,选择其中一个岔路前进。如果选择的这个岔路前方是一条死路,就退回到这个岔道口,选择另一个岔路前进。如果岔路口存在新的岔道口,那么仍然按上面
阅读全文
摘要:一、链表的概念 链表是由若干个结点组成,且结点在内存中的存储位置通常是不连续的。除此之外,链表的两个结点之间一般通过一个指针来从一个结点指向另一个结点。定义如下: 二、使用 malloc 函数为链表结点分配内存空间 1. malloc 函数 malloc 函数是 C 语言中 stdlib.h 头文件
阅读全文
摘要:一、关于 n!的一个问题 n! 表示 n 的阶乘,我们讨论一下关于它的一个问题:求 n! 中有多少个质因子 p。 举个例子,6! = 1*2*3*4*5*6 ,于是 6! 中有 4 个质因子 2,两个质因子 3。 对这个问题,直观的想法是计算 1~n 的每个数各有多少个质因子 p,然后将结果累加,时
阅读全文
摘要:一、拓展欧几里得算法 该算法用来解决这样一个问题:给定两个非零整数 a 和 b,求一组整数解 (x,y) ,使得 ax + by = gcd(a,b) 成立,其中 gcd(a,b) 表示 a 和 b 的最大公约数。 递归边界:当 b 为 0 时,此时的 a 就等于 gcd,显然有 a*1+b*0=g
阅读全文
摘要:大整数又称为高精度整数,其含义就是用基本数据类型无法储存其精度的整数。 一、大整数的存储 很简单,使用数组即可。例如定义 int 型数组 d[1000],那么这个数组的每一位代表了存放整数的每一位。整数的高位储存在数组的高位,整数的低位储存在数组的低位。 而为了方便随时获取大整数的长度,一般都会定义
阅读全文
摘要:人脸跟踪问题可认为是寻找一种高效和鲁棒性的方法,它能将各种面部特征的单独检测与这些特征的几何依赖性结合起来,已得到连续帧中每幅图像面部特征位置的精确估计。基于此,需仔细考虑几何依赖性的必要性。下图为用几何约束和不用几何约束所检测出来的面部特征。 该结果清楚地说明利用空间上面部特征的相互依赖性非常有好
阅读全文
摘要:一、如何初始化第一帧及检测人脸 迄今为止所介绍的人脸跟踪方法都是假设图像中所找到的面部特征与当前的估计比较接近。虽然整个跟踪过程中帧之间的人脸变化相当小,这样的假设可认为很合理,但必须要面对的问题是,如何用视频序列的第一帧来初始化模型。解决该问题的简单方法是使用 OpenCV 内置的级联检测器来搜索
阅读全文
摘要:所谓质因子分解是指将一个正整数 n 写成一个或多个质数的乘积形式,例如 24=2*2*2*3。显然,由于最后都要归结到若干不同质数的乘积,不妨先把素数表打印出来。 由于每个质因子都可以不止出现一次,因此不妨定义结构体 factor ,用来存放质因子及其个数,如下所示: 而有一个结论:对一个正整数 n
阅读全文
摘要:素数又称为质数,是指除了 1 和本身之外,不能被其他数整除的一类数。应特别注意的是,1 既不是素数,也不是合数。 本章将解决两个问题:1. 如何判断给定的正整数 n 是否是质数;2. 如何在较短的时间内得到 1~n 内的素数表。 一、素数的判断 只需要判定 n 能否被 2,3,... ,$ \lef
阅读全文
摘要:本节将用一种表示方法来建立人脸特征检测器,该方法也许是人们认为最简单的模型,即:线性图像模型。由于该算法需表示一个图象块,因此这种面部特征检测器称为块模型( patch model )。该模型在 patch_model 类中被实现,该类的定义和实现可分别在 patch_model.hpp 和 pat
阅读全文
摘要:所谓分数的四则运算是指,给定两个分数的分子和分母,求它们加减乘除的结果。 一、 分数的表示和化简 1. 分数的表示 对一个分数来说,最简洁的写法就是写成 假分数 的形式。因此可以使用一个结构体来储存这种只有分子和分母的分数: 于是就可以定义 Fraction 类型的变量来表示分数,或者定义数组来表示
阅读全文
摘要:1. 最大公约数 正整数 a 与 b 的最大公约数是指 a 与 b 的所有公约数中最大的那个公约数,一般用 gcd(a,b) 来表示 a 和 b 的最大公约数,而求解最大公约数常用欧几里得算法(即辗转相除法)。 欧几里得算法基于下面这个定理: 设 a、b 均为正整数,则 gcd(a,b) = gcd
阅读全文
摘要:在考试中,经常会出现一类问题,它们不涉及很深的算法,但却跟数学息息相关。这样的问题通常难度不大,也不需要特别的数学知识,只要掌握简单的数理逻辑即可。下面来看一个例题。 【PAT B1019/A1069】数字黑洞 题目:给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非
阅读全文
摘要:面部几何参数化通常由两个因素组成:全局(刚性)变换和局部的(非刚性)形变。全局变换考虑人脸在图像中的整体位置,它经常允许人脸随意变化(即人脸可出现在图像的任何位置)。这包括人脸在图像中的 (x,y) 位置,平面内头部的旋转,脸在图像中的大小。另一方面,局部形变考虑不同人面部形状以及同一个人面部表情的
阅读全文
摘要:1. 打表 打表是一种典型的用空间换时间的技巧,一般将所有可能需要用到的结果事先计算出来,这样后面需要用到时就可以直接查表获得。打表常见的用法有如下几种: 在程序中一次性计算出所有需要用到的结果,之后的查询直接取这些结果。例如在一个需要大量查询 Fibonacci 数的问题中,则可以把所有 Fibo
阅读全文
摘要:什么是 two pointers 以一个例子引入:给定一个递增的正整数序列和一个正整数 M,求序列中的两个不同位置的数 a 和 b,使得它们的和恰好为 M,输出所有满足条件的方案。 本题的一个最直观的想法是,使用二重循环枚举序列中的整数 a 和 b,判断它们的和是否为 M。时间复杂度为 O(n2)。
阅读全文
摘要:二分查找 二分查找是基于有序序列的查找方法(以下假设严格单调自增),该算法一开始令 [left,right] 为整个序列的下标区间,然后每次测试当前 [left,right] 的中间位置 mid=(left+right)/2 ,判断 A[mid]与欲查询的元素 x 的大小: 如果 A[mid] ==
阅读全文
摘要:面向对象设计 与人脸检测和人脸识别一样,人脸跟踪也由两部分组成:数据和算法。算法通过预先储存(即离线)的数据来训练模型,然后对新来的(即在线)数据执行某类操作。因此,采用面向对象设计是不错的选择。 在 opencv 2.x 版本中,可方便引入 XML/YAML 文件存储类型,对算法来讲,会大大简化组
阅读全文
摘要:简单贪心 PAT B1020 月饼 题意:现有月饼需求量为D,已知 n 种月饼的库存量和总售价,问如何销售这些月饼,使得可以获得的收益最大。求最大收益 思路:总是选择单价最高的月饼出售,可以获得最大利润 1 #include <cstdio> 2 #include <string> 3 #inclu
阅读全文
摘要:本篇博文是我结合《深入理解OpenCV》 和 CSDN 大佬 taotao123 的博文整理所得。由于本科毕业设计要做人脸识别算法方面的研究,现在才刚开始看,很多地方尤其是公式还看不大懂。 本章所说的非刚性是指脸部特征间的相对距离会随着面部表情和人群的不同而变化,这也是它与人脸检测和跟踪的不同之处,
阅读全文
摘要:分治 将原问题划分为若干个规模较小而结构与原问题相同或相似的子问题,然后分别解决这些子问题,最后合并子问题的解,即可得到原问题的解。 分解 解决:递归求解所有子问题 合并 递归 使用递归求解 n 的阶乘 // n! = 1*2*...*n int F(int n) { if(n==0) return
阅读全文
摘要:散列的定义与整数散列 题目要求:M个预查询的数中每个数在N个数中出现的次数 思路:设定一个int型数组 hashTable[10010] ,然后在输入 N 个数时进行预处理,即当输入的数为 x 时 ,就令 hashTable[x]++,时间复杂度为 O(N+M) #include <cstdio>
阅读全文
摘要:简单选择排序 令i从0到n-1枚举,进行n趟操作,每趟从A[i,n]中选择最小的元素 ,算法复杂度为O(n^2) /* 选择排序 思路:令i从0到n-1枚举,进行n趟操作,每趟从A[i,n]中选择最小的元素 */ void selectSort(int A[], int n) { for(int i
阅读全文
摘要:简单模拟 PAT B1001 害死人不偿命的(3n+1)猜想 // time: 2018.01.03 // title: PAT B1001 害死人不偿命的(3n+1)猜想 P85 // idea: 利用循环直接模拟即可 #include <cstdio> #include <cstring> #i
阅读全文
摘要:描述 给定两个字符串,请设计一个方法来判定其中一个字符串是否为另一个字符串的置换。 置换的意思是,通过改变顺序可以使得两个字符串相等。 样例 "abc" 为 "cba" 的置换。 "aabc" 不是 "abcc" 的置换。 代码 /* 给定两个字符串,请设计一个方法来判定其中一个字符串是否为另一个字
阅读全文
摘要:算法笔记 第 2 章 C/C++ 快速入门 第 3 章 入门篇(1)——入门模拟 第 4 章 入门篇(2)——算法初步 4.1 排序 4.2 散列 4.3 递归 4.4 贪心 4.5 二分 4.6 two pointers 4.7 其它高效技巧与算法(打表、递推、随机选择) 第 5 章 入门篇(3)
阅读全文