算法导论第7章 课后习题

7.1-1

这个如果理解了这节内容的话,还是很好演示的。略

7.1-2

(1)当数组的所有元素相同的话,i每次都需要+1操作,在循环结束后i=r-1,返回的是r

(2)只需要在循环内部加上相等判断,间断的让i+1即可

	public static int partition_2(int[] arr,int p,int r) {
		int x = arr[r];
		int i = p - 1;
		boolean flag = true;
		
		for(int j = p;j <= r - 1;j++) {
			if(arr[j] < x || (arr[j] == x && flag == true)) {
				i = i+1;
				int temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
			}
			if(arr[j] == x) {
				flag = !flag;
			}
		}
		int temp = arr[i+1];
		arr[i+1] = arr[r];
		arr[r] = temp;
		
		return i+1;
	}

7.1-3

partition中for循环结构的时间复杂度是Θ(n),其他执行语句都为Θ(1),所以相加最后得Θ(n)。

7.1-4

只需要将for循环中的if判断改为 > 或 >= 即可

7.2-1

T(n)≤  c₁(n-1)² + Θ(n)

           =  c₁n² -2c₁n +c +Θ(n)

            ≤ c₁n² (Θ(n)-2c₁n+c₁ < 0时)

∴ T(n)= O(n²)

T(n)≥ c₂(n-1)² + Θ(n)

           = c₂n² -2c₂n +c₂ +Θ(n)

           ≥ c₂n² (Θ(n)-2c₂n+c₂ > 0时)

∴ T(n)= Ω(n²)

∴ T(n)= Θ(n²)

7.2-2

当数组中元素相同时,也就循环每次都会执行,即 0 : n-1划分,所以 T(n) = T(0) + T(n-1) + Θ(n)

所以 T(n) =  Θ(n²)

7.2-3

当数组已经是降序排序排列,那么也就是快速排序的最坏情况,每次的划分都是 0 : n-1

所以 T(n) =  Θ(n²)

7.2-4

因为用户使用多张支票是连号的,所以在一个时间段内,顶多是这几张支票打乱了顺序。而不是一天24小时之内所有的支票全部乱序,所以近似为有序的,那么这是快排的最坏情况,这时候插入排序的时间复杂度是O(n),而快速排序的时间复杂度是O(n²)

7.2-5

最短深度 α^M * n = 1   ∴  M = ㏒ α (n^-1) = - lg n/lg α

最大深度 (1-α)^M * n = 1  ∴ M = ㏒ 1-α (n^-1) = - lg n/lg (1-α)

7.2-6

在 nα 到 n(1-α)之间有 n - 2nα个数

∴ 概率 为 (n - 2nα)/n = 1-2α (在n个数中选择这n-2nα个数的概率)

7.3-1

讨论随机快速排序的最坏情况没有意义,随机只是降低了最坏情况的概率

7.3-2

都为Θ(n),每次调用RANDOM方法获得一个主元,每个主元都只被选择一次,不再后来被用到,所以最多调用RANDOM n-1次

7.4-1

T(n) = max (0≤q≤n-1) ( T(q) + T(n-q-1)+ Θ(n))

             ≥ max (0≤q≤n-1)(cq² + c(n-q-1)² + Θ(n))

            = cmax (0≤q≤n-1) (2q² + (2-2n)q + (n-1)² + Θ(n))

∵ -b/2a = (1-n)/2

∴ 当q = 0或n-1时等式最大

∴ T(n)≥ c ((n-1)² + Θ(n))

               = c (n² - 2n +1 +Θ(n))

                ≥ cn² (- 2n +1 +Θ(n)≤0)

∴ T(n)=Ω(n²)

7.4-2

用代入法证明

7.4-3

在7.4-1中T(n)中的关于q的二次函数的对称轴为(1-n)/2,所以当q=0或q=n-1时最大

 

猜你喜欢

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