雜湊是一種演算法,將指定的資料按一定規律對映到一段空間內,又可以按照這種規律對它的值進行相應的操作,這一段空間可以稱作雜湊表,它的的查詢速度要快於線性的資料結構,同時也快於**佇列等,所以它具有獨特的優勢,一般將雜湊演算法用於快速查詢和加密演算法。
對於最簡單的雜湊表,裡面設定乙個key,它決定將這個值存於雜湊表的什麼位置,同時把每個設定乙個狀態,如果有插入資料就將其設定為exits,其他操作同理,現在可以實現最簡單的雜湊表。
namespace first
;template
class hashtable
}~hashtable()//析構
hashtable(const hashtable& h)//拷貝構造
:_capacity(h._capacity)
, _tables(new t[h._capacity])
, _states(new state[h._capacity])
, _size(h._size)
}hashtable& operator=(hashtableh)//賦值運算子過載
return *this;
}bool insert(const t& key)//插入
int index = hashfunc(key);
int start = index;
while (_states[index] == exits)//往後線形探測
index++;
if (index == _capacity)//最後乙個
if (index == start)//找了一圈沒找到
}_tables[index] = key;
_states[index] = exits;
_size++;
}bool find(const t& key)//查詢
else
}index++;
if (index == _capacity)
if (start == index)
}cout << "find fail" << endl;
return false;
}bool remove(const t& key)///刪除
else
}index++;
if (index == _capacity)
if (start == index)
}cout << "delete fail" << endl;
return true;
}void print()//列印雜湊表
cout << endl;
}protected:
int hashfunc(const t& key)
private:
size_t _capacity;
t* _tables;
state* _states;
size_t _size;};}
/**************************************/
從上面的**可以看出,這個雜湊表並不適用於實際,因為首先它是乙個靜態的,如果存入的key值過多就會造成越界訪問,同時用的是線性探測方法,這樣降低了cpu的訪問命中率,現在可以實現一種動態的而且隨意設定負載因子的功能。
namespace second//因為有負載因子的限制,可以提高cpu訪問命中率
;template
class hashtable
}~hashtable()//析構
hashtable(const hashtable& h)//拷貝構造
:_capacity(h._capacity)
, _tables(new t[h._capacity])
, _states(new state[h._capacity])
, _size(h._size)
}hashtable& operator=(hashtableh)//賦值運算子過載
return *this;
}//bool insert(const t& key)//插入(線性探測)
////index++;
//if (index == _capacity)
////if (index == start)
////
//}//_tables[index] = key;
//_states[index] = exits;
//_size++;
//}bool insert(const t& key)//插入(二次探測,即某個數的二次方,這樣資料存著更稀疏)
index = _hashfunct(index, ++i);
if (start = index)
if (index == _capacity)
}_tables[index] = key;
_states[index] = exits;
_size++;
}bool find(const t& key)//查詢
else
}index = _hashfunct(index, ++i);
if (start = index)
if (index == _capacity)
}cout << "find fail" << endl;
return false;
}bool remove(const t& key)///刪除
index = _hashfunct(index, ++i);
if (start == index)
if (index == _capacity)
}return false;
}void print()//列印雜湊表
cout << endl;
}protected:
int _hashfunct(int index,int i)
int _hashfunc(const t& key)
void _checkcapacity()//檢查容量
}_swap(tmp);}}
void _swap(hashtableh)
private:
size_t _capacity;
t* _tables;
state* _states;
size_t _size;};}
/****************************************/
上面的**對於key形式的相對第一種已經比較健全了。現在可以利用雜湊演算法可以實現一種key/value形式的功能,可以支援字典功能,key是乙個資訊,同時value是key的乙個附帶資訊,比如說key為學號,那麼班級就是附帶的資訊value,例如還有簡單的英漢字典形式,現進行簡單的實現。
namespace third//支援字典形式的;
template
struct hashtablenode
hashtablenode(const t& key, const v& value)
:_key(key)
, _value(value)
{}t _key;
v _value;
};template
struct __hashfunc
};//實現key,value形式,並且是二次探測的
template >
class dictionary
}~dictionary()
bool insert(const t& key,const v& value)
index = _hashfuntwice(index, ++i);
if (index == _capacity)
if (index == start)
}_tables[index] = hashtablenode(key, value);
_states[index] = exits;
_size++;
return true;
}hashtablenode* find(const t& key)
index = _hashfuntwice(index, ++i);
if (start == index)
}cout << "find fail" << endl;
return null;
}bool remove(const t& key)
else }
index = _hashfuntwice(index, ++i);
if (index == start) }
return false;
}void print()
cout << endl;
}protected:
void _checkcapacity()//將負載因子設為0.6
}_swap(tmp);}}
void _swap(dictionarytmp)
size_t _hashfunonce(const t& key)
size_t _hashfuntwice(int index,int i)//獲取二次探測的下標
private:
size_t _capacity;
hashtablenode* _tables;
state* _states;
size_t _size;};}
void test3()//二次探測,負載因子,實現字典的功能
上述就是對雜湊演算法的簡單應用。
動態雜湊表
動態雜湊表的基本操作 函式實現部分 void inithashbucket ht ht,intcapacity 初始化雜湊表 獲取容量 capacity getprime capacity ht table pnode malloc sizeof node capacity 雜湊表的初始化 for ...
動態查詢 雜湊表
折半查詢 二叉排序樹等查詢時的查詢效率依賴於查詢過程中所進行的比較次數。而理性情況下是希望不經過比較的,一次訪問便能得到,那就必須在記錄的儲存位置和他的關鍵字之間建立一種確定的對應關係f,是每個關鍵字和結構中的乙個唯一的儲存位置相對應。根據對應關係f找到給定值k的像分f k 若結構中存在和k值相等的...
鍊錶的基本概念以及靜態鍊錶和動態鍊錶
鍊錶概念 鍊錶使用說明 畫圖示意 建立關係 node1.next node2 node2.next node3 node3.next node4 node4.next node5 node5.next null lk struct linknode lk nodecurrent node1 遍歷輸出...