Guest User

Untitled

a guest
Dec 11th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.82 KB | None | 0 0
  1.  
  2.  
  3. class PriorityQueue:
  4.     """Array-based priority queue implementation."""
  5.     def __init__(self):
  6.         """Initially empty priority queue."""
  7.         self.queue = [None]
  8.         self.min_index = 1
  9.    
  10.     def __len__(self):
  11.         # Number of elements in the queue.
  12.         return len(self.queue)-1
  13.    
  14.     def append(self, key):
  15.         """Inserts an element in the priority queue."""
  16.         if key is None:
  17.             raise ValueError('Cannot insert None in the queue')
  18.         self.queue.append(key)
  19.         i = len(self.queue)-1
  20.         while (i > 1):
  21.             if (self.queue[i/2] <= self.queue[i]):
  22.                 break
  23.             self.queue[i/2], self.queue[i] = self.queue[i], self.queue[i/2]
  24.             i /= 2;
  25.    
  26.     def min(self):
  27.         """The smallest element in the queue."""
  28.         if len(self.queue) == 0:
  29.             return None
  30.         return self.queue[1]
  31.    
  32.     def l(self,i): return 2*i
  33.     def r(self,i): return 2*i+1
  34.     def pop(self):
  35.         """Removes the minimum element in the queue.
  36.    
  37.        Returns:
  38.            The value of the removed element.
  39.        """
  40.         if len(self.queue) == 1:
  41.             return None
  42.         heapsize = len(self.queue)
  43.         oldmin = self.queue[1]
  44.         self.queue[1] = self.queue[len(self.queue)-1]
  45.         i=1
  46.         while(i<heapsize):
  47.             minidx=i
  48.             if(self.l(i)<heapsize and self.queue[self.l(i)] < self.queue[minidx]):
  49.                 minidx=self.l(i)
  50.             if(self.r(i)<heapsize and self.queue[self.r(i)] < self.queue[minidx]) :
  51.                 minidx=self.r(i)
  52.             if(minidx!=i):
  53.                 self.queue[i], self.queue[minidx] = self.queue[minidx], self.queue[i]
  54.                 i=minidx
  55.             else:
  56.                 break
  57.         self.queue.pop()
  58.         return oldmin
Add Comment
Please, Sign In to add comment