예제 #1
0
    def test_min(self):
        mh = MinHeap()
        with self.assertRaises(IndexError):
            mh.min()

        mh.append(1)
        self.assertEqual(1, mh.min())
        self.assertEqual(1, mh.min())

        mh.append(1)
        self.assertEqual(1, mh.min())

        mh.pop()
        self.assertEqual(1, mh.min())

        mh.pop()
        with self.assertRaises(IndexError):
            mh.min()

        mh.append(3)
        self.assertEqual(3, mh.min())

        mh.append(1)
        self.assertEqual(1, mh.min())

        mh.pop()
        self.assertEqual(3, mh.min())
예제 #2
0
class Median:
    def __init__(self):
        self.h_low = MaxHeap()
        self.h_high = MinHeap()

    def add_element(self, value):
        if self.h_low.heap_size == 0 or value < self.h_low.max():
            self.h_low.insert(value)
            if self.h_low.heap_size - self.h_high.heap_size > 1:
                self.h_high.insert(self.h_low.extract_max())
        else:
            self.h_high.insert(value)
            if self.h_high.heap_size - self.h_low.heap_size > 1:
                self.h_low.insert(self.h_high.extract_min())

    def get_median(self):
        if (self.h_low.heap_size + self.h_high.heap_size) % 2 == 0:
            return self.h_low.max(), self.h_high.min()
        else:
            if self.h_low.heap_size > self.h_high.heap_size:
                return self.h_low.max()
            else:
                return self.h_high.min()

    def get_maxheap_elements(self):
        return self.h_low.heap

    def get_minheap_elements(self):
        return self.h_high.heap
예제 #3
0
def dijkstra(graph, root):
    vertices = graph.keys()
    n = len(vertices)

    # Initialize the priority queue
    inf = float("inf")
    pq = MinHeap([(v, inf) for v in graph.keys()]) 
    pq.change_priority(root, 0)
    # Other initializations
    parent = collections.defaultdict(lambda: None)
    selected = set()
    cost = collections.defaultdict(lambda: inf)
    cost[root] = 0

    while len(selected) < n:
        u = pq.min()
        du = cost[u] = pq.get_priority(u)
        selected.add(u)
        pq.take_min()
        for (v, w) in graph[u].items():
            if v not in selected and pq.get_priority(v) > du + w:
                pq.change_priority(v, du + w)
                parent[v] = u
    
    return cost, parent
예제 #4
0
def dijkstra(graph, root):
    vertices = graph.keys()
    n = len(vertices)

    # Initialize the priority queue
    inf = float("inf")
    pq = MinHeap([(v, inf) for v in graph.keys()])
    pq.change_priority(root, 0)
    # Other initializations
    parent = collections.defaultdict(lambda: None)
    selected = set()
    cost = collections.defaultdict(lambda: inf)
    cost[root] = 0

    while len(selected) < n:
        u = pq.min()
        du = cost[u] = pq.get_priority(u)
        selected.add(u)
        pq.take_min()
        for (v, w) in graph[u].items():
            if v not in selected and pq.get_priority(v) > du + w:
                pq.change_priority(v, du + w)
                parent[v] = u

    return cost, parent