D-ary Heap

Each node can have up to D children.

Dijkstra-s-Shortest-Path-Algorith

D-ary heaps also have better locality of reference for larger D in the dequeue operation. (https://stackoverflow.com/questions/29126428/binary-heaps-vs-d-ary-heaps)

Implementation (0-indexed)

class D_aryHeap:
	def __init__(self, d):
		self.heap = []
		self.size = 0
		self.d = d
 
	def size(self):
		return self.size
 
	def parent(self, i):
		return (i-1)//self.d
 
	def child(self, index, pos):
		return index*self.d + (pos+1)
 
	def get(self, i):
		return self.heap[i]
 
	def poll(self):
		min_key = self.heap[0]
		self.heap[0] = self.heap[self.size]
		self.size -= 1
		self.sink(0)
		return min_key
 
	def sink(self, i):
		min_i = i
		for j in range(self.d):
			c = self.child(i, j)
			if c < self.size and self.heap[c] < self.heap[i]:
				min_i = c
		if min_i != i:
			self.swap(min_i, i)
			self.sink(min_i)
 
	def swap(self, i, j):
		self.heap[i], self.heap[j] = self.heap[j], self.heap[i]
 
	def insert(self, key):
		i = self.size
		self.heap.append(key)
		self.size += 1
		self.swim(self.size)
 
	def swim(self, i):
		p = self.parent(i)
		while i > 0 and self.heap[i] < self.heap[p]:
			self.swap(i, p)
			i = p
			p = self.parent(i)

Optimizations

Optimized Complexity

Related

Heap-Implementation Indexed-D-ary-Heap Indexed-Priority-Queue-(IPQ)