c++
类空间大小计算
类所占内存的大小是由成员变量(静态变量除外)决定的,成员函数(这是笼统的说,后面会细说)是不计算在内的。
注意:
成员函数还是以一般的函数一样的存在。a.fun()是通过fun(a.this)来调用的。所谓成员函数只是在名义上是类里的。其实成员函数的大小不在类的对象里面,同一个类的多个对象共享函数代码。而我们访问类的成员函数是通过类里面的一个指针实现,而这个指针指向的是一个table,table里面记录的各个成员函数的地址(当然不同的编译可能略有不同的实现)。所以我们访问成员函数是间接获得地址的。所以这样也就增加了一定的时间开销,这也就是为什么我们提倡把一些简短的,调用频率高的函数声明为inline形式(内联函数)。
总结:
空的类是会占用内存空间的,而且大小是1,原因是C++要求每个实例在内存中都有独一无二的地址。
(一)类内部的成员变量:
- 普通的变量:是要占用内存的,但是要注意对齐原则(这点和struct类型很相似)。
- static修饰的静态变量:不占用内容,原因是编译器将其放在全局变量区。
(二)类内部的成员函数:
- 普通函数:不占用内存。
- 虚函数:要占用4个字节,用来指定虚函数的虚拟函数表的入口地址。所以一个类的虚函数所占用的地址是不变的,和虚函数的个数是没有关系的
- 32位中,指针占4位。 64位中,指针占8位
内存对齐
- 结构体,类:
- 1、 分配内存的顺序是按照声明的顺序。
- 2、 每个变量相对于起始位置的偏移量必须是该变量类型大小的整数倍,不是整数倍空出内存,直到偏移量是整数倍为止。
- 3、 最后整个结构体的大小必须是里面变量类型最大值的整数倍。
面向对象设计原则05之------合成/聚合复用原则(CARP)定义:尽量使用合成/聚合,尽量不要使用类继承。合成是一种强的拥有关系(大雁和翅膀!),聚合是一种弱的拥有关系(雁群和大雁!)
尽量使用继承而不是聚合,因为继承使得类间的耦合性最小(错误)
因为:不要使用继承组建功能,而是使用黑箱复用(即对象组合),因为继承的层次增多,造成最直接的后果就是当你调用这个类群中的一个类时,就必须要把他们全部加载到栈中!(后果可想而知。)
1 c++中什么类型的成员变量只能在构造函数的初始化列表中进行
const对象或引用只能初始化但是不能赋值。构造函数的函数体内只能做赋值而不是初始化,因此初始化const对象或引用的唯一机会是构造函数函数体之前的初始化列表中。
2 C++ Struct 的区别
struct能包含成员函数吗? 能!
struct能继承吗?能!!
struct能实现多态吗?能!!!
Struct和c+++最本质的一个区别就是默认的访问控制:
struct的成员默认是public,class的成员默认是private
struct可以继承class,同样class也可以继承struct,此时继承访问权限是看子类到底是用的struct (public) 还是class(private)
树,堆,栈
1.若一序列进栈顺序为a1,a2,a3,a4,问存在多少种可能的出栈序列( )
解析:
2n是总数
1 卡特兰数相关问题总结
1、矩阵链乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,有几种括号化的方案?
2、一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?
3、n个节点构成的二叉树,共有多少种情形?
4、求一个凸多边形区域划分成三角形区域的方法数?
8、有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?
9、甲乙两人比赛乒乓球,最后结果为20∶20,问比赛过程中甲始终领先乙的计分情形的种数。
10、2n个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?
二叉排序树:
任何节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中的每一个节点的键值。
每次插入都是从根节点开始比大小
线性表包括以下:
A,散列更适合查找,不适合频繁更新
B,顺序存储插入和删除都需要移动大量元素
C,链式存储适合插入和删除操作
D,索引结构,每次插入和删除都需要更新索引,费时
哈夫曼树的构建
A(2),B(3) ,C(7) ,D(15) ,E(4) ,F(6)
第一步,排序,从小到大
A(2),B(3) ,E(4) ,F(6),C(7) ,D(15)
然后选择最小的两个节点作为子节点。例如,A(2),B(3)得到新节点5
这时序列为5 ,E(4) ,F(6),C(7) ,D(15)
接下来选择 5 和E(4)得到新节点9
这时序列为9,F(6),C(7) ,D(15)
排序,得到F(6),C(7) ,9,D(15)
这时,F(6),C(7)最为新的子树得到节点13
这时序列为9,13 ,D(15)
1、P问题(用一个确定性算法在多项式时间内判定或解出问题)解题
2、 NP问题(用一个确定算法在多项式时间内检查或验证出它们的解)验证答案
3、 NPC: NP完全问题,所有NP问题在多项式时间内都能 约化 到它的NP问题
快速排序
快速排序的特点,每n趟排序后至少有n个元素已经在其正确的位置上
先排出正确的排序位置,然后每一个每一个对应
C++
初始化列表的执行顺序是变量的声明顺序
红黑树是特殊的AVL树,AVL树又是特殊的二叉查找树,它的除删除之外所有操作平均运行时间都为O(log(n))
算法:
PCA是一种无监督的数据降维方法(主成分分析)
LDA是一种有监督的数据降维方法(线性判别式分析)
聚类算法都是无监督算法。
无监督:无标签(训练),k-means聚类,降维,可解释,EM算法,受限波尔兹慢
有监督:有标签(训练),分类,同维,模型不可解释,KNN(分类),SVM,决策树,逻辑回归
----------------------------------------------------------------------------------------------------------------------
无论是生成式模型还是判别式模型,都可作为分类器使用,分类器的数学表达即为:给定输入 XX 以及分类变量 YY,求 P(Y|X)P(Y|X)。
产生式模型:先估计联合概率密度 P(X,Y)P(X,Y),再通过贝叶斯公式求出 P(Y|X)P(Y|X);
如:朴素贝叶斯模型,隐马尔可夫模型HMM、朴素贝叶斯模型、高斯混合模型GMM、LDA、高斯、混合多项式、专家的混合物、马尔可夫的随机场
判别式模型:直接估算,估算出输入和输出之间的映射,与概率无关
如:有线性回归模型、线性判别分析(LDA)、支持向量机(SVM)、神经网络、boosting、条件随机场(CRF)
神经网络的异或问题(XOR问题)
有一个隐藏层的神经网络可以解决异或问题,而单层神经网络(也叫感知机)却不可以)
XOR问题不能简单的用线性分类解决
模型哪些是无向图:LR,CRF,马尔可夫
有向图:贝叶斯
图模型(graphical model)是一类用图来表示概率分布的一类技术的总称。
有向图模型与无向图模型的对比:
1 共同之处
将复杂的联合分布分解为多个因子的乘积
2 不同之处
有向图模型因子是概率分布、无需全局归一
无向图模型因子是势函数,需要全局归一
3 优缺点
无向图模型中势函数设计不受概率分布约束,
设计灵活,但全局归一代价高
有向图模型无需全局归一、训练相对高效
泊松分布就是描述某段时间内,事件具体的发生概率。
二项分布就是投硬币问题。
以上都属于离散分布
正态分布(Normal distribution),也称"常态分布",又名高斯分布(连续分布)
泊松分布的极限分布是正态分布
1 1 什么是随机森林?
随机森林就是通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树,而它的本质属于机器学习的一大分支——集成学习(Ensemble Learning)方法
每棵决策树都是一个分类器(假设现在针对的是分类问题),那么对于一个输入样本,N棵树会有N个分类结果。而随机森林集成了所有的分类投票结果,将投票次数最多的类别指定为最终的输出,这就是一种最简单的 Bagging 思想。
支持向量机svm的特点是针对小样本,样本越大,反而效果越差,容易过拟合。
而高斯核函数对于数据的噪音有着很好的抗干扰能。
核函数就是用来特征转换
p=2的闵可夫斯基距离就是经典的欧式距离
机器学习模型
error = bias^2+variance
L1范数使权值稀疏,L2范数能得到平滑的权值
Sigmoid函数是: 请问对其求导得到什么?
如何判断模型是否过拟合
训练集loss低于验证集loss很多
数据增强
1、水平/竖直翻转。
2、随机crop。
3、颜色改变。
4、仿射/旋转变换
5、随机改变大小
6、加噪声
A)激活函数是为了增强神经网络的非线性性;
B)
C)Sigmoid函数可以增强0附近的梯度,放大信号,梯度计算方便,但对非敏感区域会饱和,造成梯度消失;
Relu函数为单侧抑制,增强稀疏性,避免梯度消失;
Softmax函数用于多类分类问题,将输出归一化,方便计算基于概率的loss;
1 X和Y独立,推出随机变量X与Y的相关系数ρ=0(不相关)。反过来推不出。
2. 梯度方向:给定某定点,沿着梯度方向函数值增加最快
浙公网安备 33010602011771号