百度笔试9.2

进程死锁的原因:?

资源有限且操作不当:一种原因是系统提供的资源太少了,远不能满足并发进程对资源的需求。另一种原因是由于进程推进顺序不合适引发的死锁。

进程死锁的必要条件?

互斥;不可抢占;占有且申请;循环等待条件。

解决死锁的方法?

只要破坏这四个必要条件中的任意一个条件,分为死锁的预防,避免,检测与恢复三种。

死锁预防的基本思想是要求进程申请资源时遵循某种协议,从而打破产生死锁的四个必要条件中的一个或几个。

死锁避免不限制进程有关申请资源的命令,而是对进程所发出的每一个申请资源命令加以动态地检查,并根据检查结果决定是否进行资源分配。就是说,在资源分配过程中若预测有发生死锁的可能性,则加以避免。这种方法的关键是确定资源分配的安全性。安全序列,银行家算法。

死锁检测与恢复是指系统设有专门的机构,当死锁发生时,该机构能够检测到死锁发生的位置和原因,并能通过外力破坏死锁发生的必要条件,从而使得并发进程从死锁状态中恢复出来。检测:死锁检测算法。恢复:系统的重新启动;撤消进程,剥夺资源;进程回退策略。

http://blog.csdn.net/abigale1011/article/details/6450845

如何用队列来求一个二叉树的最大高度?

利用层次遍历非递归求:一层一层地出队列,在我们每次访问完毕一层时,这时队列中存储的刚好是下一层的所有元素。所以在下一次循环开始时,首先记录该层的元素个数,一次性访问完这一层的所有元素,访问完一层高度当然就加1。

用队列来求一个二叉树的最大高度算法:

maxDepthWithLevelTraversal(TreeNode* root){

if\(!root\){

    return 0;/\* 判断树是否为空 \*/

}

height = 0;    // 初始化树的高度为0

queue<TreeNode\*>Q;  // 初始化一个队列,并将根节点入队

Q.push\(root\);



/\* 当队列不为空时,队列中存储的刚好是将要访问下一层的所有元素\*/

while\(!Q.empty\(\)\){

    height++;

    curLevelSize = Q.size\(\);  // 记录当前层元素个数

    cnt = 0;

    /\* 弹出当前层所有元素 \*/

    while\(cnt < curLevelSize\){

        TreeNode\* temp = Q.front\(\);

        Q.pop\(\);

        cnt++;

        /\* 将下一层的元素入队列 \*/

        if\(temp->left\)

            Q.push\(temp->left\);

        if\(temp->right\)

            Q.push\(temp->right\);

    }

}

return height;

}

http://blog.csdn.net/simple_the_best/article/details/52712892

results matching ""

    No results matching ""