- 博客(97)
- 资源 (5)
- 收藏
- 关注
原创 C++数组
静态数组和动态数组 数组在内存是连续的,时间效率很高 静态数组会造成空间浪费,因此有了动态数组,动态数组先为数组开辟比较小的空间,然后往数组里添加数据,当数据的数目超过数组的容量时,再为数组分配更大的空间(STL每次扩容,新的容量时前一次的两倍),把之前的数据复制到新数组,再把之前的内存释放,从而减少内幕承诺的浪费;但是这样每次扩容会有大量的额外操作,从而对时间
2015-04-29 22:48:48
787
原创 C++ 复制构造函数和赋值运算符重载函数
声明一个空的类testsize,sizeof(testsize)为1,为其声明构造函数和析构函数,依旧为1构造函数不能使用关键字virtual,析构函数可以一旦类中存在虚函数,就会为该类生成虚函数表,并在每一个实例中添加一个指向虚函数表的指针,从而大小为一个指针大小,32位机器上为4,64位机器上为8复制构造函数 1. 调用时机:在三种情况下会调用复制构造函数
2015-04-28 21:02:00
1054
原创 模取幂(求一个数的幂对另一个数的模运算)
即求a^b mod n的值,a/b为非负整数,n是一个正整数设是b的二进制表示,随着c的值从0到b成倍增长,下面过程最终计算出a ^ b mod nMODULAR-EXPONENTIATION(a, b, n) c = 0 d = 1 //初始化 let be the binary representation
2015-04-19 21:57:21
1982
原创 多源最短路径
可以简单的通过运行|V|次单源最短路径算法来解决,每次使用一个不同的结点作为源结点多数算法采用邻接矩阵来表示图,因此算法的输入为一个n*n的矩阵W,代表一个有n个结点的有向图G = (V, E)的边的权重wij = 0 若i = j 权重 若i != j,且(i, j)属于E INF 若i !=
2015-04-19 18:04:44
954
原创 单源最短路径
最优子结构——最短路径的子路径也是最短路径,动态规划和贪心算法的一个重要指标。环路 一条最短路径不可能包含环路 1) 环路权重为负,如果有一条环路权重为负,则不存在最短路径 2) 环路权重为零,如果包含该环路,则将该环路去掉即可 3) 环路权重为正,去掉改环路可以得到更短的路径,因此不可能是最短路径最短路径的表示
2015-04-17 23:18:57
787
原创 最小生成树(贪心算法)
最小生成树问题——连接n个针脚,可以使用n-1根连线,每个连线连接两个针脚,使得所使用的连线长度最短 抽象为图问题,一个连通无向图G = (V, E),V是针脚的集合,E是针脚之间的可能连接,且对于每条边都有权重w(u, v),希望找到一个无环子集,T属于E,权重之和最小通用方法——在每个时刻生长最小生成树的一条边,并在整个策略的实施过程中,管理一个遵守下述循环不变式的边集合
2015-04-15 23:38:18
2560
原创 广度优先搜索和深度优先搜索
广度优先搜索——算法始终将已发现节点和未发现结点之间的边界【已访问,但其后继结点没有遍历完】,沿其广度方向向外扩展将每个结点涂上白色、灰色或黑色,所有结点在一开始的时候均为白色;凡是灰色和黑色的结点都是已被发现的结点,但会加以区分 如果边(u, v)属于E且结点u是黑色,则v既可能是灰色也可能是黑色,即与黑色结点邻接的结点都已经被发现 对于灰色结点,其邻接结点可能存在未被发
2015-04-15 22:52:59
561
原创 Git学习
Git学习Git学习网站http://lvwzhen.gitbooks.io/git-tutorial/content/git安装1. Ubuntu:sudo apt-getinstall git2. Windows:http://msysgit.github.io/Windows从开始菜单中,Git->Git Bash启动;工作目录是C:\Users\
2015-04-14 22:05:43
461
原创 高级数据结构
B树——为磁盘或其他直接存储的辅助存储设备而设计的一种平衡搜索树B树T具有如下性质1. 每个结点x有下面属性 a) x.n,当前存储在结点x中的关键字个数 b) x.n个关键字本身x.key1、x.key2、...、x.keyn以非降序排序 c) x.leaf,一个布尔值,如果x是叶结点,则为TRUE,否则为FALSE2. 每个内部结点x
2015-04-14 22:03:25
688
原创 摊还分析
摊还分析——求数据结构的一个操作序列中所执行的所有操作的平均时间,来评价操作的代价 聚合分析:确定一个n个操作的序列的总代价的上界T(n)【即最坏情况下花费的总时间】,从而每个操作的平均代价为T(n)/n;所有操作具有相同的摊还代价 核算法:分析每个操作的摊还代价;同时将序列中某些较早的操作的“余额”作为“预付信用”保存起来,与数据结构中的特定对象相关联;在序列中随后的部分,保
2015-04-12 22:06:10
1274
原创 霍夫曼编码
给定一个文本中出现的一组字符C,每个字符有其出现频率freq,想构造字符的最优二进制表示,即用来编码整个文本的二进制位最少定长编码:每个字符用相同长度的二进制位数进行编码,则每个字符的长度n必须满足,2^n = |C|变长编码:思想是赋予高频字符短码字,赋予低频字符长码字编码过程相对简单,将表示每个字符的码字连接起来即可完成文件压缩解码过程,如果采用的定长编码则直接
2015-04-12 11:48:00
1119
原创 switch-case中变量的初始化
switch case结构中,case后面不能声明初始化的变量,比如 case true: string str; //错误,隐式初始化 int a = 0; //错误,显式初始化 int b; //正确,没有初始化如果想声明初始化的变量,需用{}将其包含起来
2015-04-12 00:12:39
2114
原创 C++类型转换
1. 隐式类型转换1) 算数转换:在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型2) 赋值转换:目标类型是被赋值对象的类型3) 参数传递转换:形参和实参类型不一致:目标转换类型为形参的类型4) 函数返回值转换:目标转换类型为函数的返回类型2. 显式类型转换(强制类型转换) C 风格:(type)expression C++风格:cast
2015-04-12 00:12:16
532
原创 贪心算法原理
设计贪心算法的三个步骤 将最优化问题转化为这样的形式:对其做出一次选择后,只剩下一个子问题需要求解(比较重要的一步) 证明作出贪心选择后,原问题总是存在最优解,即贪心选择总是安全的 证明作出贪心选择后,剩余的子问题满足性质:其最优解与贪心选择组合即可得到原问题的最优解,这样就得到了最优子结构两个关键因素1. 贪心选择性质:可以通过做出局部最优(贪心)选
2015-04-12 00:11:00
4368
原创 C++函数参数个数不定
1. 参数为同一种类型的:initializer_list lst 有几个方法可以调用:lst.size();lst.begin();lst.end()2. 参数为不同类型的 用省略号指定参数列表: void fun(...); void fun(param_list, ...); 有几个相关的宏定义 typ
2015-04-11 21:23:04
3150
原创 vector/array
1. 几种初始化方式 vector v1; vector v2(v1); vector v3= v1; vector v4(n); vector v5(n, value); vector v6{a, b, c}; vector v7 = {a, b, c};2. 迭代器iterator vector::it
2015-04-11 21:21:45
480
原创 #ifndef #define #endif
#ifndef _TEST_H#define _TEST_H//一般是文件名的大写 头文件结尾写上一行:#endif这样一个工程文件里同时包含两个test.h时,就不会出现重定义的错误了。分析:当第一次包含test.h时,由于没有定义_TEST_H,条件为真,这样就会包含(执行)#ifndef _TEST_H和#endif之间的代码,当第二次包含test.h时前面一次已经定
2015-04-11 21:21:03
484
原创 C++变量
1. 初始化:在创建的时候同时赋值1) 初始化中的"="与赋值的"="意义不同2) 定义一个变量,如果不赋初值 内建类型:函数外定义的初始值为0,函数内定义的不初始化(为undefined,复制或者操作该对象会出错)2. 声明和定义1) 带有赋初值的声明(declaration)为定义(definition)2) 赋初值会覆盖exter
2015-04-11 21:20:28
465
原创 C++ 数据类型
1. 数据转换1) 给一个某种type的变量赋值超过它所能表示的范围,则该变量的值为undefined 然而有些编译器检测不到这种错误,而且在某些情况下能正常运行;但随时都可能发生错误导致程序crash2) 特别注意signed与unsigned数据的操作 unsigned和signed进行运算,signed会自动转化为unsigned;而两个unsigned相减,得不
2015-04-11 21:20:09
482
原创 postgresql的一些常用操作
1. 修改主键1) 删除之前的主键 alter table 表名 drop constraint 主键名2) 添加主键 alter table 表名 add constraint 主键名 primary key (column1,column2,....,column) 这里的主键名是自己定义的一个字符串,可以不是表中字段名(习惯写成:PK
2015-04-11 21:17:53
708
原创 活动选择问题(动态规划和贪心算法)
有一个由n个活动组成的集合S = {a1, ..., an} 1. 这些活动使用同一个资源,而这个资源在某一时刻只供一个活动使用 2. 每个活动都有一个开始和结束时间si/fi;如果被选中,则任务ai发生在半开时间区间[si, fi) 3. 如果两个活动ai和aj不重叠,则称两个活动兼容 活动选择问题,希望选出一个最大兼容活动集 假设活动已
2015-04-11 21:14:56
4904
原创 最优二叉搜索树(动态规划)
假定有一组英语单词与其法语的翻译,要根据英语单词搜索其法语翻译;有以下两个条件 1. 单词的出现频率不同 2. 有些单词没有对应的法语单词,称为伪单词 在给定单词出现频率的前提下,如果组织一棵二叉搜索树,使得所有搜索操作访问的节点总数最少 问题形式化为 给定一个序列,有n个关键字组成:K = {k1, k2, ..., kn},对每个关键字
2015-04-11 21:13:50
778
原创 最长公共子序列 (longest common subsequence)
子序列定义:将给定序列中零个或多个元素去掉之后得到的结果 比如abcd是abecd的子序列 最长公共子序列问题:给定两个序列X和Y,求两者长度最长的公共子序列1. 最长公共子序列的特征 X = ,Y = ;Z = 是两者的任意LCS 1) 如果xm = yn, 则zk = xm = yn且Zk-1是Xm-1和Yn-1的一个LCS 2
2015-04-11 21:13:49
585
原创 动态规划原理
最优子结构:一个问题的最优解包含其子问题的最优解 不同问题领域,最优子结构的不同体现在两个方面: 原问题的最优解中涉及多少个子问题 在确定最优解使用哪些子问题时,我们需要考察多少种选择 例:钢条切割问题涉及到一个子问题(长度为n-i的钢条的最优切割),但必须考察i的n中不同取值 两个典型的问题 无权
2015-04-11 21:12:24
484
原创 动态规划
分治法:将问题划分为互不相交的子问题,递归地求解子问题,再将它们的解组合起来动态规划:子问题重叠;通常用于求解最优化问题 分治法会做许多重复工作,反复求解公共子问题;而动态规划则对每个子问题只求解一次并保存下来步骤: 1) 刻画一个最优解的结构特征 2) 递归地定义最优解的值 3) 计算最优解的值,通常采用自底向上的方法 4) 利用
2015-04-11 21:11:57
412
原创 Strassen方法
n*n的矩阵A和B相乘得到C,n是2的幂;普通的分治算法,将A、B和C分解为12个n/2 * n/2的矩阵,进行相乘,需要八次n/2 * n/2矩阵相乘总时间T(n) =θ(1) + 8T(n/2) + θ(n^2),T(1) = θ(1) 总时间T(n) = θ(n^3),与直接计算相同Strassen方法:通过技巧,将子矩阵的计算转化为仅需要七次n/2
2015-04-11 21:11:39
487
原创 红黑树(二叉搜索树的一种)
满足如下性质: 每个结点或是红色的,或是黑色的 根结点是黑色的 每个叶节点(NIL)都是黑色的 如果一个结点是红色的,则其两个子结点都是黑色的 对每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点 ——>确保没有一条路径会比其他路径长出两倍,是近似于平衡的 一棵有n个内部结点的
2015-04-11 21:11:11
508
原创 二叉搜索树
性质:对任何节点x,其左子树中的关键字最大不超过x.key,右子树中的关键字最小不低于x.key 基本操作所花费的时间与树的高度成正比;search/minimum/maximun/predecessor/successor 随机构建一棵二叉搜索树的期望高度为O(lg n)查找【O(h)】TREE-SEARCH(x, k) if x == NI
2015-04-11 21:08:39
363
原创 计数排序
前提条件:n个输入元素中的每一个都是在0到k区间内的一个整数,当k=O(n)时,运行时间为theta(n)基本思想:对每一个输入元素x,确定小于x的元素个数,从而可以直接把x放到它在输出数组中的位置上了COUNTING-SORT(A, B, k) //A是输入,B是输出let C[0..k] be a new array //
2015-04-11 21:07:30
354
原创 快速排序
运用了分治思想,三步分治过程 分解:数组A[p...r]被划分为两个子数组A[p...q-1]和A[q+1...r],其中左边数组元素都小于A[q],右边数组都大于A[q] 解决:通过递归调用快速排序,对子数组A[p...q-1]和A[q+1...r]进行排序 合并:不需要合并操作quicksort(A, p, r) q = PARTITION(
2015-04-11 21:06:59
372
原创 基本的数据结构
栈、队列、链表(单向/双向/循环)、树(二叉树/普通树【左孩子右兄弟表示法】)散列表,普通数组概念的推广,普通数组可以直接寻址,能在O(1)时间内访问数组任意位置;如果存储空间允许,可以提供一个数组,为每个可能的关键字保留一个位置,然而实际存储的关键字数目比全部的可能关键字总数要小,因此采用散列表是一种比较有效的替代方式。散列表不是直接把关键字作为数组的下标,而是根据关键字
2015-04-11 21:06:45
771
原创 堆(堆排序)
最大堆:通常用于堆排序;A[parent(i)] >= A[i]最小堆:通过用于构造优先队列一个数组A表示堆,A[i]的左孩子为A[2i],右孩子为A[2i+1]1. MAX-HEAPIFY【维持堆性质】:给定一个数组A和下标i,假定节点i的左子树和右子树都满足最大堆性质,但是i可能不满足; 通过让A[i]的值在堆中逐级下降,使得数组回到满足最大堆性质的过程
2015-04-11 21:05:36
576
原创 礼券收集者问题
有b个箱子,把相同的球随机投到这b个箱子里,求使得每个箱子里至少都有一个球,所需的投球次数n 普通的概率分析方法 称一次投球落在空箱子里为“命中”,用ni表示从第i-1次命中到第i次命中需要的头球次数,则 n = n1 + n2 + ... + nb E(ni) = b / b - i + 1; 从而E(n) = E(n1) + E(n2)
2015-04-11 21:04:56
988
原创 概率分析和随机算法
概率分析:必须使用或者假设关于输入的分布;如果不能描述一个合理的输入分布,则不能采用概率分析 随机算法:一个算法的行为不仅由输入决定,也由随机数生成器产生的数值决定,则称该算法是随机的 当概率分布式在算法的输入上时,讨论的是平均情况运行时间;当算法本身做出随机选择时,讨论其期望运行时间1. 指示器随机变量,用于计数某个时间发生的次数
2015-04-11 21:04:39
493
转载 Google of Greater China Test for New Grads of 2014 Round A 第2题
转载请注明来自souldak,微博:@evagle思路真赞Google of Greater China Test for New Grads of 2014 Round A 第2题,题目: Rational Number Tree如下面这颗树,生成规则是,左儿子的分子和父节点一样,分母是父节点分子分母之和,右儿子的分母和父节点一样,分子是父节点分子分母之和。这
2014-08-15 16:32:52
722
原创 远程登录_Telnet
远程登录的根本目的:远端用户可以像本地用户一样访问远地系统的资源1:服务模式1) 远程登录协议运行于TCP 协议上,在终端处运行有Telnet客户进程2) 远地计算机系统处有一服务器进程tlntsvr3) 客户进程和服务器进程通过一条TCP 连接进行交互2:Telnet原理1) 服务过程a) 远端用户在终端上对系统进行远程登录,该远程登录的内部视图
2014-05-03 19:59:42
1134
原创 IP协议
1:IP地址1) 概念:网络上任一设备用来区别于其他设备的标志2) 表示:32位二进制数表示一个IP地址3) 分类:A/B/C/D/E五类网络,用IP地址的高位来区分a) 0表示A类(网络地址长度1),10表示B类(网络地址长度2),110表示C类(网络地址长度3),1110表示D类,11110表示E类b) 主机号全为0或全为1作为本网络地址和
2014-05-03 10:34:57
570
原创 TCPIP协议族体系结构
1:网络体系结构的概念 网络的层次结构和每层所使用的协议的集合成为网络体系结构 协议栈——各层协议之间形成的一个从上到下类似栈的结构的依赖关系1) 四个层次a) 应用层(由操作系统之上的应用软件实现):提供特定的、常用的应用程序TELNET/FTP/SMTP/HTTP/DNSb) 传输层(由操作系统内核实现):应
2014-05-03 09:49:40
1270
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人