Unlike dynamic programming, a greedy algorithm may fail to find the optimal solution, though it usually finds a pretty good one, and runs much faster than an algorithm using dynamic programming.
A greedy solution: recursively find the activity with the earliest finish time, and add it into the schedule.
In the following algorithm, array s and f represents the start and finish time of the activities, and they are sorted in monotonically increasingly order of finish time:
Beside the two arrays, the algorithm also takes indexes k and n as input, indicate the range of activities to be considered. Initially, it is called as Recursively-Activity-Selector(s, f, 0, n).
The recursive algorithm can be converted into a more efficient iterative algorithm:
Both algorithms take Θ(n) time.
In the following example, the variable-length codeword has an average of 2.24 bits:
Assuming binary prefix coding, a solution can be represented by a binary tree, with each leaf corresponds to an unit, and its path from root represents the code for the unit. An optimal code is a binary tree with the minimum expected path length.
In the following algorithm, C contains a set of units, and Q is a priority queue containing binary trees prioritied by the frequency of their roots.
Procedure HUFFMAN produces an optimal prefix code. Example:
Best-First Search: If the next step is selected at the neighborhood of all explored points, "hill climbing" becomes "best-first search". As the selection is based on a heuristic function, it is also called heuristic search. [Reference 1 Reference 2]
Anytime Algorithm: Such an algorithm optimizes the quality of its solution over time, and can stop at anytime with a best-so-far solution. It is greedy in the sense that each solution is usually produced from local consideration only. An anytime algorithm no longer has a determined solution and running time for a given problem instance. [Reference 1 Reference 2]