AW Dev Rethought

βœ‚οΈ Perfection is achieved not when there is nothing more to add, but when there is nothing left to take away - Antoine de Saint-ExupΓ©ry

🧩 Python DSA Patterns β€” Greedy Technique Intro πŸ”‘πŸ


Description:

The Greedy technique builds a solution step by step, always choosing the locally optimal choice at each step.

If the problem satisfies the greedy-choice property and optimal substructure, this approach often leads to the global optimum.


✨ When to Use

  • Problem can be solved by making a sequence of choices.
  • Each choice depends only on the current state, not future consequences.
  • The problem shows optimal substructure (optimal solution can be built from optimal subproblems).

⚑ Advantages

  • Usually faster and simpler than DP.
  • Efficient for many optimization problems.
  • Requires less memory (no large DP tables).

❗ Limitations

  • Greedy doesn’t always guarantee the correct global optimum.
  • Must verify the problem satisfies greedy-choice property.

πŸ“ Example 1 β€” Activity Selection Problem

Select the maximum number of non-overlapping activities given start & end times.

def activity_selection(activities):
    # activities: list of (start, end) times
    # sort by end time
    activities.sort(key=lambda x: x[1])
    result = []
    last_end = 0

    for start, end in activities:
        if start >= last_end:
            result.append((start, end))
            last_end = end
    return result

print(activity_selection([(1,3),(2,4),(3,5),(0,6),(5,7),(8,9)]))
# Output: [(1,3),(3,5),(5,7),(8,9)]

πŸ“ Example 2 β€” Coin Change (Minimum Coins)

Given coin denominations, make change for an amount with the fewest coins (works when greedy is optimal, e.g., standard currencies).

def coin_change(coins, amount):
    coins.sort(reverse=True)  # pick largest first
    result = []
    for coin in coins:
        while amount >= coin:
            amount -= coin
            result.append(coin)
    return result

print(coin_change([1,2,5,10], 27))
# Output: [10, 10, 5, 2]

πŸ“ Example 3 β€” Huffman Coding (Conceptual)

Greedy is used to build optimal prefix codes by repeatedly combining the lowest-frequency nodes.

(Usually implemented with a min-heap β€” beyond basics, but shows greedy’s reach).


βœ… Key Takeaways

  • Greedy = choose the best option available at each step.
  • Works only when local choices β†’ global optimum.
  • Common in scheduling, interval problems, minimum spanning trees, Huffman coding, coin change.

πŸ‹οΈ Practice Problems

  1. Activity Selection (classic scheduling).
  2. Coin Change (minimum coins).
  3. Fractional Knapsack.
  4. Minimum Spanning Tree (Prim’s / Kruskal’s).
  5. Huffman Coding.

Link copied!

Comments

Add Your Comment

Comment Added!