1 #ifndef QNANO_NEW_INDEX_HASH_TABLE_DEFINED_H 2 #define QNANO_NEW_INDEX_HASH_TABLE_DEFINED_H 20 std::vector<Index_Hash_Table_Node<Key_Type> > nodes;
21 std::vector<int> start_table;
23 size_t (*hash_fct)(
const Key_Type &key);
27 for(
size_t i=0; i<start_table.size(); i++)start_table[i]=-1;
29 size_t size()
const{
return nodes.size();}
31 inline size_t get_start_index(
const Key_Type &key,
size_t stsize)
const{
32 size_t hash=hash_fct(key);
35 inline size_t get_start_index(
const Key_Type &key)
const{
36 return get_start_index(key,start_table.size());
39 int get_index(
const Key_Type &key)
const{
40 int index=start_table[get_start_index(key)];
42 if(nodes[index].key==key)
return index;
43 index=nodes[index].next;
47 int get_index_check(
const Key_Type &key)
const{
50 std::cerr<<
"Index_Hash_Table::get_index_check: key "<<key<<
"not found!"<<std::endl;
55 const Key_Type & get_key(
int index)
const{
56 if(index<0 || index >=(
int)nodes.size()){
57 std::cerr<<
"Index_Hash_Table::get_key: index out of bound: "<<index<<
" vs. [0,"<<nodes.size()<<
"["<<std::endl;
60 return nodes[index].key;
64 void resize_start_table(
size_t size){
65 start_table.resize(size);
66 for(
size_t i=0; i<size; i++){
70 for(
size_t i=0; i<nodes.size(); i++){
75 for(
size_t n=0; n<nodes.size(); n++){
76 size_t start_index=get_start_index(nodes[n].key);
77 int index=start_table[start_index];
81 start_table[start_index]=n;
86 if(nodes[index].key==nodes[n].key)
break;
87 int next_index=nodes[index].next;
101 void add(
const Key_Type &key){
102 if(nodes.size()>=1.5*start_table.size())resize_start_table(start_table.size()*2);
104 size_t start_index=get_start_index(key);
105 int index=start_table[start_index];
109 size_t old_nodes_size=nodes.size();
111 start_table[start_index]=old_nodes_size;
117 if(nodes[index].key==key)
return;
118 int next_index=nodes[index].next;
120 size_t old_nodes_size=nodes.size();
122 nodes[index].next=old_nodes_size;
130 void print_start_table(std::ostream &os=std::cout)
const{
131 os<<
"Start Table:"<<std::endl;
132 for(
size_t i=0; i<start_table.size(); i++){
133 os<<i<<
": "<<start_table[i]<<std::endl;
136 void print_nodes(std::ostream &os=std::cout)
const{
137 os<<
"Nodes:"<<std::endl;
138 for(
size_t i=0; i<nodes.size(); i++){
139 os<<i<<
": "<<nodes[i].key<<
": "<<nodes[i].next<<std::endl;
142 void print(std::ostream &os=std::cout)
const{
143 std::cout<<
"start_table.size(): "<<start_table.size()<<std::endl;
144 std::cout<<
"nodes.size(): "<<nodes.size()<<std::endl;
145 print_start_table(os);
151 : nodes(other.nodes), start_table(other.start_table),
152 hash_fct(other.hash_fct){
155 Index_Hash_Table(
size_t (*hash_fct_)(
const Key_Type &),
size_t start_table_size=128)
156 : hash_fct(hash_fct_) {
158 start_table.resize(start_table_size);
159 for(
size_t i=0; i<start_table_size; i++){
Definition: Index_Hash_Table.h:18
Definition: Index_Hash_Table.h:8