BinaryHeap

BinaryHeap

The goal of this package is to provide a binary heap package for Zeek that can be used in multiple applications:

Priority queue: can be efficiently implemented using a binary heap in O(logn) time.
Incremental sorting: can be performed using a binary heap.
Order Statistics: efficiently find the kth smallest (or largest) elements in an array.

This implementation includes the following main functions: Create Heap with compare function

Built in MinHeap & MaxHeap functions

Add to Heap Delete from Heap Modify Item in Heap Return root of Heap Peek at root Replace root with new item and rebalance.

And a number of utility functions Size of Heap Return value of specific item by key Determine if item by key is in Heap

Data structures & Functions

Basic user item:

type Item: record {
    key: string &optional;
val: double &optional;
};

The heap definition:

type Heap: record {
heap: table[count] of Item;     # The binary heap itself
               idx: table[string] of count;    # map of key to location in binary heap
               cmp: function(a: double, b:double): double;
};

Create a Heap:

Init: function(cmp: function(a: double, b:double): double): Heap;

This function returns an empty Heap record, initialized. cmp is the comparison function to determine whether to swap items. Not usually used.

MinHeap: function(): Heap;

This calls Init with an appropriate cmp() function that structures the Heap as a MinHeap.

MaxHeap: function(): Heap;

Creates a MaxHeap ala MinHeap

Add: function(a: Heap, var: Item): bool;

Adds an Item to Heap, returns F if var$key already exists, T upon success

Modify: function(a: Heap, var: Item): bool;

Modifies an Item already in Heap to var$val, returns F if var$key doesn’t exist, T upon success

Update:function(a: Heap, var: Item);

Updates or adds an Item in heap. If var$key exists, add var$item to current value, Otherwise add Item to Heap

Delete: function(a: Heap, var: Item): bool;

Delete Item var$key from Heap, var$val unused. Return T is var$key was in Heap, otherwise F

Peek: function(a: Heap): Item;

Returns Item at root of Heap, without deleting from Heap, or empty Item if Heap is empty

Root: function(a: Heap): Item;

Returns Item at root of Heap, and deletes it from Heap, or empty Item if Heap is empty

RootAndAdd: function(a: Heap, var: Item): Item;

This function combines in an efficient way the Root() function, and the Add() function

IsIn: function(a: Heap, var: Item): bool;

Returns T or F depending on whether var$key is in the heap

Size: function(a: Heap): count;

Returns number of Items in Heap

Value: function(a: Heap, var: Item): Item;

Returns Item that corresponds to var$key, or empty Item if non-existant

Usage Example

event bro_init()
	{
	# Randomize
	srand(double_to_count(time_to_double(current_time())));

	# Initialize a MinHeap

	local MyHeap = BinaryHeap::MaxHeap();
	local item:BinaryHeap::Item;

	# Lets add random values & keys
	local i=1000;
	while (i > 0)
		{
		item = [$val=rand(100000) + 0.0, $key=md5_hash(rand(1000000))];
		BinaryHeap::Add(MyHeap, item);
		--i;
		}

	# Now print them out, highest first
	while (BinaryHeap::Size(MyHeap) > 0)
		{
		item=BinaryHeap::Root(MyHeap);
		print item;
		}
	exit(0);
	}

Package Version :