mirror of https://github.com/FFmpeg/FFmpeg.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
2.7 KiB
109 lines
2.7 KiB
This is a quick description of the viterbi aka dynamic programing |
|
algorthm. |
|
|
|
Its reason for existence is that wikipedia has become very poor on |
|
describing algorithms in a way that makes it useable for understanding |
|
them or anything else actually. It tends now to describe the very same |
|
algorithm under 50 different names and pages with few understandable |
|
by even people who fully understand the algorithm and the theory behind. |
|
|
|
Problem description: (that is what it can solve) |
|
assume we have a 2d table, or you could call it a graph or matrix if you |
|
prefer |
|
|
|
O O O O O O O |
|
|
|
O O O O O O O |
|
|
|
O O O O O O O |
|
|
|
O O O O O O O |
|
|
|
|
|
That table has edges connecting points from each column to the next column |
|
and each edge has a score like: (only some edge and scores shown to keep it |
|
readable) |
|
|
|
|
|
O--5--O-----O-----O-----O-----O |
|
2 / 7 / \ / \ / \ / |
|
\ / \ / \ / \ / \ / |
|
O7-/--O--/--O--/--O--/--O--/--O |
|
\/ \/ 1/ \/ \/ \/ \/ \/ \/ \/ |
|
/\ /\ 2\ /\ /\ /\ /\ /\ /\ /\ |
|
O3-/--O--/--O--/--O--/--O--/--O |
|
/ \ / \ / \ / \ / \ |
|
1 \ 9 \ / \ / \ / \ |
|
O--2--O--1--O--5--O--3--O--8--O |
|
|
|
|
|
|
|
Our goal is to find a path from left to right through it which |
|
minimizes the sum of the score of all edges. |
|
(and of course left/right is just a convention here it could be top down too) |
|
Similarly the minimum could be the maximum by just fliping the sign, |
|
Example of a path with scores: |
|
|
|
O O O O O O O |
|
|
|
>---O. O O .O-2-O O O |
|
5. .7 . |
|
O O-1-O O O 8 O O |
|
. |
|
O O O O O O-1-O---> (sum here is 24) |
|
|
|
|
|
The viterbi algorthm now solves this simply column by column |
|
For the previous column each point has a best path and a associated |
|
score: |
|
|
|
O-----5 O |
|
\ |
|
\ |
|
O \ 1 O |
|
\/ |
|
/\ |
|
O / 2 O |
|
/ |
|
/ |
|
O-----2 O |
|
|
|
|
|
To move one column forward we just need to find the best path and associated |
|
scores for the next column |
|
here are some edges we could choose from: |
|
|
|
|
|
O-----5--3--O |
|
\ \8 |
|
\ \ |
|
O \ 1--9--O |
|
\/ \3 |
|
/\ \ |
|
O / 2--1--O |
|
/ \2 |
|
/ \ |
|
O-----2--4--O |
|
|
|
Finding the new best paths and scores for each point of our new column is |
|
trivial given we know the previous column best paths and scores: |
|
|
|
O-----0-----8 |
|
\ |
|
\ |
|
O \ 0----10 |
|
\/ |
|
/\ |
|
O / 0-----3 |
|
/ \ |
|
/ \ |
|
O 0 4 |
|
|
|
|
|
the viterbi algorthm continues exactly like this column for column until the |
|
end and then just picks the path with the best score (above that would be the |
|
one with score 3) |
|
|
|
|
|
Author: Michael niedermayer |
|
Copyright LGPL
|
|
|