1. 问题介绍
关于临界楼层查找问题的最优查找策略,我已经在上一篇博客摔玻璃球(鸡蛋)查找临界楼层中做了详细讲解,本文将继续研究相关问题。
假如题目不要求给出具体的最优查找策略,只问最坏情况下至少需要多少次查找,那么该如何求解呢?LeetCode887题:鸡蛋掉落也提出了相同的问题。
2. 方法研究
为叙述方便,定义如下变量或函数:玻璃球个数 N N N,玻璃球摔碎个数 N b N_b Nb,查找楼层数 F F F,临界楼层 F c F_c Fc,最大查找次数 T T T, N N N和 T T T确定时可查找的最大楼层数 F M a x F_{Max} FMax, F M a x F_{Max} FMax与 N N N和 T T T的函数关系 f f f( N N N, T T T),查找路径 P P P。
最坏情况下的查找次数即为最大查找次数 T T T,在摔玻璃球(鸡蛋)查找临界楼层中, T T T为二叉查找树的深度,假如构造出二叉查找树即可求出 T T T的值。但如果不构造二叉查找树能不能求 T T T的值呢?
2.1 动态规划法
根据定义, N N N, F F F和 T T T满足如下关系: f f f( N N N, T T T- 1 1 1)< F F F≤ f f f( N N N, T T T),假如能推导出 f f f( N N N, T T T)的公式,然后将 T T T=1, 2, 3, … 依次代入关系式中,使关系式成立的 T T T即为所求。
按照动态规划思想推导 f f f( N N N, T T T)函数的递推公式:
- 当 N N N= 1 1 1时,只能从第1层开始向上逐层查找,因此有几次查找机会,最多就能查找几个楼层,即 f f f( 1 1 1, T T T)= T T T;
- 当 T T T= 1 1 1时,不管有几个玻璃球,只有1次查找机会时,最多只能查找1个楼层,即 f f f( N N N, 1 1 1)= 1 1 1;
- 当 N N N> 1 1 1, T T T> 1 1 1时,第1个玻璃球在某层查找,若摔碎,则用第2个玻璃球查找该层下方楼层,最多可查 f f f( N N N- 1 1 1, T T T- 1 1 1)个楼层,若没碎,则继续查找该层上方楼层,最多可查 f f f( N N N, T T T- 1 1 1)个楼层,一共最多可查楼层数为下方楼层加上方楼层再加当前所在层: f f f( N N N, T T T)= f f f( N N N- 1 1 1, T T T- 1 1 1)+ f f f( N N N, T T T- 1 1 1)+ 1 1 1。同理可继续拆分 f f f( N N N- 1 1 1, T T T- 1 1 1)和 f f f( N N N, T T T- 1 1 1),直到 N N N= 1 1 1或 T T T= 1 1 1,即可求得 f f f( N N N, T T T)的值。
综上, f f f( N N N, T T T)的递推公式为:
f ( N , T ) = f ( N − 1 , T − 1 ) + f ( N , T − 1 ) + 1 f(N,T)=f(N-1,T-1)+f(N,T-1)+1 f(N,T)=f(N−1,T−1)+f(N,T−1)+1 ( N ≥ 2 , T ≥ 2 ) (N≥2, T≥2) (N≥2,T≥2)
初始条件为:
f ( 1 , T ) = T , f(1,T)=T, f(1,T)=T, f ( N , 1 ) = 1 f(N,1)=1 f(N,1)=1 ( N = 1 (N=1 (N=1 或 T = 1 ) T=1) T=1)
根据 f ( N , T ) f(N,T) f(N,T)递推公式计算可得 N N N, T T T与 F M a x F_{Max} FMax的数值对照表,如表1所示。已知 N N N和 F F F,查表可得最大查找次数 T T T。
表1. N N N, T T T, F M a x F_{Max} FMax数值对照表
N / T N/T N/T | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | … | 99 | 100 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | … | 99 | 100 |
2 | 1 | 3 | 6 | 10 | 15 | 21 | 28 | 36 | 45 | 55 | 66 | 78 | 91 | 105 | … | 4950 | 5050 |
3 | 1 | 3 | 7 | 14 | 25 | 41 | 63 | 92 | 129 | 175 | 231 | 298 | 377 | 469 | … | … | … |
4 | 1 | 3 | 7 | 15 | 30 | 56 | 98 | 162 | 255 | 385 | 561 | 793 | 1092 | 1470 | … | … | … |
5 | 1 | 3 | 7 | 15 | 31 | 62 | 119 | 218 | 381 | 637 | 1023 | 1585 | 2379 | 3472 | … | … | … |
6 | 1 | 3 | 7 | 15 | 31 | 63 | 126 | 246 | 465 | 847 | 1485 | 2509 | 4095 | 6475 | … | … | … |
7 | 1 | 3 | 7 | 15 | 31 | 63 | 127 | 254 | 501 | 967 | 1815 | 3301 | 5811 | 9907 | … | … | … |
8 | 1 | 3 | 7 | 15 | 31 | 63 | 127 | 255 | 510 | 1012 | 1980 | 3796 | 7098 | 12910 | … | … | … |
9 | 1 | 3 | 7 | 15 | 31 | 63 | 127 | 255 | 511 | 1022 | 2035 | 4016 | 7813 | 14912 | … | … | … |
根据表1分别绘制 N N N取不同值(1, 2, 3, 4, 5, + ∞ ∞ ∞)时的 F M a x F_{Max} FMax- T T T函数图像,其中 T T T=1, 2, 3, …, 50,如图1所示。当 N N N=+ ∞ ∞ ∞时, F M a x F_{Max} FMax= 2 T 2^T 2T- 1 1 1。
图1. F M a x F_{Max} FMax- T T T函数图像
2.2 数学法
利用 f f f( N N N, T T T)的递推公式计算 F M a x F_{Max} FMax的值需要递归计算若干子问题的解,这样未免太过繁琐,如果能推导出 f f f( N N N, T T T)的通项公式,然后将 N N N和 T T T代入公式直接求出 F M a x F_{Max} FMax,就会极大地减少计算量。
2.2.1 f(N, T)的前T项和与组合数公式
因为 N N N表示玻璃球数量, T T T表示最大查找次数,所以 N N N和 T T T均为正整数。
- 当 N N N≥ 2 2 2, T T T≥ 2 2 2时:
设 f ( N , T ) f(N,T) f(N,T)的前 T T T项和为 s ( N , T ) s(N,T) s(N,T),则有
f ( N , T ) = f ( N − 1 , T − 1 ) + f ( N , T − 1 ) + 1 f(N,T)=f(N-1,T-1)+f(N,T-1)+1 f(N,T)=