WalzoneInterview Prep
📞 Interviewing soon? Practice with a realistic AI mock phone interview — it calls you, then scores you. First 15 min FREE →

Dynamic Programming · Expert · question 61 of 100

Implement the solution to the Optimal File Merge Patterns problem using dynamic programming.?

📕 Buy this interview preparation book: 100 Dynamic Programming questions & answers — PDF + EPUB for $5

The Optimal File Merge Patterns problem involves finding the minimum cost to merge multiple files of different sizes into a single file. Given n files of sizes s1, s2, ..., sn, the cost to merge any two files i and j is si + sj. The problem is to find the minimum cost to merge all the files.

Dynamic programming can be used to solve this problem efficiently. We can define a table M where M[i][j] represents the minimum cost to merge files from i to j. The base case is when i=j, in which case the minimum cost is 0. For all other cases, the minimum cost can be computed recursively:

M[i][j] = min(M[i][k] + M[k+1][j] + sum(s[i..j])) for i <= k < j

Here, ‘sum(s[i..j])‘ represents the sum of sizes of all files from i to j.

In the above recursive formula, we try all possible ways to divide the files from i to j into two groups (i to k and k+1 to j), and compute the cost of merging each group separately and then merging the two resulting groups. We take the minimum of all such costs as the optimal cost.

The time complexity of this algorithm is O(n3) and the space complexity is also O(n2).

Here’s the Java code for implementing this algorithm using dynamic programming:

public static int optimalMerge(int[] sizes) {
    int n = sizes.length;
    int[][] M = new int[n][n];

    // base case
    for (int i = 0; i < n; i++) {
        M[i][i] = 0;
    }

    // fill the table diagonally
    for (int len = 2; len <= n; len++) {
        for (int i = 0; i <= n - len; i++) {
            int j = i + len - 1;
            int minCost = Integer.MAX_VALUE;

            // try all possible ways to divide the files into two groups
            for (int k = i; k < j; k++) {
                int cost = M[i][k] + M[k+1][j] + sum(sizes, i, j);
                minCost = Math.min(minCost, cost);
            }

            M[i][j] = minCost;
        }
    }

    return M[0][n-1];
}

private static int sum(int[] sizes, int i, int j) {
    int sum = 0;
    for (int k = i; k <= j; k++) {
        sum += sizes[k];
    }
    return sum;
}

Here’s an example of how to use this function:

int[] sizes = {2, 3, 4, 5, 6};
int cost = optimalMerge(sizes);
System.out.println(cost); // expected output: 58

In this example, we have 5 files of sizes 2, 3, 4, 5, and 6. The minimum cost to merge them is 58, which can be achieved by merging files 1 and 2, then files 3 and 4, and finally merging the resulting two groups of files.

Reading is step one. Saying it out loud is the interview. Our AI interviewer calls your phone and runs a realistic Dynamic Programming interview — then scores it.
📞 Practice Dynamic Programming — free 15 min
📕 Buy this interview preparation book: 100 Dynamic Programming questions & answers — PDF + EPUB for $5

All 100 Dynamic Programming questions · All topics