Pointer Reversal
Suppose we write depth-first search in mark and sweep using a stack
What is the maximal stack size?
How can we represent the stack?
- same stack we use for procedures
- explicit stack data structure on the heap
- pointer reversal: store information within nodes
Explicit Stack
function DFS(x)
if (x is a pointer and record x is not marked) {
mark(x)
t = 1
stack(t) = x
while (t > 0) {
x = stack(t)
t = t - 1
for each field f_i of record x
if (x.f_i is a pointer and x.f_i is not marked) {
mark(x.f_i)
t = t + 1
stack(t) = x.f_i
}
}
}
Deutsch-Shorr-Waite algorithm
A 'done' field keeps track which fields we have traversed in a node
Simpler version:
- add an extra “parent” field to each node
- use it instead of stack pop to go back to the node
Avoiding the parent field:
- store parent in the field that we are following
- indeed, they are inverse of the other, so one is redundant
- when going back, restore the field
function DFS(x)
if (x is a pointer and record x is not marked) {
t = nil
mark(x)
x.done = 0
while (true) {
// t - parent node
// x - current node
// y - node we descend into
i = x.done
if (i < numberOfFields(xType)) {
y = x.f_i
if (y is a pointer and record y is not marked) {
x.f_i = t
t = x
x = y
mark(x)
x.done = 0
} else {
x.done = i + 1
}
} else {
y = x
x = t
if (x = nil) return
i = x.done
t = x.f_i
x.f_i = y
x.done = i + 1
}
}
}