问题总结

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++中的模板特化不同于模版的实例化,模版参数在某种特定类型下的具体实现称为模版的特化。模版特化有时也称为模版的具体化,分别有函数模板特化和类模版特化。

  模板实例化:一个通过使用具体值替换模版参数,从模版产生的普通类,函数或者成员函数的过程。指函数模板(类模板)生成模板函数(模板类)的过程。

  特化:就是上述过程最终获得实体。、

  普通函数重载和使用模板特化还是有不同之处,主要表现在如下两个方面:
  (1)如果使用普通重载函数,那么不管是否发生实际的函数调用,都会在目标文件中生成该函数的二进制代码。而如果使用模板的特化版本,除非发生函数调用,否则不会在目标文件中包含特化模板函数的二进制代码。这符合函数模板的“惰性实例化”准则。
  (2)如果使用普通重载函数,那么在分离编译模式下,应该在各个源文件中包含重载函数的申明,否则在某些原文件中就会使用模板实例化,而不是重载函数。
  
5、内存泄漏?
  SomeClass *foo=new SomeClass(...);
  foo=nullptr;
  内存泄漏怎么解决,可以使用智能指针;在这里,比起直接使用new,应该优先使用能够std::make_unique和std::make_shared;
  智能指针是存储指向动态分配(堆)对象指针的类。除了能够在适当的时间自动删除指向的对象外,他们的工作机制很像C++的内置指针。智能指针在面对异常的时候格外有用,因为他们能够确保正确的销毁动态分配的对象。他们也可以用于跟踪被多用户共享的动态分配对象。
  事实上,智能指针能够做的还有很多事情,例如处理线程安全,提供写时复制,确保协议,并且提供远程交互服务。有能够为这些ESP (Extremely Smart Pointers)创建一般智能指针的方法,但是并没有涵盖进来。
     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

  缺页中断:就是要访问的页不在主存,需要操作系统将其调入主存后再进行访问。在这个时候,被内存映射的文件实际上成了一个分页交换文件。

  是指计算机在执行程序的过程中,当出现异常情况或特殊请求时,计算机停止现行程序的运行,转向对这些异常情况或特殊请求的处理,处理结束后再返回现行程序的间断处,继续执行原程序。
原文地址:https://www.cnblogs.com/jhmu0613/p/7553892.html