def bi_directional_search(self, src, dst): self._add_inverted_children() self.reset_node_paths() queue_src = Queue() queue_dst = Queue() src_visited = set() dst_visited = set() queue_src.add(src) src_visited.add(src) queue_dst.add(dst) dst_visited.add(dst) collided = False while not queue_src.is_empty() or not queue_dst.is_empty(): if len(src_visited.intersection(dst_visited)) > 0: collided = True break if not queue_src.is_empty(): src_output = queue_src.remove() for child in src_output.children: if child not in src_visited: child.forward_pre = src_output queue_src.add(child) src_visited.add(child) if len(src_visited.intersection(dst_visited)) > 0: collided = True break if not queue_dst.is_empty(): dst_output = queue_dst.remove() if dst_output in self.inverted: for child in self.inverted[dst_output]: if child not in dst_visited: child.backward_pre = dst_output queue_dst.add(child) dst_visited.add(child) if collided: intersect = src_visited.intersection(dst_visited).pop() forward = [] ref = intersect while ref is not None: forward = [ref.data] + forward ref = ref.forward_pre ref = intersect backward = [] while ref is not None: backward += [ref.data] ref = ref.backward_pre return forward[:-1] + backward else: return []
class TestQueue(unittest.TestCase): def setUp(self): self.queue = Queue() def queue_add_small(self): self.queue.add(1) self.queue.add(2) self.queue.add(3) def sanity_check(self, input_data): self.assertEqual(self.queue.data, input_data) def test_init(self): self.sanity_check([]) def test_add(self): self.queue.add("hi") self.sanity_check(["hi"]) self.queue.add("hello") self.sanity_check(["hi", "hello"]) def test_peek(self): self.queue_add_small() self.assertEqual(self.queue.peek(), 1) def test_remove(self): self.queue_add_small() output = self.queue.remove() self.assertEqual(output, 1) self.sanity_check([2, 3]) output = self.queue.remove() self.assertEqual(output, 2) self.sanity_check([3]) output = self.queue.remove() self.assertEqual(output, 3) self.sanity_check([]) def test_peek_error(self): self.assertRaises(Exception, lambda: self.queue.peek()) def test_pop_error(self): self.assertRaises(Exception, lambda: self.queue.remove())
class AnimalShelter: def __init__(self): self.dog_queue = Queue() self.cat_queue = Queue() def enqueue(self, animal): animal.time_stamp = time.time() if animal.type == "dog": self.dog_queue.add(animal) if animal.type == "cat": self.cat_queue.add(animal) def dequeue_any(self): if self.dog_queue.is_empty(): return self.cat_queue.remove() if self.cat_queue.is_empty(): return self.dog_queue.remove() if self.dog_queue.peek().time_stamp < self.cat_queue.peek().time_stamp: return self.dog_queue.remove() else: return self.cat_queue.remove() def dequeue_dog(self): return self.dog_queue.remove() def dequeue_cat(self): return self.cat_queue.remove()
def _bfs(self, start_node): result = [] queue = Queue() queue.add(start_node) self.visited.add(start_node) while not queue.is_empty(): output_node = queue.remove() for child in output_node.children: if child not in self.visited: queue.add(child) self.visited.add(child) result += [output_node.data] return result