算法导论有趣题——4-2,6-3

原创 2016年03月05日 09:57:01

4-2:

题目描述:

某数组A[1,2,...n]含有所有从0到n的证书,但其中一个整数不在数组中。通过辅助数组B[0,...n]来记录A中出现的整数

(1)在O(n)时间找到缺失整数

(2)若数组中每个数值是二进制的,不能直接对每个数取出其数值,则如何找到缺失



解答:
(1)遍历数组A,将每个出现的值存储在B中下标对应值,之后遍历一次B即可

eg:

for val in A:
    B[val] = 1

for i in range(len(B)):
    if B[i] == 0:
        return i

(2)使用异或操作来处理。1^0 = 0,1^1 = 0,0^0 = 0,既:两个相等的数异或结果为0,而0与任何数异或得该数本身。因此,将A中的值与0~n异或,得到的结果就是缺失的整数。


6-3:

题目描述:Young 氏矩阵:从左到右递增,从上到下递增。

(1)插入一个新元素的算法及复杂度

(2)对n*n个数使用young氏矩阵排序的复杂度为O(n^3)

(3)在m*n矩阵中找到一个给定数,复杂度O(m + n)


解答:

(1)在矩阵右下角插入新元素。若新元素大于上方与前方的元素,则插入成功。否则, 将新元素往小的方向比较交换过去。最坏情况的复杂度为:走到了左上角O(n+m)

void insert(vec,i,j)
{
    //此处仅提供参考思想,不具体涉及边缘控制
    curr = vec[i][j];
    left = vec[i][j-1];
    up = vec[i-1][j];
    if(curr >= left && curr >= up)
        return;  //找到合适位置
    else if(curr < left)
        insert(v,i,j-1)
    else
        insert(v,i-1,j)
}

2)对 n * n 个元素使用Young矩阵,每个元素插入该矩阵的复杂度是O(n+n),则,总的复杂度为O(2n*n*n) = O(n^3)。对一个Y矩阵,左上角为最小值,最左一列递增,最顶一行递增,则使用合并排序中的摸牌式合并方法,O(m+n)的复杂度就可以排序好第一列与第一行。同样的方法。遍历整个矩阵一次,就可以完成排序


(3) 从左下角起寻找元素。若当前值小于需要值,则往右;若当前值大于需要值,则往上。复杂度为O(m + n)


相关文章推荐

算法导论有趣题——第二章集合

题目: 有两个各存放在数组A和数组B中的n位二进制整数,考虑其相加问题。将所得结果以二进制形式存放在数组C中,C的维数为[n+1]。写出伪代码 解决: func(A,B,C): carry_...

算法导论 第18章 思考题18-2 2-3-4树的链接与分裂,推广至B树

题目     2-3-4树是B树的特例,是度为2的B树。在B树这篇博客中,我们实现的B树是一个模板,因此要得到2-3-4树,即度为2的B树非常容易,只要如是声明就可以了——Btree bt,其中in...

算法导论---逆序对 p24题,2-4

算法导论---逆序对 p24题,2-4 修改合并排序 基本思路见p17 分解 -解决- 合并

《算法导论》课后题--3--第二章(2)

2.3-6 分析:本题考查算法时间复杂度的改进; 作答: 外层循环时间复杂度为,内层若采用二分查找,则为,所以可以实现提升。 ---------------------------------...

算法导论-4-6 VLSI芯片测试

问题:Diogenes 教授有n个被认为是完全相同的VLSI芯片,原则上它们是可以互相测试的.教授的测试装置一次可测试二片,当该装置中放有两片芯片时,每一片就对另一片作 测试并报告其好坏.一个好的芯片...

算法导论 4-6 VLSI芯片测试

4-6  VLSI芯片测试     Diogenes教授有n个被认为是完全相同的VLSI芯片,原则上它们是可以互相测试的。教授的测试装置一次可测二片,当该装置中放有两片芯片时,每一片就对另一片作...

算法导论4-6 VLSI芯片测试

Diogenes 教授有n个被认为是完全相同的VLSI芯片,原则上它们是可以互相测试的.教授的测试装置一次可测试二片,当该装置中放有两片芯片时,每一片就对另一片作 测试并报告其好坏.一个好的芯片总...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法导论有趣题——4-2,6-3
举报原因:
原因补充:

(最多只允许输入30个字)