So, having out iterated through all of our algorithm design paradigms and
noticing that none of them seem to work very well for computing the maximum
weight independent set of a path graph, we're going to develop some ideas for a
new paradigm. And the key approach in this new paradigm
is to first reason about the structure of an optimal solution.
What I mean by this is we're going to seek out statements of the following
form. The optimal solution, whatever it may be,
has to possess a certain form. It has to have been built up from an
optimal solution to a sub-problem in a prescribed way.
So in fact, in much of our discussion of both divide and conquer and greedy
algorithms, this kind of reasoning was implicit.
With dynamic programming, we're going to make it systematic.
For example, implicit in the correctness of many of divide and conquer algorithm
is the fact that an optimal solution to the whole problem has to be expressible,
has to be constructable in a prescribed way from solutions to smaller
sub-problems. So, what's the motivation for doing this
thought experiment, trying to understand what the optimal solution could possibly
look like? Well, the plan is we're going to narrow
the possible candidates for the optimal solution down to a relatively small set
of candidates. With a small set, we can get away with
brute force search to pick the best one. So, one lesson you learn once you get
good at dynamic programming, is that it's not at all circular to reason about the
very object that you're trying to compute.
Remember, the goal here is to devise an algorithm to compute an optimal solution.
And now, I'm telling you to do a thought experiment as if you had already computed
it, as if I had handed it to you on a silver platter.
But that kind of daydreaming can be very productive.
And thinking hey, what if I did have an optimal solution?
What could I say about it? What would it look like?
Observations of that form can actually light up a trail to the computation of
that exact object and we'll see that in the next couple videos.
Alright so that's enough loft, lofty philosophy for now, lets get concrete.
Okay, so we've got this path graph, the vertices have weights.
We want the max weight independent set. Let's again do this thought experiment.
What if someone handed to us, what could we say about it's structure?
We'll be using the following notation when we reason about this maximum weight
independent set. S denotes the vertices in that optimal
solution, in that max weight independent set and we're going to let V sub n denote
the right most, the final vertex of the input graph.
So, here's a content-free statement. This last vertex of the path, V sub n.
Either it's an S or it isn't. So, that's going to give us two cases,
when we reason about the optimal solution.
Let's start with the case where Vn is excluded from the optimal solution
capital S. So, let's let G prime denote the path
graph you get by plucking off Vn, plucking off the right-most vertex from
the original graph G. So, let's make a couple of trivial
observations. So, first of all, this set, capital S,
it's an independent set in G. It doesn't include the last vertex.
So, we can regard this set as equally well as an independent set of the smaller
graph G prime. If it didn't contain consecutive vertices
in G, nor does it in G prime. But actually, we can say more.
Not only is S any old independent set in G prime.
It has to be an optimal, that is, maximum weight independent set in G prime.
Why? Well, if there was something better than
S in G prime, we could take that exact same independent set S star regarded as
an independent set in G and, of course, it would still be better than S in G.
But that contradicts our assumption that S was a max weight independent set in G.
So summarizing, if the max weight independent set S of the original path
graph G does not include the right-most vertex, it can be very simply described
in terms of an optimal solution to a smaller sub-problem.
It literally is a max weight independent set of G prime, the path graph with one
fewer vertex. Alright. So, case one is a warm up for
case two, which is similar but slightly more complicated.
Now, let's assume that the maximum independent S does, in fact, use the
right-most vertex, Vn. Now, by the definition of an independent
set, no two consecutive, no two adjacent
vertices can be chosen. So, by virtue of choosing, choosing V sub
n, the right-most vertex S, in this case, absolutely cannot include the penultimate
vertex V sub n - 1. So, we want to know by G double prime,
the path you get from G by plucking off both of the right-most two vertices.
So now, let's do our best to mimic the argument in case one.
In case one, we said well, S has to also be an independent set of G
prime. Now, here that doesn't make sense, right?
Here, S contains the last vertex so we can't talk about it even being a subset
of any smaller graph. However, if we think about S except for
the last vertex of V sub n, S with Vn removed is an independent set, in fact,
of G double prime, because remember, S can't contain the second to last vertex.
And once again, just like in case one we can say something stronger, S with Vn
removed is not any old independent set of G double prime, it actually must be an
optimal one. It must have maximum possible weight. The
reasoning is similar. Suppose S with Vn removed was not the best possible
independent set in G double prime. Then there's something else called an S
star which is even better, has even bigger weight.
How do we get a contradiction? Well, if we just add Vn to this even
bigger independent set S star that lies in G double prime, we get a bonafide
independent set of the entire graph G with overall weight even bigger than that
of S, but that contradicts the optimality of S.
So, for example you could imagine that this reported optimal solution capital S
had total weight 1,100 in two parts, it had 1,000 weight coming from vertices in
the G double prime, but it also had V sub n which had weight 100 on its own. And so
now, in the contradiction, you say, well, suppose there was an independent set that
had even more than 1,000 weight just in G double prime, say, 1,000 and 50.
Well then, we just add this last vertex V sub n to that, we get an independent set
with weight 1,150 and the original graph G.
But that contradicts the fact that S was supposed to be off more with weight
nearly 1,100. So, notice that the reason were using the
graph G double prime in this argument is to make sure that no matter what S star
is, no matter what this independent set of G
double prime is. We can just add V into it blively and not
worry about feasibility, right?
So, the right-most vertex S star could possibly possess is the third to last
vertex Vn - 2. So, there's no worries about feasibility
when we extend it by adding in the right-most vertex V sub n.
So, to make sure you don't lose the forest for the trees, let me just point,
let me remind you what our high level plan was, and let me point out that we
actually just executed that plan quite successfully in this problem.
The plan was to narrow down the candidates for what the optimal solution
could be. To reason about the form of the optimal
solution and argue that it has to look in a particular way.
What did we just prove on the previous slide?
We said that the optimal solution actually can only be one of two things.
Either it excludes the final vertex and it is nothing more than the max weight
independent set of G prime, or if it includes the right-most vertex than it
must be, a maximum weight independent set frp, G double prime augmented with this
last vertex V sub n. There's only two possibilities for what
the optimal solution could possibly look like, in terms of optimal solutions of
smaller sub problems. So, a corollary of this is that if a
little birdie told us which case we were in, whether or not V sub n, V sub n was
in the optimal solution, we could just complete this by recursing on the
appropriate sub-problem. The little birdie tells us the optimal
solution doesn't have Vn we just recurse on G prime.
If the little birdie tells us v sub n is in the optimal solution, we recurse on G
double prime and then add V sub n to the result.
Now, of course, there is no little birdie and we have no idea whether this
right-most vertex is in the optimal solution or not.
But hey, there is only two possibilities, right?
Here is an idea. Maybe it seems crazy, but why not try
both possibilities and just return whichever one is better?
Why do I suggest that maybe this is crazy? Well, if you stare at this and you
think about it and you think about the ramifications of trying both
possibilities as you recursed down the graph, this may start feeling a little
bit like brute force search. And, in fact it is.
This is just a recursive organization of a brute force search.
Nevertheless, as we'll see in the next video, if we're smart about eliminating
redundancy, we can actually implement this idea in a linear time.