一、 设计一个分治算法实现利润最大或亏损最小
(1)Divide:将A、B城市之间的市场统一分为等量的两部分;
(2)Conquer:对于每一部分进行统一递归操作,即找出市场i和市场j。使得利润最大或亏损最小;
(3)Merge:对(2)部分的结果进行合并,比较S[j]-B{i},取其最大值为最终结果;
时间复杂度为O(n^2)。
二、 设计一个分治算法,找到数组A[1..n]中的最大和最小的数,并分析所需要比较的次数
(1) Divide:把数组A[1..n]分为大小相同的两个数组A1和A2,
在A1和A2中分别找出max和min的元素;
(2) Conquer:比较A1和A2中max和min元素,两个最大元素中大的元素就是原数组中最大元素,两个最小元素中小的元素就是原数组中最小元素;递归重复以上过程,再分别将A1分位A11和A12,A2分为A21和A22,该过程一直下去;
(3) Merge:直到在分割后的数组中元素的个数少于三个时,此时醉倒只需一次比较,即可找到该数组中的max和min元素。
(4) 分析比较次数为:3n/2 - 2
三、 证明一个基于比较的排序算法在最好情况下至少需要(n-1)次比较才能把一个n个数字的序列排好
反证法:
如果基于比较排序算法最好情况为(n-2)此比较,
那么定会有一个没有进行比较过的情况存在,
若该未比较过的元素最大,
则此次排序最大的元素一定不会成功。
所以基于比较的排序算法在最好情况下至少需要(n-1)次比较才能把一个n个数字的序列排好。
四、 证明最坏情况下,归并算法至少需要比较的次数
合并算法本质思想是分治算法
核心是:将两个有序的子序列合并的过程。
Worst最坏情况下,每比较一次,只确定一个元素的位置,
直到最后一次比较确定两个元素的位置,
即归并算法至少需要比较(n1+n2-1)次
五、 证明一个有n个数字的堆中,高度为h的最多结点数
(堆的性质)
六、 证明一个有n个数字的堆的左子树最多含有的结点数
(堆的性质)
七、 设计一个贪心算法,实现一个O(n)算法找到最佳邮局位置
复杂度为O(n)
八、 设计一个复杂度为O(n+m)的贪心算法,实现|A[i]-B[j]|min问题
这一题没有思路,主要问题是复杂度为O(n+m),设计的复杂度好像是O(n^2),不满足题意
九、 完成快速选择Quick-Select(A[1,,n],n,i)的平均复杂度的分析
对比快速排序和选择排序算法,使得快速选择的复杂度由O(n^2)-->O(n)。