比方说,我有n个方框,每个方框内有一些值b[i]
。我可以保证将一组数组排序为b[1] <= b[2] <= ... <= b[n]
。我还可以保证有一个元素b[i] = x
,并且我想找到x
所在的框。要注意的是,打开每个框b[i]
都需要花费c[i]
问题是如何最大程度地减少寻找x
的总费用?我的直观方法是对b[i]
进行二进制搜索。这减少了操作的总数(因为我得到了O(logn)比较),但是我无法确切地看到这将如何使总成本最小化。
很显然,仅选择最便宜的盒子并继续操作是行不通的,因为在最坏的情况下,我会打开每个盒子。关于如何改善这一点或如何证明自己的方法是最优/非最优的任何想法?
答案 0 :(得分:0)
使用动态编程来找到最佳决策树。令T(i, j)
为搜索位置i..j
的最坏情况的代价。然后
T(i, j) = { 0, if i > j;
{ min_{k=i}^j (c[k] + max(T(i, k-1), T(k+1, j))), otherwise.
记住每个间隔的最佳选择k
。
运行时间为O(n^3)
,使用Knuth的optimal BST技巧可将其减少到O(n^2)
。