算法导论第9章习题

9.1-1

首先第一步,找出最小的元素,如图所示,一个内部节点表示一次比较,一个根节点表示一次比较,所以共需n-1比较

第二步,如图显示,只需要比较与最小值比较过的数字即可得出第二小的数字,因为第二小的数字必定与最小数字比较过,所以与最小值比较过的数字共有lgn的数字,即最多需要比较lgn-1次

最后得出最坏情况需要比较 n-1 + lgn - 1次,当n为奇数时,取lgn的上整数

9.1-2

假如数组长度是奇数,那么 最坏情况需要 3 |_n/2_|  次

当数组长度是偶数时,那么 最坏情况需要 3(n-2)/2 + 1 次

所以最后得出 最坏情况 需要 |ˉ 3n/2 ˉ|/2 - 2 次 (不知道怎么得出来的,答案是这个,但是我一直觉得是3 |_n/2_|)

9.2-1

不存在这种情况,不妨假设如果是0-length划分,那么在本次的方法调用中q = 1或n,那么k也等于1或n,那么如果出现i<k,

那么 p =r =0,将会立即返回A[p],不会再递归调用,所以不会出现0-length划分

9.2-2

Xk 和 T(max{k-1,n-k}) 是 独立的;Xk的值取决于首次调用时产生的随机数,而随后每次产生的随机数都会独立于首次调用时产生的随机数,调用时随机数范围是1到n-1;

9.2-3

public static int NonRecursiveRandomizedSelect(int A[],int p,int r,int i) {
	    while (p<r) {
	        int q = randomizedPartition(A,p,r);
	        int k = q-p+1;
	        if (i==k) {
	        	return A[q];
	        }else if(i<k) {
	        	r = q-1;
	        }else {
	            p = q+1;
	            i -= k;
	        }
	    }
	    return A[p];
	}

9.2-4

每次都选择划分T(n)=T(n-1)+Θ(n)

猜你喜欢

转载自blog.csdn.net/sscout/article/details/81198447