예제 #1
0
def heap_sort2(seq):
    s = list(seq)
    heap = Heap(s)
    res = []
    for _ in range(len(s)):
        res.insert(0, heap.extract_max())
    return res
예제 #2
0
    def __init__(self, elems, cmp=cmp):
        self.cmp = cmp
        self.high = Heap([], cmp)
        self.low = Heap([], lambda x, y: cmp(y, x))

        for el in elems:
            self.insert(el)
예제 #3
0
def prims(graph):
    vertices = graph.keys()
    Q = Heap(len(vertices))
    parent = {}
    src = vertices[0]
    output = []

    for vertex in vertices:
        if vertex == src:
            Q.insert((vertex, 0))
        else:
            Q.insert((vertex, float('inf')))
        parent[vertex] = None

    while not Q.isEmpty():
        u, weight = Q.pop()
        if parent[u] != None:
            output.append([u, parent[u]])
        edges = graph[u]
        for edge in edges:
            v, wt_v = edge
            if v not in Q.minHeap_pos:
                continue
            ind_v = Q.minHeap_pos[v]
            if wt_v < Q.minHeap[ind_v][1]:
                parent[v] = u
                Q.decreaseKey(ind_v, v, wt_v)
    printPath(output)
def viterbi(param, observations, path_num=1):
    assert (isinstance(param, HMMParameter))

    probs, states = {}, {}
    for state in param.statesof(observations[0]):
        probs[state] = [
            param.initial_prob(state) + param.emission(state, observations[0])
        ]
        states[state] = {-len(observations): None}

    for i in range(1, len(observations)):
        for state in param.statesof(observations[i]):
            max_tuple = max([(probs[s][-1] + param.transtion(s, state) +
                              param.emission(state, observations[i]), s)
                             for s in param.statesof(observations[i - 1])])
            probs[state] = probs.get(state, []) + [max_tuple[0]]
            states[state] = {
                **states.get(state, {}), (i - len(observations)): max_tuple[1]
            }

    last_states = param.statesof(observations[-1])
    heap = Heap(min(path_num, len(last_states)))
    for state in last_states:
        heap.push(probs[state][-1], state)

    results = []
    for item in sorted(heap):
        index = -1
        result = [item[1]]
        while index > -len(observations) and states[
                result[0]][index] is not None:
            result.insert(0, states[result[0]][index])
            index -= 1
        results.insert(0, result)
    return results
예제 #5
0
 def test_key(self):
     heap = Heap(lambda x: -x)
     items = []
     for i in self.items:
         heap.push(i)
         items.append(i)
         self.assertEqual(heap.peek(), max(items))
예제 #6
0
class Queue:
    def __init__(self):
        self.size = 0
        self.priority = 0
        self.data = Heap()

    def enqueue(self, elem):
        elem_priority = (self.priority, elem)
        self.data.add(elem_priority)
        self.size += 1

    def dequeue(self):
        if self.is_empty():
            raise Empty
        elem_tuple = Heap.remove_min(self.data)
        self.size -= 1
        return elem_tuple[1]

    def first(self):
        if self.is_empty():
            raise Empty
        elem_tuple = Heap.min(self.data)
        return elem_tuple[1]

    def __len__(self):
        return self.size

    def is_empty(self):
        return self.size == 0
예제 #7
0
    def dijkstra(self, s=1):
        heap = Heap()
        starter = self.lookup[s]
        starter.score = 0
        cloud = set([starter])

        def update(vertex):
            for edge in vertex.edges:
                target = edge.target
                if target in cloud:
                    continue

                def manipulator(v):
                    v.score = min(v.score, vertex.score + edge.weight)

                if target in heap.tree:
                    heap.manipulate(target, manipulator)
                else:
                    manipulator(target)
                    heap.push(target)

        update(starter)
        while not heap.is_empty():
            vertex = heap.pop()
            cloud.add(vertex)
            update(vertex)
예제 #8
0
def shortest_path(adj, s):
    arr, D, P = [], {}, {}
    # initialize Distances and Parents
    for v in adj:
        P[v] = None
        if v == s:
            arr.append((0, v))
            D[v] = 0
        else:
            arr.append((math.inf, v))
            D[v] = math.inf
    heap = Heap(arr)

    while True:
        v = heap.extract()
        if v is None:
            break
        current = v[1]
        for (w, e) in adj[current]:
            nw = D[current] + w
            if nw < D[e]:
                D[e] = nw
                P[e] = current
                heap.decrease(D[e], e)
    return (D, P)
예제 #9
0
	def dijkstra(self, start, goal):
		h = Heap(comp=operator.lt)
		h.add(start, 0)
		done = set()
		costs = {start: 0}
		preds = {}
		explored = 0
		while not h.is_empty():
			explored += 1
			curr = h.pop()['key']
			cost = costs[curr]
			done.add(curr)
			if curr == goal:
				return build_path(preds, curr), costs, explored, cost
			for (neighbor, weight) in self.edges[curr]:
				# 1. already done with this node: skip
				if neighbor in done:
					continue
				# 2. have not yet seen this node: add
				new_cost = cost + weight
				if neighbor not in costs:
					h.add(neighbor, new_cost)
					costs[neighbor] = new_cost
					preds[neighbor] = curr
					continue
				# 3. have already seen this node, and new cost is lower than old: update cost
				if new_cost < costs[neighbor]:
					h.set_priority(neighbor, new_cost)
					costs[neighbor] = new_cost
					preds[neighbor] = curr
		return None, costs, explored, None
예제 #10
0
class MedianMaintainer:
    """The median is defined as ((n+1)/2)th element if n is odd and (n/2)th element if n is even."""

    def __init__(self):
        self.smaller = Heap(maxheap=True)
        self.bigger = Heap()
        self.median = float('inf')

    def _balance(self):
        if abs(len(self.smaller) - len(self.bigger)) > 1:
            if len(self.smaller) > len(self.bigger):
                self.bigger.insert_node(self.smaller.extract_root())
            else:
                self.smaller.insert_node(self.bigger.extract_root())

    def append(self, num):
        # choose where to place a new number.
        if num > self.median:
            self.bigger.insert_node(num)
        else:
            self.smaller.insert_node(num)

        # Ensure heaps length do not differ by more than one.
        self._balance()

        # set median
        self.median = self.smaller[0] if len(self.smaller) >= len(self.bigger) else self.bigger[0]
예제 #11
0
파일: optics.py 프로젝트: inftechweu/optics
def optics(cluster):
	j = 0
	L = [[float('infinity'),float('infinity')]] * len(cluster.X)
	X = range(len(cluster.X))
	
	for p in X:
		if not cluster.isProcessed(p):
			N, pkerndist = cluster.kernlVectors(p, rtype = 'id')
			cluster.markProcessed(p)
			L[j] = [float('infinity'), pkerndist, p] # push p
			j = j+1
			
			seeds = Heap()
			update(N, p, seeds, cluster)
			q = seeds.pop()
			
			while(q):
				NN, qkerndist = cluster.kernlVectors(q, rtype = 'id')
				L[j] = [cluster.vreachdist[q], qkerndist, q]
				j = j+1
				cluster.markProcessed(q)
				
				update(NN, q, seeds, cluster)
				q = seeds.pop()
	return L
예제 #12
0
	def __init__(self, words_stats):
		heap = Heap(True)
		for word in words_stats:
			node = TreeNode(word)
			node.setValue(words_stats[word])
			heap.insert(node)
		self.root = HuffmanBinaryTree.buildTree(words_stats, heap)
 def __init__(self, N):
     """
     :type N: int
     """
     self.N = N
     self.heap = Heap(lambda i: -self.distance(i))
     self.heap.push((-1, N))
예제 #14
0
 def TestBuildMinHeap(self):
     input = [random.randrange(100) for _ in range(100)]
     h = Heap(input)
     sorted_input = sorted(input)
     for i in range(len(input)):
         self.assertEqual(h.peek_min(), sorted_input[i])
         self.assertEqual(h.extract_min(), sorted_input[i])
예제 #15
0
def dijkstraWithHeap(G, s, t):
    bw = [0] * V
    parent = [-1] * V
    status = [2] * V
    heap = Heap()

    status[s] = 0
    bw[s] = sys.maxsize

    neighbors = G.neighbors(s)
    for vertices in neighbors:
        bw[vertices.dst] = vertices.bw
        parent[vertices.dst] = s
        status[vertices.dst] = 1
        heap.insert(vertices.dst, bw[vertices.dst])

    while status[t] != 0:
        v = maxfringe(bw, status)
        # print(v,end=" ")
        status[v] = 0
        neighbors = G.neighbors(v)
        for i in range(len(neighbors)):
            w = neighbors[i].dst
            if status[w] == 2:
                bw[w] = min(bw[v], neighbors[i].bw)
                parent[w] = v
                status[w] = 1
                heap.insert(w, bw[w])
            elif status[w] == 1 and bw[w] < min(bw[v], neighbors[i].bw):
                heap.delete(w)
                bw[w] = min(bw[v], neighbors[i].bw)
                parent[w] = v
                heap.insert(w, bw[w])
    return bw[t]
예제 #16
0
    def __dijkstra_util(self, actual_vertex: InfoElement, done: list,
                        priority_queue: heap.Heap):

        for edge in actual_vertex.vertex.edge_list:
            element = priority_queue.get_element(edge.target_vertex)[1]

            if element != None and element.visited == False:
                new_cost = actual_vertex.accumulated_cost + edge.weight

                #Relaxation
                if element.accumulated_cost > new_cost:
                    element.cost = edge.weight
                    element.accumulated_cost = new_cost
                    element.last_vertex = actual_vertex

        priority_queue.heapify()

        #No others elements to visit
        if priority_queue.heap_size == 0:
            return done

        #Lightest vertex
        top_element = priority_queue.extract()
        top_element.visited = True
        done.append(top_element)
        return self.__dijkstra_util(top_element, done, priority_queue)
예제 #17
0
    def __init__(self, size, size_factor=1.0):
        self.size_factor = size_factor
        self.root = None
        binaryHeap = Heap(size)

        for value in binaryHeap.getHeap():
            self.add(value)
예제 #18
0
	def astar(self, start, goal, heuristic):
		h = Heap(comp=operator.lt)
		start_cost = heuristic(start, goal)
		h.add(start, start_cost)
		actual_costs = {start: 0}
		preds = {}
		done = set()
		explored = 0
		while not h.is_empty():
			explored += 1
			curr = h.pop()['key']
			cost = actual_costs[curr]
			done.add(curr)
			if curr == goal:
				return build_path(preds, curr), actual_costs, h, explored, cost
			for (neighbor, weight) in self.edges[curr]:
				# 1. already done with this node: skip
				if neighbor in done:
					continue
				# 2. have not yet seen this node: add
				cost_so_far = cost + weight
				total_cost = cost_so_far + heuristic(neighbor, goal)
				if neighbor not in actual_costs:
					h.add(neighbor, total_cost)
					preds[neighbor] = curr
					actual_costs[neighbor] = cost_so_far
					continue
				# 3. have already seen this node, and new cost is lower than old: update cost
				if cost_so_far < actual_costs[neighbor]:
					h.set_priority(neighbor, total_cost)
					actual_costs[neighbor] = cost_so_far
					preds[neighbor] = curr
		return None, actual_costs, h, explored, None
예제 #19
0
def testData(data: list, fileObject):
    '''
    This function takes in a list of @data and a file object @fileObject
    Creates a new Heap instance with the list of @data, and verifies min-heap
    with checkHeap().
    Inserts some new values into the heap with insertOne(), and repeatedly remove
    the smallest item while maintaining heap using deleteOne().
    '''
    heap = Heap(data)
    printHeap("Heap", heap, fileObject)
    checkHeap(heap, fileObject)
    insertOne(heap, 31, fileObject)
    insertOne(heap, 14, fileObject)

    # This portion repeatedly removes the smallest element at the root.
    while heap.size() > 0:

        # This portion changes the heap and should cause an error.
        # Uncomment this portion to test checkHeap()
        '''
        if heap.size() == 10:
            heap._heapList[7] = 4 # Error checker
        '''

        deleteOne(heap, fileObject)  # this repeatedly remove smallest element.
예제 #20
0
class ProrityQueue:

    def __init__(self):
        self.heap = Heap()
        self.help = 0

    def enqueue(self, element, priority=0, maximum=True):
        """Insert element to queue.
         If maximum = True builds queue based on maximum prioritet else maximu = False builds heap based on minimum prioritet"""
        self.heap.insert((priority, self.help, element), maximum)
        self.help += 1
        return

    def dequeue(self):
        """Delete element with queue"""
        return self.heap.extract()[2]

    def get_size(self):
        """Return size queue"""
        return self.heap.get_size()

    def __repr__(self):
        """Representation object."""
        lista = [x[2] for x in self.heap.table[1:]] 
        return f'{lista}'
예제 #21
0
def dijkstra(graph, src, dest):
    vertices = graph.keys()
    Q = Heap(len(vertices))
    parent = {}

    for vertex in vertices:
        if vertex == src:
            Q.insert((vertex, 0))
        else:
            Q.insert((vertex, float('inf')))

    while not Q.isEmpty():
        u, wt_u = Q.pop()
        if u == dest:
            printPath(parent, src, dest)
            break
        else:
            lst = graph[u]
            for tup_v in lst:
                v, wt_v = tup_v
                if v not in Q.minHeap_pos:
                    continue
                ind_v = Q.minHeap_pos[v]
                current_wt = Q.minHeap[ind_v][1]
                if wt_u + wt_v < current_wt:
                    new_wt = wt_u + wt_v
                    parent[v] = u
                    Q.decreaseKey(ind_v, v, new_wt)
예제 #22
0
class GetMapFromHeapWithSingleKeyTestCase(unittest.TestCase):
    def setUp(self) -> None:
        self.h = Heap()
        self.h.MakeHeap([11], 1)

    def test(self):
        self.assertEqual(11, self.h.GetMax())
        self.assertIsNone(self.h.HeapArray[0])
예제 #23
0
 def test_build_heaps(self):
     array = []
     for i in range(10000):
         array.append(randint(-100, 100))
     newHeap = Heap(array, 'max')
     self.assertTrue(check_heap_prop(newHeap.array, newHeap.type))
     newHeap = Heap(array, 'min')
     self.assertTrue(check_heap_prop(newHeap.array, newHeap.type))
예제 #24
0
 def TestKeyLambda(self):
     input = [random.randrange(100) for _ in range(100)]
     h = Heap(input, key=lambda x: x * -1)
     sorted_input = sorted(input, reverse=True)
     print(sorted_input)
     for i in range(len(input)):
         self.assertEqual(h.peek_min(), sorted_input[i])
         self.assertEqual(h.extract_min(), sorted_input[i])
예제 #25
0
 def TestMinHeapWithRandomInput(self):
     input = [random.randrange(100) for _ in range(100)]
     h = Heap()
     for num in input:
         h.insert(num)
     sorted_input = sorted(input)
     for i in range(len(input)):
         self.assertEqual(h.extract_min(), sorted_input[i])
예제 #26
0
def get_top_predicted_list(user_id, business_to_check, number_of_prediction):
    top_business = Heap(number_of_prediction)
    for business_id in business_to_check:
        predicted_rating = get_predicted_rating_for_business(
            user_id, business_id)
        if predicted_rating:
            top_business.push(round(predicted_rating, 3), business_id)
    return sorted(top_business.get_list(), reverse=True, key=lambda x: x[0])
예제 #27
0
파일: sort.py 프로젝트: LyingHid/CLRS
def heap_sort(A, key=default_key):
    """ Θ(nlgn) """
    heap = Heap(A, key=key)
    for i in reversed(range(1, heap._heap_size)):
        heap._heap[0], heap._heap[i] = heap._heap[i], heap._heap[0]
        heap._heap_size -= 1
        heap._heapify(0)
    return heap._heap
예제 #28
0
 def test_max_heap_insert(self):
     test_case = [i for i in range(1, 11)]
     heap_type = 'max'
     test_heap = Heap(heap_type)
     for test_element in test_case:
         test_heap.heap_insert(test_element)
         self.assertEqual(test_element, test_heap.heap[0])
     self.assertEqual(len(test_case), len(test_heap.heap))
예제 #29
0
def heapsort(items):
    heap = Heap(items[:])

    result = []
    while heap.items:
        result.append(heap.pop())

    return result
예제 #30
0
def heap_sort2(seq):
    heap = Heap(seq)

    res = []
    for i in range(len(seq)):
        res.insert(0, heap.extract_max())

    return res