71 lines
1.5 KiB
C#
71 lines
1.5 KiB
C#
using System;
|
|
using BCG;
|
|
//using BCG.Utilities;
|
|
|
|
namespace BCG
|
|
{
|
|
[Serializable]
|
|
public class BlueIntHash
|
|
{
|
|
[Serializable]
|
|
private struct Element
|
|
{
|
|
public int k;
|
|
public int v;
|
|
public int next;
|
|
}
|
|
|
|
public BlueIntHash(int capacity)
|
|
{
|
|
myElementPool = new Element[capacity + 1];
|
|
myNumberOfBuckets = capacity * 3 + 1;
|
|
myBuckets = new int[myNumberOfBuckets];
|
|
}
|
|
|
|
public void add(int k, int v)
|
|
{
|
|
int index = myGetHash(k);
|
|
|
|
myElementPool[myFirstFreeElement].k = k;
|
|
myElementPool[myFirstFreeElement].v = v;
|
|
myElementPool[myFirstFreeElement].next = myBuckets[index];
|
|
myBuckets[index] = myFirstFreeElement;
|
|
myFirstFreeElement++;
|
|
}
|
|
|
|
[Serializable]
|
|
public class ElementNotFound : Exception
|
|
{ }
|
|
|
|
public int find(int k)
|
|
{
|
|
int b = myFind(k);
|
|
if (b == 0)
|
|
throw new ElementNotFound();
|
|
else
|
|
return myElementPool[b].v;
|
|
}
|
|
|
|
public bool isPresent(int k)
|
|
{ return myFind(k) != 0; }
|
|
|
|
private int myFind(int k)
|
|
{
|
|
int b = myBuckets[myGetHash(k)];
|
|
while (b != 0 && myElementPool[b].k != k)
|
|
b = myElementPool[b].next;
|
|
return b;
|
|
}
|
|
|
|
|
|
private int myGetHash(int k)
|
|
{ return k % myNumberOfBuckets; }
|
|
|
|
private int myFirstFreeElement = 1;
|
|
private Element[] myElementPool;
|
|
|
|
private int[] myBuckets;
|
|
private int myNumberOfBuckets;
|
|
}
|
|
}
|