面试--电话处子面百度商业搜索部总结

1.哈希各种冲突消解策略比较

(1)开放地址法

(2)链接法

链地址法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;链地址法中链表的结点是动态申请的,故它更适合造表前无法确定表长的情况,

开放定址法为了减少冲突要求填充因子较小,故结点规模较大时会浪费很多空间,而链地址法中填充因子可以大于1且结点较大时,拉链法中增加的指针域可以忽略不计,因此节省空间。

2.父进程子进程

(1)父子进程关系 
. 进程组处理 
进程组的概念是这样的,当系统启动时,第一个进程是init,其进程组号等于进程号,由他产生的任何子进程的进程组号也相同,子进程的子进程也继承该进程组号,这样,由init所生成的任何子进程都属于同一个进程组。但是,同一个进程组的父子进程可能在信号上有相互通讯,若父进程先于子进程退出系统,则子进程会成为一个孤儿进程,可能变成僵死进程。从而使该子进程在其不"愿意"的情况下退出运行,为解决这个问题,子进程能够自己组成一个新的进程组,即调setpgrp()和原进程组脱离关系,产生一个新的进程组,进程组号和他的进程号相同。这样,父进程退出运行后就不会影响子进程的当前运行。
. 子进程信号处理 
但是,单做上述处理还不能解决另一个困难,即子进程在退出运行时,很难找到其父进程(父进程已退出,子进程的父进程号改为1),发送子进程退出信号后没有父进程做出响应处理,该子进程就不可能完全退出运行,可能进入僵死状态。所以父进程在产生子进程前最好屏蔽子进程返回信号的处理,生成子进程,在父进程退出运行后,子进程返回则其进程返回信号的处理会由系统给出缺省处理,子进程就能够正常退出。
(2)兄弟进程关系 
. 交换进程号 
对于信息协调方式的程式来说,各兄弟进程间十分需要相互了解进程号,以便于信号处理机制。比较合理的方法是父进程生成一个共享内存的空间,每个子进程都在启动时在共享内存中配置自己的进程号。这样,当一个子进程要向另一个子进程发送信号或是因为其他原因需要知道另一个子进程号时,就能够在共享内存中访问得到所需要的进程号。

在程序设计时,某一个具体的功能模块可以通过函数或是线程等不同的形式来实现。对于同一进程而言,这些函数、线程都是存在于同一个地址空间下的,而且在执行时,大多只对与其相关的一些数据进行处理。如果算法存在某种错误,将有可能破坏与其同处一个地址空间的其他一些重要内容,这将造成比较严重的后果。为保护地址空间中的内容可以考虑将那些需要对地址空间中的数据进行访问的操作部分放到另外一个进程的地址空间中运行,并且只允许其访问原进程地址空间中的相关数据。具体的,可在进程中通过CreateProcess()函数去创建一个子进程,子进程在全部处理过程中只对父进程地址空间中的相关数据进行访问,从而可以保护父进程地址空间中与当前子进程执行任务无关的全部数据。对于这种情况,子进程所体现出来的作用同函数和线程比较相似,可以看成是父进程在运行期间的一个过程为此,需要由父进程来掌握子进程的启动、执行和退出。创建子进程才能多道程序并发执行,linux初始化的时候会创建swap进程、然后是init进程和一个init进程的兄弟进程,所有的进程(运行的程序)都是从父进程演化出去的。

创建子进程:fork(); 

清除僵死子进程:终止父进程要调用wait()或waitid()以获取被终止子进程的有关信息并释放它仍占用的资源;

子进程自立门户:setpgid()加入到一个现存的进程组或创建一个新进程组;

3.死锁预防

银行家算法

4.鞍点优化

#define N 4
#define M 5
for(i=0;i<N;i++)
{
max=a[i][0];
maxj=0;
for(j=0;j<M;j++)
if(a[i][j]>max)
{
max=a[i][j];
maxj=j;
}
flag=1;
for(k=0;k<N;k++)
if(max>a[k][maxj])
{
flag=0;
continue;
}
if(flag)
{
printf("a[%d][%d]=%d ",i,maxj,max);
break;
}
}
if(!flag)
printf("It is not exist! ");

这处程序是O(n*n)O(1)但是如果所有数全相等时呢?

5.实现字符串翻转[先整体对折再单词对折]

-hello--world---=>---world--hello-

(1)从字符串末尾向前遍历

(2)字符分两种类型,空格和英文字符,记录当前字符类型和前继字符类型

(3)字符类型未发生改变,则继续累加字符串至strTemp(空格和英文字符不同);发生改变,strTemp累加至输出字符串。

(4)遍历结束strTemp不为空则累加至输出字符串

6.典型的空间换时间

一种是将之前计算的结果保存起来,方便当前步计算之用,从而降低计算量。这种思想的典型体现就是动态规划算法。动态规划算法,每次计算都将前一次计算的最优结果保存起来,在本步计算时,利用前一步的结果求本步的最优值,然后再保存起来,如此迭代下去。
二种是将所有步骤公共计算的部分实现计算好。真正计算时,只需调用实现计算好的结果就可以了。这种战术的典型体现有汉明距离的计算(参见编程之美2.1解法五)、Edgel论文中Distance Map的计算

原文地址:https://www.cnblogs.com/siliconvalley/p/3160492.html