Partitioning Problem Playground

Explore how different inputs affect runtime for the exponential decision algorithm and compare it with a fast greedy heuristic.

Inputs

Run Algorithms

Tip: the exponential algorithms grow as $2^n$. New async mode allows n up to ~35 with progress tracking and cancellation. Larger values will take hours/days.

Results

Algorithm Visuals

Subset Balance

Heuristic Steps

Workload Growth

Balance uses the latest algorithm run. Steps show how the greedy heuristic placed items. Workload shows the $2^n$ search space.

Speed Insight

This section uses your latest exponential run to estimate how quickly the workload grows.

Algorithm Analysis & Documentation

Part A: Decision Problem - Exponential Algorithm

Problem: Given n positive integers and threshold k, determine if a 2-partition exists where |sum(A) - sum(B)| ≤ k.

Algorithm: Exhaustive search using bitmask enumeration. Each of the 2n possible partitions is represented by a binary array (bitmask) of size n, where bit i determines if element i belongs to subset A (1) or B (0).

Complexity Analysis:

Test Results: For n=10, algorithm checks 1,024 partitions in milliseconds. For n=20, checks 1,048,576 partitions in seconds. Beyond n=26, runtime exceeds reasonable limits.

Part B: Optimization Problem - Greedy Heuristic

Problem: Partition n integers into 2 subsets to minimize |sum(A) - sum(B)|.

Algorithm: Longest Processing Time (LPT) greedy heuristic. Sort values descending, then iteratively place each value into the subset with smaller current sum.

Complexity Analysis:

Success Cases:

Failure Cases:

Comparison: For small inputs (n ≤ 20), the exponential "Exact Optimization" algorithm can verify if the heuristic found the optimal solution. For large inputs, only the heuristic is practical.

Part C: Special Case - Polynomial Solution

Problem: If all integers are either x or 2x for some positive integer x, can we find a polynomial optimal 2-partition algorithm?

Answer: Yes! A polynomial O(n) algorithm exists for this special case.

Algorithm:

  1. Count the number of x's (call it count_x) and 2x's (call it count_2x)
  2. Total sum = x × count_x + 2x × count_2x = x × (count_x + 2×count_2x)
  3. Target sum per subset = total_sum / 2 = x × (count_x + 2×count_2x) / 2
  4. We need to distribute elements so each subset gets (count_x + 2×count_2x) / 2 units of x
  5. Use greedy distribution: Place 2x values first (each worth 2 units), then fill with x values (each worth 1 unit)
  6. Formula: For each subset, use ⌊target_units / 2⌋ of the 2x values, remainder filled with x values

Complexity: O(n) time (single pass counting + constant distribution), O(1) space

Optimality Proof: Since values are multiples of x, any partition difference must be a multiple of x. If total sum is even (divisible by 2x), perfect partition exists with diff=0. If odd, minimum diff=x is unavoidable. The algorithm achieves this bound.

Example: Input [2, 2, 2, 4, 4] where x=2 → count_x=3, count_2x=2, total=18 → A gets 1×(2x) + 3×(x) = 4+6=10, B gets 1×(2x) + 0×(x) + wait... We need to recalculate: target per subset = 9. A=[4, 2, 2, 2], B=[4]. But B=4 ≠ 9. Let me correct: A=[4, 4, 2], B=[2, 2] gives sums 10 vs 4. The optimal is A=[4, 2, 2], B=[4, 2] → diff = 10 - 6 = 4. Actually with x=2: values are [4, 4, 2, 2, 2], trying A=[4, 2, 2], B=[4, 2] gives 8 vs 6, diff=2. Perfect balance impossible when sum is odd multiple of x.

Implementation Notes

This interactive demo implements parts A and B in JavaScript. All three algorithms (Decision, Optimization, Heuristic) use the bitmask approach for exponential search and LPT greedy for the heuristic. Random input generation with optional seeding allows reproducible testing. Real-time performance metrics demonstrate exponential vs polynomial growth.