...

/

Amortized Analysis of Spreading and Gathering

Amortized Analysis of Spreading and Gathering

Learn about the analysis of gather and spread methods.

We'll cover the following...

Next, we consider the cost of the _gather(u) and _spread(u) methods that may be executed by the add(i, x) and remove(i) methods. For the sake of completeness, here they are:

Press + to interact
class SEList(BaseList):
class BDeque(ArrayDeque):
"""A bounded-size deque"""
def __init__(self, b):
super(SEList.BDeque, self).__init__()
self.a = new_array(b+1)
def _resize(self):
pass
class Node(object):
def __init__(self, b):
self.d = SEList.BDeque(b)
self.prev = None
self.next = None
def __init__(self, b):
super(SEList, self).__init__()
self.b = b
self._initialize()
def _spread(self, u):
w = u
for j in range(self.b):
w = w.next
w = self._add_before(w)
while w is not u:
while w.d.size() < self.b:
w.d.add_first(w.prev.d.remove_last())
w = w.prev

The implementation of the _gather() method is:

Press + to interact
class SEList(BaseList):
class BDeque(ArrayDeque):
"""A bounded-size deque"""
def __init__(self, b):
super(SEList.BDeque, self).__init__()
self.a = new_array(b+1)
def _resize(self):
pass
class Node(object):
def __init__(self, b):
self.d = SEList.BDeque(b)
self.prev = None
self.next = None
def __init__(self, b):
super(SEList, self).__init__()
self.b = b
self._initialize()
def _gather(self, u):
w = u
for j in range(self.b-1):
while w.d.size() < self.b:
w.d.add_last(w.next.d.remove_first())
w = w.next
self._remove_node(w)

Amortization

The running time of each of these methods is dominated by the two nested loops. Both the inner and outer loops execute at most b+1b + 1 times, so the total running time of each of these methods is O((b+1)2)=O(b2)O((b + 1)^2) = O(b^2). However, the following lemma shows that these methods execute on at most one out of every bb calls to add(i, x) or remove(i).

Lemma: If an empty SEList is created and any sequence of m1m \ge 1 calls to add(i, x) and remove(i) is performed, then the total time spent during all calls to_ _spread() and _gather() is O(bm)O(bm).

Proof: We will use the potential method of amortized analysis. We say that a node u is fragile if u’s block does not contain bb elements (so that u is either the last node, or contains ...