114 lines
2.9 KiB
Text
114 lines
2.9 KiB
Text
global empty = 1;
|
|
global filled = 2;
|
|
global tlen = 0;
|
|
global metas = 1;
|
|
global keys = 2;
|
|
global values = 3;
|
|
|
|
int[][] create(int size) {
|
|
var hash_table= new int[][]{
|
|
new int[]{size},
|
|
new int[size],
|
|
new int[size],
|
|
new int[size]
|
|
};
|
|
|
|
for (var i = 0; i < size; i = i + 1;) {
|
|
hash_table[metas][i] = empty;
|
|
}
|
|
|
|
return hash_table;
|
|
}
|
|
|
|
int hash(int h) {
|
|
return h;
|
|
}
|
|
|
|
int table_len(int[][] hash_table) {
|
|
return hash_table[tlen][0];
|
|
}
|
|
|
|
int get_index(int[][] hash_table, int key) {
|
|
var len = table_len(hash_table);
|
|
var index = hash(key) [&] (len - 1);
|
|
return index;
|
|
}
|
|
|
|
bool insert(int[][] hash_table, int key, int value) {
|
|
var start_index = get_index(hash_table, key);
|
|
var len = table_len(hash_table);
|
|
var mask = len - 1;
|
|
|
|
for (var i = 0; i < len; i = i + 1;) {
|
|
var index = (start_index + i) [&] mask;
|
|
|
|
if (hash_table[metas][index] == filled) {
|
|
if (hash_table[keys][index] == key) {
|
|
hash_table[values][index] = value;
|
|
return true;
|
|
}
|
|
} else if (hash_table[metas][index] == empty) {
|
|
hash_table[metas][index] = filled;
|
|
hash_table[keys][index] = key;
|
|
hash_table[values][index] = value;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
int[] get(int[][] hash_table, int key) {
|
|
var start_index = get_index(hash_table, key);
|
|
var len = table_len(hash_table);
|
|
var mask = len - 1;
|
|
|
|
for (var i = 0; i < len; i = i + 1;) {
|
|
var index = (start_index + i) [&] mask;
|
|
if (hash_table[metas][index] == filled & hash_table[keys][index] == key) {
|
|
return new int[]{hash_table[values][index], 1};
|
|
} else if (hash_table[metas][index] == empty) {
|
|
return new int[]{0, 0};
|
|
}
|
|
}
|
|
|
|
return new int[]{0, 0};
|
|
}
|
|
|
|
int program (int argc, string[] argv) {
|
|
var tbl = create(16);
|
|
|
|
var sample_keys = new int[]{5, 7, 2, 23, 65, 878, 23, 56, 76, 12};
|
|
var sample_values = new int[]{5, 7, 2, 23, 65, 878, 23, 56, 76, 12};
|
|
for (var i = 0; i < 10; i = i + 1;) {
|
|
var success = insert(tbl, sample_keys[i], sample_values[i]);
|
|
if (!success) {
|
|
print_string("failed to insert!\n");
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
for (var i = 0; i < 10; i = i + 1;) {
|
|
var result = get(tbl, sample_keys[i]);
|
|
if (result[1] == 1) {
|
|
print_int(sample_keys[i]);
|
|
print_string(" => ");
|
|
print_int(result[0]);
|
|
print_string(", ");
|
|
|
|
if (result[0] != sample_values[i]) {
|
|
print_string("error! should have found value ");
|
|
print_int(sample_values[i]);
|
|
print_string("\n");
|
|
return 1;
|
|
}
|
|
} else {
|
|
print_string("entry ");
|
|
print_int(sample_keys[i]);
|
|
print_string(" not found\n");
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|