hashTable实现
上文:http://hi.baidu.com/syxcs123/blog/item/4165aa51f6a87873853524bf.html
看了网上介绍的hashTable,平时用的都是现成的库,实际上自己真的没有很是明白,自己就写了个简单的,虽然没实现O(1),但应该也可以的吧!一下图是原理和简单的封装 和用STL的版本 的代码!
#include <iostream>    
using namespace std;    
    
class HashTable{    
public :    
    enum ItemState {NULLKEY , HAVEKEY , DELEDKEY} ;    
    struct NextData{    
        char * data;    
        NextData *next;    
    };    
    struct Item{    
        ItemState is;    
        NextData * data;    
    };    
public :    
    HashTable(int size);    
    void initHashTsble();    
    bool insert(char * e);    
    bool serch(char *e);    
    bool del(char *e);    
    int hash(char * e);    
private :    
    int hashSize ;    
    Item * data;    
};    
HashTable::HashTable(int size):hashSize(size){    
    initHashTsble();    
}    
void HashTable::initHashTsble(){    
    int i ;    
    data = new Item[hashSize];    
    for(i=0; i<hashSize; i++){    
        data[i].is = NULLKEY;    
        data[i].data = NULL;    
    }    
}    
int HashTable::hash(char * e){    
    const char * it = e;    
    unsigned long key = 0;    
    while( *it != 0 )    
    {  
        key = (key<<5) + key + *it++;    
    }    
    return ( key % hashSize);    
}    
bool HashTable::insert(char * e){    
    int key = hash(e);    
    if(data[key].is != HAVEKEY){    
        data[key].is = HAVEKEY;    
        NextData *nd = new NextData();    
        nd->data = e;    
        nd->next = NULL;    
        data[key].data = nd;    
    }else {    
        NextData * nd = data[key].data;    
        while(nd->next) {    
            nd = nd->next;    
        }    
        NextData * ndTemp = new NextData();    
        ndTemp->data = e;    
        ndTemp->next = NULL;    
        nd->next = ndTemp;    
    }    
    return true;    
}    
bool HashTable::serch(char *e)    
{    
    int key = hash(e);    
    if(data[key].is == HAVEKEY){    
        NextData *nd = data[key].data;    
        while(nd->next){    
            if(strcmp(nd->data , e) == 0)    
                return true;    
            else    
                nd = nd->next;    
        }    
    }    
    return false;    
}    
bool HashTable::del(char *e){    
    int key = hash(e);    
    if(data[key].is == HashTable::ItemState::HAVEKEY){    
        NextData * nd = data[key].data;    
        NextData *ndFront = NULL;    
        while(nd){    
            if(strcmp(nd->data , e) == 0){    
                if(nd->next) {    
                    NextData *ndTemp = nd;    
                    nd = nd->next;    
                    delete ndTemp;     
                }else {    
                    ndFront->next = NULL;    
                    delete nd;    
                }    
                return true;    
            }    
            ndFront = nd;    
            nd = nd->next;    
        }    
    }    
    return false;    
}    
int main(){    
    HashTable hs(100);    
    char *p1 = "syx";    
    char *p2 = "yxs";    
    char *p3 = "ysx";    
    char *p4 = "my";    
    hs.insert(p1);  
    hs.insert(p2);    
    hs.insert(p3);    
    cout<<hs.serch(p3)<<endl;    
    cout<<hs.del(p4)<<endl;    
    cout<<hs.del(p3)<<endl;    
    cout<<hs.serch(p3)<<endl;    
    return 0;    
}
STL版本:
C语言: Codee#15837
#include <iostream>
#include <string>
#include <vector>
#include <list>
using namespace std;
class HashTable{
public :
    enum ItemState {NULLKEY , HAVEKEY , DELEDKEY} ;
    struct Item{
        ItemState is;
        list<string> data;
    };
public :
    HashTable(int size);
    void initHashTsble();
    bool insert(string e);
    bool serch(string e);
    bool del(string e);
    int hash(string e);
private :
    int hashSize ;
    vector<Item> data;
};
HashTable::HashTable(int size):hashSize(size){
    initHashTsble();
}
void HashTable::initHashTsble(){
    int i ;
    data = vector<Item>(hashSize);
    for(i=0; i<hashSize; i++){
        data[i].is = HashTable::ItemState::NULLKEY;
        data[i].data = list<string>();
    }
}
int HashTable::hash(string e){
    const char * it = e.c_str();
    unsigned long key = 0;
    while( *it != 0 )
    { 
        key = (key<<5) + key + *it++;
    }
    return ( key % hashSize);
}
bool HashTable::insert(string e){
    int key = hash(e);
    data[key].is = HashTable::ItemState::HAVEKEY;
    data[key].data.push_back(e);
    return true;
}
bool HashTable::serch(string e)
{
    int key = hash(e);
    if(data[key].is == HashTable::ItemState::HAVEKEY){
        list<string>::iterator itBegin = data[key].data.begin();
        list<string>::iterator itEnd = data[key].data.end();
        while(itBegin != itEnd){
            if(*itBegin == e){
                return true;
            }
            ++itBegin;
        }
    }
    return false;
}
bool HashTable::del(string e){
    int key = hash(e);
    if(data[key].is == HashTable::ItemState::HAVEKEY){
        data[key].data.remove(e);
    }
    return true;
}
int main(){
    HashTable hs(100);
    string p1 = "syx";
    string p2 = "yxs";
    string p3 = "ysx";
    string p4 = "my";
    hs.insert(p1); 
    hs.insert(p2);
    hs.insert(p3);
    cout<<hs.hash("faefae")<<endl;
    cout<<hs.hash("gaeg")<<endl;
    cout<<hs.hash("afefa")<<endl;
    cout<<hs.hash("faedgae")<<endl;
    cout<<hs.hash("123")<<endl;
    cout<<hs.serch(p3)<<endl;
    //cout<<hs.del(p4)<<endl;
    cout<<hs.del(p3)<<endl;
    cout<<hs.serch(p3)<<endl;
    return 0;
}
  
打造最快的Hash表
  
http://blog.chinaunix.net/u3/104957/showart_2079562.html
http://www.360doc.com/content/05/0819/10/332_7235.shtml#
    
作者:syxChina
    
出处:http://syxchina.cnblogs.com/
本文章是作者学习心得笔记,欢迎转载,请注明原文地址,如有疑问,可以通过 278250658@qq.com 联系作者本人。
作者:BuildNewApp
出处:http://syxchina.cnblogs.com、 BuildNewApp.com
本文版权归作者、博客园和百度空间共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则作者会诅咒你的。
如果您阅读了我的文章并觉得有价值请点击此处,谢谢您的肯定1。
 
                    
                

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号