1. 快排的原理以及快排为什么快
快排利用了分治法的思想,将原问题划分为类似的多个结构相似的子问题,递归解决得到最终结果
相比堆排序,快排只需要递归解决每个子问题的排序即可,而堆排序要经过建堆、交换、堆调整几个步骤,其中堆调整是耗时最长的步骤,导致在数据规模增大时,快排优势越来越明显
2. C++面向对象设计的七个原则
[1] 单一职责原则:一个类最好只做一件事。各司其职
[2] 开闭原则:软件实体应该是可扩展的,对扩展开放,对修改封闭
[3] 里氏替换原则:子类必须能够替换基类。即子类只能扩展基类,不能隐藏或覆盖基类。因此,违反里氏替换原则必然违反开闭原则
[4] 依赖倒置原则:依赖于抽象。即高层不依赖于底层模块,同依赖于抽象;抽象不依赖于具体,具体依赖于抽象。依赖于抽象就是对接口编程,不是对实现编程。
[5] 接口隔离原则:使用多个小的专门的接口,不要使用一个大的总的接口。
[6] 迪米特法则:(最少知道原则),松耦合,一个对象应该尽可能少的去了解其他对象,尽量相互独立
[7] 合成复用原则:尽量使用组合/聚合,少用继承。在一个新对象里,通过关联关系来使用一些已有的对象,使之成为新对象的一部分。
3. 指针和指针数组
- int *p[2]:指针数组。是一个数组,元素是指针。int *类型的数组,每个元素都是int *类型,存储地址
- int (* p)[2]:数组指针。是一个指针,指向数组。n行2列的二维数组,列数确定,行数不确定
int **p:指针的指针,二级指针。p指向的内存中存放的是一个int *类型的指针变量
int (* p)[3]用法举例:
int a[][3] = {1,2,3,4,5,6,7,8,9};
int (* p)[3] = a;
*(p + 2) = &a[2]; //第3行
*(p + 2) + 1 = &a[2][1]; //第3行第2列元素地址(数组地址连续)
*(*(p + 2) + 1) = a[2][1] = 8;
4. 各层协议设备工作过程
- MAC:物理设备
- ARP/RARP:网络层协议,工作在数据链路层。路由器
- IP:路由器;ICMP:网络层协议,工作在运输层
- TCP/UDP:网关
5. 进程间通信方式
- [1] 管道:半双工通信方式,管道只能在具有亲缘性的进程间使用,有名管道允许无亲缘性进程间通信
- [2] 信号量:进程线程都有信号量通信方式
- [3] 信号:中断方式的一种模拟,比较复杂的通信方式,用于通知进程某个事件已经发生
- [4] 消息队列:消息的链表,克服了信号传递信息少的缺点。有写/读权限的进程可以往消息队列中添加信息/读取信息
- [5] 共享内存:多个进程访问同一块内存,是最快的IPC形式。往往与信号量等结合使用达到进程同步和互斥
- [6] 套接字:进程间通信机制,可用于不同机器之间的进程通信
6. git和svn维护工具的区别,git相对svn的优势
- [1] 使用Git,团队规模不受版本库工具自身的限制:svn提交无冲突合并再提交存在次数限制
- [2] Git分支管理功能强大
- [3] Git可设置不同权限,实现更好的发布控制
- [4] 隔离开发,提交审核
- [5] 已修复bug不再重现
- [6] 版本库的安全性
- svn具有悲观锁的功能,一个用户编辑时可对文件进行锁定,防止多人同时编辑同一文件
7. 判断链表是否有环代码
struct node
{
int data;
struct node *next;
}Node,*NodeList;
bool IsLoop(Node *L)
{
Node *pSlow = L;
Node *pFast = L;
while (pSlow != NULL && pFast != NULL)
{
pSlow = pSlow -> next;
pFast = pFast -> next -> next;
if (pSlow == pFast)
return true;
}
return false;
}
8. 链表和数组的区别
- 数组必须事先指定元素个数,链表可以动态增减元素
- 数组寻址更快,数据查找更方便,链表操作灵活,元素增减更高效
- 静态数组从栈中分配,操作更迅速但自由度小;链表从堆中分配,自由度大但管理麻烦
9. 进程和线程的区别
- [1] 地址空间:进程有自己独立的地址空间,线程共享进程的地址空间
- [2] 资源占有:进程是资源分配和拥有的单位,线程共享进程的资源
- [3] 并发性:均可并发执行。但线程划分尺度小于进程,多线程程序并发度更高
- [4] 独立性:进程之间相互独立,因此进程之间同步简单但数据共享复杂;线程不能独立执行,线程之间数据共享简单但同步复杂
- [5] 调度和切换:线程是程序执行的最小单位,进程是操作系统分配资源的最小单位。线程上下文切换比进程切换快
- [6] 创建/销毁/切换:进程创建/销毁/切换复杂,速度慢;线程创建/销毁/切换简单,速度快
- [7] CPU和内存占用:进程内存占用大,CPU利用率偏低;线程内存占用少,CPU利用率高
- [8] 编程/调试:进程编程调试简单,线程编程调试复杂
- [9] 可靠性:进程间不会相互影响,一个线程挂掉可能导致整个进程挂掉
- [10] 分布式:进程适用于多核多机分布式,线程适用于多核分布式
参考资料:
http://blog.csdn.net/u010355144/article/details/44940171
http://blog.csdn.net/baidu_35692628/article/details/69218808
2017.10.15