1、快速排序的算法复杂度怎么计算:
在最优的情况下,partition每次都划分的很均匀,如果排序n个关键字,其递归树的深度就为log2n+1,每次将数组一分为二,可以有下面的不等式:
T(n) <= 2T(n/2) + n ;
T(n) <= 2(2T(n/4) + n/2) + n = 4T(n/4) + 2n;
T(n) <= 4(2T(n/8) + n/4) + 2n = 8T(n/8) + 3n;
......
T(n) <= nT(1) + log2n * n = O(nlogn);
在最差的情况下,就类似于冒泡排序了复杂度为O(n*n);
就空间复杂度来说,主要是递归造成的栈空间的使用,最好情况,递归树的深度为log2n,其空间复杂度也就为O(logn),最坏情况,需要进行n‐1递归调用,其空间复杂度为O(n),平均情况,空间复杂度也为O(logn)。
可惜的是,由于关键字的比较和交换是跳跃进行的,因此,快速排序是一种不稳定的排序方法。
参考:http://book.51cto.com/art/201108/287089.htm
2、浮点数精度丢失?
http://justjavac.iteye.com/blog/1724438
3、怎么样保证线程安全?
线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。
互斥操作:对共享资源的访问,要对互斥量进行加锁,如果互斥量已经上锁,调用线程会阻塞,直到互斥量被解锁。在完成了对共享资源的访问后,要对互斥量进行解锁。
死锁:死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
线程同步:即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态,目前实现线程同步的方法有很多,临界区对象就是其中一种。
4、模板特化?
c++中的模板特化不同于模版的实例化,模版参数在某种特定类型下的具体实现称为模版的特化。模版特化有时也称为模版的具体化,分别有函数模板特化和类模版特化。
模板实例化:一个通过使用具体值替换模版参数,从模版产生的普通类,函数或者成员函数的过程。指函数模板(类模板)生成模板函数(模板类)的过程。
特化:就是上述过程最终获得实体。、
SomeClass *foo=new SomeClass(...);
foo=nullptr;
内存泄漏怎么解决,可以使用智能指针;在这里,比起直接使用new,应该优先使用能够std::make_unique和std::make_shared;
智能指针是存储指向动态分配(堆)对象指针的类。除了能够在适当的时间自动删除指向的对象外,他们的工作机制很像C++的内置指针。智能指针在面对异常的时候格外有用,因为他们能够确保正确的销毁动态分配的对象。他们也可以用于跟踪被多用户共享的动态分配对象。http://www.jb51.net/article/56004.htm
内存泄漏与检测:http://www.cnblogs.com/skynet/archive/2011/02/20/1959162.html
6、分页相关:
http://www.cnblogs.com/vinozly/p/5589032.html
https://www.douban.com/group/topic/19646863/?cid=234011002缺页中断:就是要访问的页不在主存,需要操作系统将其调入主存后再进行访问。在这个时候,被内存映射的文件实际上成了一个分页交换文件。
是指计算机在执行程序的过程中,当出现异常情况或特殊请求时,计算机停止现行程序的运行,转向对这些异常情况或特殊请求的处理,处理结束后再返回现行程序的间断处,继续执行原程序。