Given a sorted arraykeys[0.. n-1]of search keys and an arrayfreq[0.. n-1]of frequency counts, wherefreq[i]is the number of searches tokeys[i]. Construct a binary search tree of all keys such that the total cost of all the searches is as small as possible.
Let us first define the cost of a BST. The cost of a BST node is level of that node multiplied by its frequency. Level of root is 1.
Example 1
Input: keys[] = {10, 12}, freq[] = {34, 50}
There can be following two possible BSTs
10 12
\ /
12 10
I II
Frequency of searches of 10 and 12 are 34 and 50 respectively.
The cost of tree I is 34*1 + 50*2 = 134
The cost of tree II is 50*1 + 34*2 = 118
Example 2
Input: keys[] = {10, 12, 20}, freq[] = {34, 8, 50}
There can be following possible BSTs
10 12 20 10 20
\ / \ / \ /
12 10 20 12 20 10
\ / / \
20 10 12 12
I II III IV V
Among all possible BSTs, cost of the fifth BST is minimum.
Cost of the fifth BST is 1*50 + 2*34 + 3*8 = 142
1) Optimal Substructure:
The optimal cost for freq[i..j] can be recursively calculated using following formula.![]()
We need to calculateoptCost(0, n-1)to find the result.
The idea of above formula is simple, we one by one try all nodes as root (r varies from i to j in second term). When we makerthnode as root, we recursively calculate optimal cost from i to r-1 and r+1 to j.
We add sum of frequencies from i to j (see first term in the above formula), this is added because every search will go through root and one comparison will be done for every search.
http://www.geeksforgeeks.org/dynamic-programming-set-24-optimal-binary-search-tree/
本文介绍了一种使用动态规划构建最优二叉搜索树的方法,旨在最小化总搜索成本。通过递归公式和预计算频率总和的方式,将时间复杂度优化至O(n^3)。
1266

被折叠的 条评论
为什么被折叠?



