随手笔记

1、函数指针与指针函数;数组指针与指针数组

函数指针:指向函数的指针。e.g..  int (*f)(参数列表)

指针函数:返回指针的函数。e.g..  int* f(参数列表)

数组指针:指向数组的指针。e.g..  int (*a)[],定义一个指向整型数组的指针。

指针数组:装着指针的数组。e.g..  int *a[10],定义一个包含10个指向整形变量的指针的数组。

example1定义一个函数指针,指向的函数有两个int形参并且返回一个函数指针,返回的指针指向一个有一个int形参且返回int的函数?

step1定义一个函数指针,指向的函数有两个int形参:int (*F)(int,int)

step2并且返回一个函数指针:int (*(*F)(int,int))()

step3返回的函数指针指向一个有一个int形参且返回int的函数:int (*(*F)(int,int))(int)

example2声明一个指向含有10个元素的数组的指针,其中每个元素是一个函数指针,该函数的返回值是int,参数是int*

step1声明一个指向含有10个元素的数组的指针:(*p)[10]

step2定义一个函数指针,该函数的返回值是int,参数是int*:int (*f)(int*)

step3在step1的数组中每个元素声明为step2定义的函数指针:int (*(*p)[10])(int*)

2、在程序设计中,要对两个16K×16K的多精度浮点数二维数组进行矩阵求和时,行优先读取和列优先读取的区别是(B

A、没区别    B、行优先快   C、列优先快   D2种读取方式速度为随机值,无法判断

分析:若在内存中,则数据可以“随机存取”,内存数据被读取或写入时,所需要的时间与这段信息所在的位置无关。但是在读取和写入磁盘时,其所需要的时间与位置就会有关系。因为在BASIC、PASCAL和C/C++语言中,数组的存放是按照行优先来存放的,按行号第一行第二行...以此类推。本题关键是考察内存抖动的问题,如果按列访问则需要跳过一大串内存地址,这样可能需求的内存地址不在当前页中则需要进行页置换,这样便需要硬盘IO,减低速度。

3、动态链接静态链接

如果函数库的一份拷贝是可执行文件的物理组成部分,那么我们称之为静态链接。
如果可执行文件只是包含了文件名,让载入器在运行时能够导找程序所需要的函数库,那么我们称之为动态链接。

收集模块准备扩行的三个阶段的规范名称是“链接-编辑(link-editing)”,“载入(loading)”和“运行时链接(runtime linking)”。
静态链接的模块被链接编辑并载入以便运行。
动态链接的模块被链接编辑后载入,并在运行时进行链接以便运行。程序执行时,在main()函数调用前,运行时载入器把共享的据对象载入到进程的地址空间。外部函数在被真正调用之前,运行时载入器并不解析它们。所以即使链接了函数库,如果并没有实际调用,也不会带来额外开销。

尽管可执行文件的启动速度销受影响,但动态链接可以从两个方面提高性能:
1)动态链接可执行文件比功能相同的静态链接可执行文件的体积小。
2)所有动态链接到某个特定函数库的可执行文件在运行时共享该函数库的一个单独拷贝。

如下关于编译链接的说法错误的是(B)

A、编译优化会使得编译速度变慢

B、预编译头文件可以优化程序的性能  //只能提高编译速度。

所谓头文件预编译,就是把一个工程(Project)中使用的一些标准头文件(如Windows.H、Afxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。

C、静态链接会使得可执行文件偏大

D、动态链接库会使进程启动速度偏慢

4、使用new创建对象时:A构造父类成员对象;B调用父类构造函数;C构造子类成员对象;D调用子类构函数。遵循的原则:先父类后子类;先成员后函数。

5、给定3个int类型的正整数x,y,z,对如下4组表达式判断正确的选项(A)

int a1=x+y-z; int b1=x*y/z;

int a2=x-z+y; int b2=x/z*y;

int c1=x<<y>>z; int d1=x&y|z;

int c2=x>>z<<y; int d2=x|z&y;

A、a1一定等于a2   B、b1一定定于b2

C、c1一定等于c2   D、d1一定等于d2

void test()
{
	int x = 4294967295;
	int y = 2;
	int z = 2;
	int a1 = x+y-z, a2 = x-z+y, 
		b1 = x*y/z, b2 = x/z*y, 
		c1 = x<<y>>z, c2 = x>>z<<y, 
		d1 = x&y|z, d2 = x|z&y;
	cout<<(a1==a2)<<endl;
	cout<<(b1==b2)<<endl;
	cout<<(c1==c2)<<endl;
	cout<<(d1==d2)<<endl;
}
由于“+”运算最多导致一位进位,溢出标志位可以解决“+”运算导致的溢出情况

6、C++多态实现的机制

C++的多态实现是基于继承和虚函数,可以简单的概括为“1个接口,多种方法”,在程序运行的过程中才决定调用的函数(虚函数),简单的说就是可以通过父类指针调用子类的函数,可以让父类指针有多种形态。即允许将父对象设置成为和他的子对象相等,赋值之后,父对象就可以根据当前赋值给他的子对象的特性以不同的方式运作。

7、多态详解

7.1类的多态

class animal
{
public:
	virtual void sleep()
	{
		cout<<"animal sleep"<<endl;
	}

	void breathe()
	{
		cout<<"animal breathe"<<endl;
	}
};

class fish:public animal
{
public:
	void sleep()
	{
		cout<<"fish sleep"<<endl;
	}

	void breathe()
	{
		cout<<"fish breathe"<<endl;
	}
};

int main()
{
	fish fi;
	animal *aniPtr = &fi;
	aniPtr->sleep();   //晚绑定
	aniPtr->breathe();   //早绑定

	return 0;
}


A)对于非虚函数,C++编译器编译时就已确定每个对象调用的函数的地址,即早期绑定,e.g.. aniPtr->breathe();当我们将fish类的对象fi的地址赋值给aniPtr时,编译器进行了类型转换,编译器认为aniPtr指向的是animal对象的地址;

B)对于虚函数,则是晚绑定/动态绑定e.g.. aniPtr->sleep();遇到虚函数,会进行晚绑定。编译器在编译时,发现类中含有虚函数(一旦某个函数在基类中声明为virtual,那么所有派生类中该函数也为virtual),会为每个包含虚函数的类创建一个虚表(vtable),虚表是一个一维数组,存放每个虚函数的地址。编译器还为每个类的对象提供了一个虚表指针(vptr),用来指向对象所属类的虚表。在程序运行时,根据对象的类型去初始化vptr。animal *aniPtr = &fi;aniPtr->sleep();由于aniPtr实际指向的类型是fish,因此vptr指向fish类的vtable,当执行aniPtr->sleep();时根据虚表中的函数地址找到的就是fish类中的sleep()函数。

对于虚函数调用来说,每个对象内部都有一个虚表指针,被初始化为/指向本类的虚表。所以在程序中不管你的对象类型如何转换,但该对象内部的虚表指针是固定的,所以才能实现动态的函数对象调用,这就是C++多态实现的原理。

7.2函数的多态:一个函数被定义成多个不同参数的函数,针对不同的参数调用不同的函数。

8指针和引用

引用,一个变量的别名,为什么引入别名呢?原因是我们想定义一个变量,他共享另一个变量的内存空间,使用别名无疑是一个好的选择。变量是什么?是一个内存空间的名字,如果我们给这个内存空间在起另外一个名字,那就是能够共享这个内存了,引用(别名)的由此而来。
指针,指向另一个内存空间的变量,我们可以通过它来索引另一个内存空间的内容,本身有自己的内存空间。

8.1引用和指针的区别:

1)指针是个实体,而引用是个别名;

2)引用只能在定义时初始化一次,之后不能变,指针可变;

3)引用不能为空,指针可以为空;

4)sizeof引用得到的是所指向变量/对象的大小,sizeof指针得到的是指针大小(32位4字节,64位8字节);

5)你无法让引用与其指示物分离。

8.2C++为什么引入引用(C没有引用)

为了支持运算符重载/operator overloading。

e.g..

ClassFoo operator+(const ClassFoo *, const ClassFoo *)   //1
{...}
ClassFoo operator+(const ClassFoo &, const ClassFoo &)   //2
{...}

"+"重载1,使用时为&A+&B,与A+B的通用写法不付,很不舒服。

进一步假设,可以写成A+B,让编译器根据operator+的参数类型来解释A和B的类型,即是值解释为值,是指针解释为指针,但是会导致指针和值将不能重载!而同一个函数,根据value和pointer有不同的实现,是一个相对普遍的需求!引入引用,既可以满足操作符重载,也不会失去value和pointer的灵活性。当然了,这样会导致值和引用不能重载,不过几乎没有什么情况下需要重载这两个。

9、条件随机场(CRF)相对于HMM,MEMM的优势

首先,CRF,HMM(隐马模型),MEMM(最大熵隐马模型)都常用来做序列标注的建模,像词性标注,True casing。但隐马模型一个最大的缺点就是由于其输出独立性假设,导致其不能考虑上下文的特征,限制了特征的选择,而最大熵隐马模型则解决了这一问题,可以任意的选择特征,但由于其在每一节点都要进行归一化,所以只能找到局部的最优值,同时也带来了标记偏见的问题(label bias),即凡是训练语料中未出现的情况全都忽略掉,而条件随机场则很好的解决了这一问题,他并不在每一个节点进行归一化,而是所有特征进行全局归一化,因此可以求得全局的最优值。
目前,条件随机场的训练和解码的开源工具还只支持链式的序列,复杂的尚不支持,而且训练时间很长,但效果还可以。

10、下列属于无监督学习的是(A)

A. k-means      B. SVM      C. 最大熵      D. CRF

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值