c++

类空间大小计算

类所占内存的大小是由成员变量(静态变量除外)决定的,成员函数(这是笼统的说,后面会细说)是不计算在内的。

注意:

成员函数还是以一般的函数一样的存在。a.fun()是通过fun(a.this)来调用的。所谓成员函数只是在名义上是类里的。其实成员函数的大小不在类的对象里面,同一个类的多个对象共享函数代码。而我们访问类的成员函数是通过类里面的一个指针实现,而这个指针指向的是一个table,table里面记录的各个成员函数的地址(当然不同的编译可能略有不同的实现)。所以我们访问成员函数是间接获得地址的。所以这样也就增加了一定的时间开销,这也就是为什么我们提倡把一些简短的,调用频率高的函数声明为inline形式(内联函数)。

总结:

空的类是会占用内存空间的,而且大小是1,原因是C++要求每个实例在内存中都有独一无二的地址。

(一)类内部的成员变量:

  • 普通的变量:是要占用内存的,但是要注意对齐原则(这点和struct类型很相似)。
  • static修饰的静态变量:不占用内容,原因是编译器将其放在全局变量区。

(二)类内部的成员函数:

  • 普通函数:不占用内存。
  • 虚函数:要占用4个字节,用来指定虚函数的虚拟函数表的入口地址。所以一个类的虚函数所占用的地址是不变的,和虚函数的个数是没有关系的
  • 32位中,指针占4位。      64位中,指针占8位
 

内存对齐

  • 结构体,类:
  • 1、 分配内存的顺序是按照声明的顺序。
  • 2、 每个变量相对于起始位置的偏移量必须是该变量类型大小的整数倍,不是整数倍空出内存,直到偏移量是整数倍为止。
  • 3、 最后整个结构体的大小必须是里面变量类型最大值的整数倍。
 

面向对象设计原则05------合成/聚合复用原则(CARP)定义:尽量使用合成/聚合,尽量不要使用类继承。合成是一种强的拥有关系(大雁和翅膀!),聚合是一种弱的拥有关系(雁群和大雁!)

尽量使用继承而不是聚合,因为继承使得类间的耦合性最小(错误)

因为:不要使用继承组建功能,而是使用黑箱复用(即对象组合),因为继承的层次增多,造成最直接的后果就是当你调用这个类群中的一个类时,就必须要把他们全部加载到栈中!(后果可想而知。)

http://www.cnblogs.com/feichengwulai/articles/4137395.html

 

 

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. 梯度方向:给定某定点,沿着梯度方向函数值增加最快

 

posted on 2018-07-10 10:09  冯妹妹Q  阅读(233)  评论(0)    收藏  举报