Knowledge Guide
HomeConcurrencyConcurrency Problems

Problem 4 MinMaxSum

Overview

Finding the minimum, maximum, and sum of elements in an array can be parallelized efficiently using multithreading. Each thread is given a portion of the array to process and returns partial results, which are then combined to get the final result.

Multithreading in Min/Max/Sum Finding

  1. Divide the Work: As before, split the array into chunks for each thread.
  2. Concurrent Execution: Threads will independently compute the min, max, and sum for their assigned chunks.
  3. Combine Results: After all threads finish execution, combine their results to obtain the global min, max, and sum.
  4. Synchronization: Utilize synchronization mechanisms to ensure thread-safe access to shared variables if necessary.

Pseudocode

FUNCTION ThreadedMin(data: ARRAY of INTEGER, number_of_threads: INTEGER) -> INTEGER SPLIT data into number_of_threads parts FOR EACH part START a thread that finds the MINIMUM of the part and saves it JOIN all threads RETURN the MINIMUM of all thread results END FUNCTION FUNCTION ThreadedMax(data: ARRAY of INTEGER, number_of_threads: INTEGER) -> INTEGER SPLIT data into number_of_threads parts FOR EACH part START a thread that finds the MAXIMUM of the part and saves it JOIN all threads RETURN the MAXIMUM of all thread results END FUNCTION FUNCTION ThreadedSum(data: ARRAY of INTEGER, number_of_threads: INTEGER) -> INTEGER SPLIT data into number_of_threads parts FOR EACH part START a thread that finds the SUM of the part and saves it JOIN all threads RETURN the SUM of all thread results END FUNCTION

Algorithm Walkthrough

Input:

1. ThreadedMin Function:

Step 1: Split data into 2 parts:

Step 2: Start 2 threads:

Step 3: Join all threads.

Step 4: Return the minimum of thread results:

Thus, ThreadedMin(data, 2) returns 1.

2. ThreadedMax Function:

Step 1: Split data into 2 parts:

Step 2: Start 2 threads:

Step 3: Join all threads.

Step 4: Return the maximum of thread results:

Thus, ThreadedMax(data, 2) returns 10.

3. ThreadedSum Function:

Step 1: Split data into 2 parts:

Step 2: Start 2 threads:

Step 3: Join all threads.

Step 4: Return the sum of thread results:

Thus, ThreadedSum(data, 2) returns 55.

The main idea behind these functions is to split the data into smaller chunks, process each chunk in parallel using multiple threads, and then aggregate the results. The use of threads speeds up the computations for large datasets by taking advantage of parallel processing capabilities.

Image
Image
Image
Image
Image
Image
Image
Image
Image
Image
java
import java.util.Random;

public class Solution {

  private static final int DATA_SIZE = 100;
  private static final int NUMBER_OF_THREADS = 4;

  private static int[] data = new int[DATA_SIZE];
  private static int[] threadResultsSum = new int[NUMBER_OF_THREADS];
  private static int[] threadResultsMin = new int[NUMBER_OF_THREADS];
  private static int[] threadResultsMax = new int[NUMBER_OF_THREADS];

  public static void main(String[] args) throws InterruptedException {
    // Initialize data array
    Random random = new Random();
    for (int i = 0; i < DATA_SIZE; i++) {
      data[i] = random.nextInt(500);
    }

    Thread[] threads = new Thread[NUMBER_OF_THREADS * 3];

    // Start threads for sum, min, and max calculations
    for (int i = 0; i < NUMBER_OF_THREADS; i++) {
      final int threadId = i;
      final int start = threadId * (DATA_SIZE / NUMBER_OF_THREADS);
      final int end = (threadId + 1) * (DATA_SIZE / NUMBER_OF_THREADS);

      threads[threadId] = new Thread(() -> threadedSum(threadId, start, end));
      threads[threadId + NUMBER_OF_THREADS] = new Thread(() ->
        threadedMin(threadId, start, end)
      );
      threads[threadId + NUMBER_OF_THREADS * 2] = new Thread(() ->
        threadedMax(threadId, start, end)
      );

      threads[threadId].start();
      threads[threadId + NUMBER_OF_THREADS].start();
      threads[threadId + NUMBER_OF_THREADS * 2].start();
    }

    // Wait for threads to finish
    for (Thread thread : threads) {
      thread.join();
    }

    // Aggregate results from threads
    int totalSum = 0;
    for (int sum : threadResultsSum) {
      totalSum += sum;
    }

    int min = Integer.MAX_VALUE;
    for (int minResult : threadResultsMin) {
      min = Math.min(min, minResult);
    }

    int max = Integer.MIN_VALUE;
    for (int maxResult : threadResultsMax) {
      max = Math.max(max, maxResult);
    }

    System.out.println("Sum is " + totalSum);
    System.out.println("Min is " + min);
    System.out.println("Max is " + max);
  }

  private static void threadedSum(int threadId, int start, int end) {
    int sum = 0;
    for (int i = start; i < end; i++) {
      sum += data[i];
    }
    threadResultsSum[threadId] = sum;
  }

  private static void threadedMin(int threadId, int start, int end) {
    int min = Integer.MAX_VALUE;
    for (int i = start; i < end; i++) {
      min = Math.min(min, data[i]);
    }
    threadResultsMin[threadId] = min;
  }

  private static void threadedMax(int threadId, int start, int end) {
    int max = Integer.MIN_VALUE;
    for (int i = start; i < end; i++) {
      max = Math.max(max, data[i]);
    }
    threadResultsMax[threadId] = max;
  }
}
🤖 Don't fully get this? Learn it with Claude

Stuck on Problem 4 MinMaxSum? Open Claude, copy a block below, and it'll teach you this exact concept — visually and interactively.

🪜 Hint ladder (no spoilers)

Progressively stronger hints — you still solve it.

I'm working on the problem **Problem 4 MinMaxSum** (Concurrency). Give me a HINT LADDER: start with the tiniest nudge, then wait. Only reveal the next, stronger hint when I ask. Do NOT show the full solution unless I type 'show solution'. Keep me doing the thinking. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
🎨 Explain the approach visually

See the technique, not just code.

Explain the optimal approach to **Problem 4 MinMaxSum** with a VISUAL walkthrough: trace it on a small concrete example using ASCII art / a step-by-step diagram, narrate what changes each step, then give time & space complexity with a one-line derivation. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
🔍 Review my solution

Catch bugs, edge cases, sub-optimality.

I'll paste my solution to **Problem 4 MinMaxSum**. Review it for correctness, missed edge cases, and time/space complexity, then coach me toward the optimal — don't just rewrite it. Ask me to paste my code now. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
🔁 Drill the pattern

Lock in recognition with look-alikes.

Give me 2 problems that use the SAME underlying pattern as **Problem 4 MinMaxSum**. For each, let me attempt first, then review my answer and name the trigger signal that reveals the pattern. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.

📝 My notes