2014.4.12 是T的广州站,就在本校,很方便。考前一两天,临时抱佛脚,看着HTMLdog上的网页知识。就算考前,还在懊悔自己为什么不好好利用清明假期,多看点,看多点?哎,哎。。
谁知道一拿到试卷就傻眼了,原来考基础的知识,这几乎都木有怎么准备啊。是老天爷给我苟延残喘的时间吧。好吧,只能靠着零碎的记忆,硬着头皮做了。
我的基础还打得不够踏实,很多知识都似懂非懂呢。It is my chance .It is my challenge.
一.C++
1.sizeof() 32位机
- sizeof(指针)=sizeof(*char)=sizeof( (char*)malloc(100) )=4 byte
- sizeof(char a[]="123456")
字符数组,最初未指定大小,由具体填充值定。6个显性字节,加隐含的" ",共7byte
- sizeof(char a[]="a ")=3, 算1位
- sizeof(char a[100])=4,a[]等价于*a,退化成指针?
- sizeof(char a[100]="123456")
- sizeof(int a[100])=400
- 结构体的长度一定是最长数据元素的整数倍(以其为对齐单元),结构体对齐参数默认为8
- eg
//这个二维数组布局是这样的
//[0] x, x, x, x
//[1] x, x, x, x
//[2] x, x, x, x
//这是整个二维数组的大小
// 3*4*sizeof(int*) = 3*4*4 = 48
assert( sizeof(a)==48 );
//*a取的是二维数组的第1行的指针,每行有4个int*,则大小为
// 4 x sizeof(int*) = 4 * 4 = 16
assert( sizeof(*a)==16 );
//**a取的是第1行的第1列的指针
// sizeof(int*) = 4
assert( sizeof(**a) == 4 );
//***a取的是第1行第1列的内容,即int指针的内容,则
// sizeof(int) = 4
assert( sizeof(***a) == 4 );
- eg int **a[3][4], sizeof(a)=3*4*4=18
2.malloc 销毁
- malloc与free是C++/C 语言的标准库函数,不在编译器控制权限之内,由于malloc/free不能执行构造函数与析构函数,必须调用成员函数Initialize和Destroy来完成“构造”与“析构”。
void free(void *FirstByte): free()释放的是指针指向的内存(将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。),指针仍然指向原来的存储空间,指针指向的内容变成垃圾,释放内存后把指针指向NULL
- new/delete 是C++的运算符
3.C++中,内存分成5个区,堆、栈、自由存储区、全局/静态存储区、常量存储区
栈,由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区,通常是局部变量、函数参数等。
堆,由new分配的内存块,编译器不去管它们的释放,由我们的应用程序去控制,一般一个new就要对应一个delete。
如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
自由存储区,由malloc等分配的内存块,和堆相似,用free来结束自己的生命
全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区(未初始化的变量都被初始化成0或空串,C中也一样)。
常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)
void f() { int* p=new int[5]; }
在栈内存中存放了一个指向一块堆内存的指针p。在程序会先确定在堆中分配内存的大小,然后调用operator new分配内存,然后返回这块内存的首地址,放入栈中
http://www.cnblogs.com/hanyonglu/archive/2011/04/12/2014212.html
堆和栈主要的区别:
1、管理方式:栈,由编译器自动管理;堆,由程序员控制,易memory leak。
2、空间大小:栈,一般都是有一定的空间大小(VC6 1M 可改);堆,32位机的4G
3、能否产生碎片:栈无,堆有
4、生长方向:栈,向下生长,朝内存地址减小方向;堆,向上,内存地址增大方向
5、分配方式:栈,静态分配-编译器,动态分配-alloca函数;堆,动态
6、分配效率:栈是机器系统提供的数据结构,so效率比较高;堆,C/C++函数库提供,按照一定的算法,在堆内存中搜索可用的足够大小的空间。效率低
so 尽量用栈,而不是用堆
static
静态数据成员要实际地分配空间,故不能在类的声明中定义(只能声明数据成员)。类声明只声明一个类的“尺寸和规格”,并不进行实际的内存分配
static被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间,
3.指针 (写个程序验证下吧)
指针值赋予
二.数据结构
判断单链表是否有环算法,至少需多少个指针?
快慢追赶
- bool I***itsLoop(slist * head)
- {
- slist * slow = head , * fast = head;
- while ( fast && fast -> next )
- {
- slow = slow -> next;
- fast = fast -> next -> next;
- if ( slow == fast ) break ;
- }
- return ! (fast == NULL || fast -> next == NULL);
- }
三.数据库(看课本。。)
1.关系模式的定义&判断
1-NF(第一范式)每列都是不可再分的原子=R的所有属性都是不可再分的原子属性
2-NF:关系模式R为1-NF,R中每个非主属性都完全依赖于R的某个候选关键字/主键(真子集)=确保每列和主键相关
数据冗余 插入删除更新异常
3-NF:R为2NF,且R中每个非主属性都不传递依赖于R的某个候选关键字=确保每列和主键直接相关,而不是间接相关=属性不依赖于其它非主属性
BCNF;鲍依斯-科得范式,是3NF的改进形式 。在第三范式的基础上,不存在任何字段对任一候选关键字段的传递函数依赖。不会有关键字段决定关键字段
插入删除更新异常
4-NF:限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖
要求越来越严格,要符合某一种范式必须也满足它前边的所有范式
2.以下find表达方式一样的?
四.软件工程(参照:http://blog.csdn.net/zhengzhb/article/category/926691/2)
设计模式:Observation visited
观察者模式:对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。类型:行为类模式
五.计算机网络(看书!)
1.C类,三个子网,每个子网55个主机,每个子网掩码?
(子网地址)网络号:该网段的首个地址(定义:将IP地址和子网掩码进行与运算得出的结果为网络号)主机位全0
广播地址:该网段的最后一个地址 主机位全1
1、 /25
128的掩码;1位1,7位0(10000000);块尺寸为128;2个子网,每个子网中有126个主机号。
2、 /26
192的掩码;2位1,6位0(11000000);块尺寸为64;4个子网,每个子网中有62个主机号。
3、 /27
224的掩码;3位1,5位0(11100000);块尺寸为32;8个子网,每个子网中有30个主机号。
4、 /28
240的掩码;4位1,4位0(11110000);块尺寸为16;16个子网,每个子网中有14个主机号。
5、 /29
248的掩码;5位1,3位0(11111000);块尺寸为8;32个子网,每个子网中有6个主机号。
6、 /30
252的掩码;6位1,2位0(11111100);块尺寸为4;64个子网,每个子网中有2个主机号。
2.指定端口的网络协议?TCP/UDP not ICMP/IP
六.操作系统(看书总结)
1.给定资源,至多几个进程同时请求竞争 才避免死锁?
2.缺页中断,调度算法?
LRU
3.磁盘指针划道数?
七.计组(看书!)
(中央)处理器CPU(Central Processing Unit):
运算器ALU(Arithmetic and Logic
Unit):算术逻辑部件,通用寄存器组,状态寄存器
控制器CU:时令 时序 总线控制逻辑 中断控制逻辑
存储器
八.算法(看书看资料!)
1.空间复杂度 & 时间复杂度 计算&比较
f函数T(n)为O(n),f*f 时间复杂度为O(n*n) or O(n)?
quick sort 至少占S(n)为O(1)?
lim(T(n)/f(n)) = 不为0常数
T(n)=O(f(n)),
复杂度与时间效率的关系:
c < log2n < n < n*log2n < n2 < n3 < 2n < 3n < n! (c是一个常量)
|--------------------------|------------|-------------|
较好 一般 较差
2.排序
直接插入法:一个数据插入到已经排好序的有序数据中,O(n^2),稳定
就地排序,所以空间复杂度是O(1),稳定
插入排序有个升级版:二分插入法:减少了关键字之间比较的次数,记录移动的次数没有变,时间复杂度仍为O(n^2),在插入Ri个元素的时候采用二分法比较查找插入位置,稳定
在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们
中间的那个元素比,如果小,则对前半再进行折半,否则对后半
进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间
的所有元素后移,再把第i个元素放在目标位置上。
冒泡n2
冒泡改进:快排 不稳定 nlog2n
合并
关键字比较次数与原始数据排序关系?
排序前后的相同数字的顺序是否改变=是否稳定?
九.附加题
1分,2分,4分,组成1元的方案为?
参考http://www.zhihu.com/question/21075235
称重小于41g,要4个砝码,分别为?
参考http://blog.csdn.net/livelylittlefish/article/details/3854702