题目1:给你一堆螺母和螺栓,每个螺母都有一个相对应的螺栓,但是他们之间的对应关系已经打乱。你可以比较螺母和螺栓的大小关系,但是你无法比较螺母和螺母的大小关系,你也无法比较螺栓和螺栓的大小关系。设计一个算法,找出螺母和螺栓的对应关系。
算法思想:(基于快速排序)
- 挑选一个螺母a。
- 用螺母a将螺栓分成2堆,一堆比其大,一堆比其小。
- 找出与螺母a配对的螺栓b,并用螺栓b将螺母分成2堆。
- 重新选择一个螺母进行以上操作。
算法复杂度分析:(可自行参考快速排序复杂度分析)
平均情况下:,根据主定理
.
最差情况下:所有分裂点都趋于极端,即螺母和螺栓已经为升序。此时
题目2:对玻璃瓶做强度测试,设地面高度为0,从0向上有n个高度,记为1,2,3,4......n,其中任何2个高度之间的距离都相等。如果一个玻璃瓶从高度i落到地上没有摔破,但从高度i+1落到地上摔破了,那么将玻璃瓶的强度记为i。
(1)假设每种玻璃瓶只有一种测试样品,设计算法来测出每种玻璃瓶的强度,以测试次数作为算法最坏情况下的时间复杂度量度,对算法复杂度作出估计。
(2)假设每种玻璃瓶有足够多的相同测试样品,设计算法使用最少的测试次数完成测试,该算法最坏情况下的时间复杂度是多少?
(3)假设每种玻璃瓶只有2个相同的测试样品(k=2),设计次数尽可能少的算法完成测试,你的算法最坏情况下的时间复杂度是多少?
(4)尝试将(3)的方法推广到其他任意给定的k(k>2)的情况,其中k代表测试样品的个数。
解:
(1)顺序从下到上测试,最差情况下测试样品强度为n,共测试n次,即
(2)二分查找。
(3)用分治法的思想,将高度1,2,3.....n,分成组,每组
个,第m组组内高度分别为:
,每组高度为
。
从下到上检查每组最后一个高度,如果玻璃瓶的强度处在第 i 组的高度值中,再依次从下到上检查 i 组内的高度。
时间复杂度。
(4)方法同三,将高度分为组,每组
个,同理 时间复杂度:
。