青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

洗塵齋

三懸明鏡垂鴻韻,九撩清泉洗塵心

常用鏈接

統(tǒng)計(jì)

最新評(píng)論

哈希表的一個(gè)實(shí)現(xiàn)

今天寫了一個(gè)哈希表的實(shí)現(xiàn),采用了陣列加開鏈表的形式
看了一下別人的寫法,只用陣列,行數(shù)=100的時(shí)候空間利用率竟然達(dá)到97%

http://lmlf001.blog.sohu.com/


#ifndef _STORMLI_HASH_TABLE_H_
#define _STORMLI_HASH_TABLE_H_

#include
<cstdlib>
#include
<cmath>
#include
<cassert>
#include
<iostream>

template
<typename valueType>
class HashTable
{
    
enum KindOfNode{Active,Empty,Deleted}; //節(jié)點(diǎn)狀態(tài),活躍/空/已刪除
public:
    
int find(unsigned long _key);    //查找_key是否在表中,若在,返回0;否則返回-1;找到時(shí),m,n為節(jié)點(diǎn)的位置
    int insert(unsigned long _key,const valueType &_value);    //插入節(jié)點(diǎn),若該節(jié)點(diǎn)已在表中,返回1;若插入成功,返回0,表滿,返回-1
    int remove(unsigned long _key);    //刪除節(jié)點(diǎn) 若節(jié)點(diǎn)不存在,返回-1,成功時(shí)返回0
public:
    
double getFullRate()const;    //返回Hash表空間利用率
    bool isFull()const{return currentSize==maxSize+maxList;}    //表是否為滿
    void clear();            //清除表內(nèi)容
    void setList(int len=5){if(listLen==-1) listLen=len;}    //default 5,the better one
    double getOverflowRate()const{return double(maxList)/currentSize;}
public:
    HashTable(unsigned 
long maxline,unsigned short line=5);    //構(gòu)造函數(shù)line default 5,a better range
    ~HashTable();
private:
    
struct HashNode        //哈希節(jié)點(diǎn)
    {   
        unsigned 
long key;    //name
        valueType value;    //value
        KindOfNode state;    //節(jié)點(diǎn)狀態(tài)
        HashNode():state(Empty){}
        
~HashNode(){}
    };

    
struct list_node{        //鏈表節(jié)點(diǎn) 存儲(chǔ)溢出數(shù)據(jù)
        unsigned long key;
        valueType value;
        list_node 
*next;
        list_node():next(NULL){}
    };
   

    unsigned 
long currentSize;    //當(dāng)前數(shù)據(jù)量
    unsigned long maxSize;        //最大數(shù)據(jù)量
    unsigned long maxLine;        //每行最大值
    unsigned short lines;        //行數(shù)
    HashNode **ht;            //哈希陣列
    unsigned long *modTable;    //每行的模數(shù)
    unsigned long m,n;        //查找時(shí)存儲(chǔ)節(jié)點(diǎn)位置,否則做為臨時(shí)變量使用
    HashNode *mem;            //哈希表的實(shí)際存儲(chǔ)空間
    list_node * *Overflow_list;    //溢出鏈
    unsigned long maxList;    //list current size
    int listLen;    //list length  default -1---no limit 
   
private:
    
void getMode();            //生成模數(shù)
    void clear_Overflow();    //清除溢出鏈數(shù)據(jù)
};

template
<typename valueType>
HashTable
<valueType>::HashTable(unsigned long maxline,unsigned short line)
{
    maxLine
=maxline;
    lines
=line;
    currentSize
=0;
    ht
=new HashNode *[lines];
    assert(ht
!=NULL);

    mem
=new HashNode[maxLine*lines];    //實(shí)際空間
    assert(mem!=NULL);
    
int i;
    
for(i=0;i<lines;i++)        //分配空間到哈希陣列
        ht[i]=mem+maxLine*i;
    
/*
    for(i=0;i<lines;i++){                //申請(qǐng)存儲(chǔ)空間
        ht[i]=new HashNode[maxLine];
        if(ht[i]==NULL){                //申請(qǐng)失敗,釋放已申請(qǐng)空間,退出
            for(j=i-1;i>=0;j++)
                delete []ht[j];
            delete []ht;
            exit(-1);
        }
    }
    
*/

    modTable
=new unsigned long[lines+1];//modTable[lines]  Overlist
    assert(modTable!=NULL);
    getMode();
/*-----------not must need--------------------------------*/   
    
long temp=modTable[0];
    
for(i=0;i<lines+1;i++)
        modTable[i]
=modTable[i+1];
    modTable[lines]
=temp;
/*------------------------------------------------------*/
    maxSize
=0;
    
for(i=0;i<lines;i++)
        maxSize
+=modTable[i];//最大值
       
    Overflow_list
=new list_node *[modTable[lines]];//Overflow head list ,all NULL pointer
    assert(Overflow_list!=NULL);
    listLen
=-1;
    maxList
=0;
}


template
<typename valueType>
void HashTable<valueType>::getMode()
{        
//采用 6n+1 6n-1 素?cái)?shù)集中原理
    if(maxLine<5){this->~HashTable();exit(-1);}
   
    unsigned 
long t,m,n,p;
    
int i,j,a,b,k;
    
int z=0;
   
    
for(t=maxLine/6;t>=0,z<=lines;t--)
    {
        i
=1;j=1; k=t%10;
        m
=6*t;                                        /**i,j的值 是是否進(jìn)行驗(yàn)證的標(biāo)志也是對(duì)應(yīng)的6t-1和6t+1的素性標(biāo)志**/
        
if(((k-4)==0)||((k-9)==0)||((m+1)%3==0))j=0;/*此處是簡(jiǎn)單驗(yàn)證6*t-1,6*t+1 是不是素?cái)?shù),借以提高素?cái)?shù)純度**/
        
if(((k-6)==0)||((m-1)%3==0))i=0;            /***先通過初步判斷去除末尾是5,及被3整除的數(shù)***/
        
for(p=1;p*6<=sqrt(m+1)+2;p++ )
        {
            n
=p*6;                                    /**將6*p-1和6*p+1看作偽素?cái)?shù)來試除*****/
            k
=p%10;
            a
=1;b=1;                                /**同樣此處a,b的值也是用來判斷除數(shù)是否為素?cái)?shù)提高除數(shù)的素?cái)?shù)純度**/
            
if(((k-4)==0)||((k-9)==0))a=0;
            
if(((k-6)==0))b=0;
            
if(i){                            /*如果i非零就對(duì)m-1即所謂6*t-1進(jìn)行驗(yàn)證,當(dāng)然還要看除數(shù)n+1,n-1,素性純度*/
                
if(a){if((m-1)%(n+1)==0)i=0;}        /***一旦被整除就說明不是素?cái)?shù)故素性為零即將i 賦值為零***/
                
if(b){if((m-1)%(n-1)==0)i=0;}
            }
            
if(j){                           /**如果j非零就對(duì)m+1即所謂6*t+1進(jìn)行驗(yàn)證,當(dāng)然還要看除數(shù)n+1,n-1,素性純度*/
                
if(a){if((m+1)%(n+1)==0)j=0;}         /***一旦被整除就說明不是素?cái)?shù)故素性為零即將j 賦值為零***/
                
if(b){if((m+1)%(n-1)==0)j=0;}
            }
            
if((i+j)==0)break;                     /**如果已經(jīng)知道6*t-1,6*t+1都不是素?cái)?shù)了那就結(jié)束試除循環(huán)***/
        }
        
if(j){modTable[z++]=m+1;if(z> lines)return;}
        
if(i){modTable[z++]=m-1;if(z> lines)return;}
    }
}

template
<typename valueType>
HashTable
<valueType>::~HashTable()
{
    delete []mem;    
//釋放空間
    delete []ht;
    delete []modTable;

    clear_Overflow();
    delete []Overflow_list;
    
/*   
    for(int i=0;i<lines;i++)
        delete []ht[i];
    delete []ht;
    delete []modTable;
    
*/
}

template
<typename valueType>
int HashTable<valueType>::find(unsigned long _key)
{
    
int i;
    
for(i=0;i<lines;i++){
        m
=i;n=(_key+maxLine)%modTable[m];
        
if(ht[m][n].key==_key&&ht[m][n].state==Active)
            
return 0;
    }
    
if(listLen==0)return -1;
    m
=lines;n=(_key+maxLine)%modTable[m];
    list_node 
*pre=Overflow_list[n];
    
while(pre!=NULL){
        
if(pre->key==_key)return 0;
        pre
=pre->next;
    }
    
return -1;
}

template
<typename valueType>
int HashTable<valueType>::insert(unsigned long _key,const valueType &_value)
{
    
if(find(_key)==0)return 1;    //已存在

    
int i,len=0;
    
for(i=0;i<lines;i++){
        m
=i;n=(_key+maxLine)%modTable[m];
        
if(ht[m][n].state!=Active){    //陣列中找到空位,插入數(shù)據(jù)
            ht[m][n].key=_key;
            ht[m][n].value
=_value;
            ht[m][n].state
=Active;
            currentSize
++;
            
return 0;
        }
    }
    
if(listLen==0)return -1;

    
//陣列已滿,插入溢出鏈表
    m=lines;n=(_key+maxLine)%modTable[m];
    list_node 
*pre=Overflow_list[n];
   
    list_node 
*now=new list_node;
    now
->key=_key;
    now
->value=_value;
   
    
if(pre==NULL){
        Overflow_list[n]
=now;
    }
    
else{
        len
=1;
        
while(pre->next!=NULL){pre=pre->next;len++;}
        
if(listLen>0&&len>=listLen)return -1;    // full  ;if listLen<0  no limit ,continue the left operation
        pre->next=now;
    }
    currentSize
++;
    maxList
++;   

    
return 0;
}


template
<typename valueType>
int HashTable<valueType>::remove(unsigned long _key)
{
    
if(find(_key)!=0)return -1;
    
if(m<lines){            //節(jié)點(diǎn)在陣列中
        ht[m][n].state=Deleted;        //節(jié)點(diǎn)狀態(tài)置為Deleted
        currentSize--;
    }
    
else{            //節(jié)點(diǎn)在溢出鏈中
        list_node *pre=Overflow_list[n],*now;
        
if(pre->key==_key){
            Overflow_list[n]
=pre->next;
            delete pre;
        }
        
else{
            
while(pre->next->key!=_key&&pre->next!=NULL)
                pre
=pre->next;
            now
=pre->next;
            pre
->next=now->next;
            delete now;
        }
        currentSize
--;maxList--;
    }
    
return 0;
}

template
<typename valueType>
double HashTable<valueType>::getFullRate()const
{
    
return double(currentSize)/(maxSize+maxList);    //空間使用率
}

template
<typename valueType>
void HashTable<valueType>::clear()
{
    
int i,j;
    
for(i=0;i<lines;i++)        //把所有節(jié)點(diǎn)狀態(tài)置為Empty
        for(j=0;j<modTable[i];j++)
            ht[i][j].state
=Empty;
    
if(listLen!=0)clear_Overflow();
    maxList
=0;
    currentSize
=0;
}

template
<typename valueType>
void HashTable<valueType>::clear_Overflow()
{
    list_node 
*pre=NULL,*now=NULL;
    
for(int i=0;i<modTable[lines];i++)
    {
        pre
=Overflow_list[i];
        
if(pre==NULL)continue;
        
while(pre->next!=NULL){
            now
=pre->next;
            pre
->next=now->next;
            delete now;
        }
        delete pre;
        Overflow_list[i]
=NULL;
    }
}

#endif


//-----------test.cpp

#include
"HashTable.h"
#include
<cstdlib>
#include
<ctime>
#include
<iostream>
#include
<unistd.h>
#include
<cstdio>
using namespace std;

int main(int argc,char **argv)
{
    HashTable
<int> HT(10000,6);
    HT.setList(
5);
   
    
int i=0,j;
    
double sum=0.0,sum2=0.0;
    
volatile unsigned long temp;
    
volatile unsigned long seed;
    
while(i++<1000){
            seed
=time(NULL);
            srand(i
+seed);
            
while(true)
            {
                    temp
=rand();
                    
if(HT.insert(temp,0)<0)break;
            }
            cout
<<HT.getFullRate()<<"\t"<<HT.getOverflowRate()<<endl;
            sum
+=HT.getFullRate();
            sum2
+=HT.getOverflowRate();
            HT.clear();
    }
    cout
<<"\n\n\n"<<sum/1000<<"\t  "<<sum2/1000<<endl;

    
return 0;
}

posted on 2007-09-08 21:07 芥之舟 閱讀(5328) 評(píng)論(1)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)結(jié)構(gòu)和算法

評(píng)論

# re: 哈希表的一個(gè)實(shí)現(xiàn) 2014-10-13 10:50 abc

p*6<=sqrt(m+1)+2 這個(gè)是怎么回事  回復(fù)  更多評(píng)論   


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            91久久久久久久久| 日韩视频在线一区二区三区| 久久久久国产一区二区三区| 亚洲一区二区免费视频| 一区二区不卡在线视频 午夜欧美不卡在 | 夜夜爽99久久国产综合精品女不卡| 亚洲精品久久久久久久久| 亚洲日本va在线观看| 一本色道久久综合亚洲精品婷婷| 9久re热视频在线精品| 亚洲色图综合久久| 久久精品亚洲热| 欧美福利网址| 国产精品综合色区在线观看| 伊人成综合网伊人222| 亚洲美女网站| 午夜免费电影一区在线观看| 欧美aⅴ99久久黑人专区| 亚洲人体偷拍| 欧美一区三区三区高中清蜜桃| 欧美a级理论片| 国产精品永久免费| 亚洲精品欧美日韩专区| 欧美中文字幕在线观看| 亚洲欧洲一二三| 欧美一二三视频| 欧美日韩国产成人在线91| 国产亚洲综合性久久久影院| 亚洲美女毛片| 久久综合一区| 亚洲女女做受ⅹxx高潮| 欧美国产日韩视频| 亚洲人成在线观看一区二区| 亚洲国产欧美在线| 久久精品一区二区| 欧美大片在线观看| 国产精品日韩欧美综合| 久久久久欧美| 亚洲国产精品一区二区www在线 | 久久久久久久精| 欧美亚洲不卡| 亚洲精品中文字幕在线观看| 久久国产精品久久国产精品| 亚洲伦理网站| 欧美国产日本| 亚洲精品久久久蜜桃| 欧美1区3d| 久久久水蜜桃av免费网站| 国产欧美日韩亚州综合| 亚洲一级黄色av| 一区二区三区国产盗摄| 欧美日韩不卡合集视频| 99亚洲一区二区| 亚洲国产cao| 欧美精品免费视频| 亚洲欧洲一区二区三区久久| 美女网站在线免费欧美精品| 欧美一区二区在线视频| 国产综合视频| 久久免费黄色| 久久久蜜桃精品| 伊人夜夜躁av伊人久久| 欧美成人午夜激情| 免费人成网站在线观看欧美高清 | 欧美精品aa| 亚洲伦伦在线| 亚洲人成小说网站色在线| 欧美96在线丨欧| 99精品久久| 9国产精品视频| 国产精品推荐精品| 久久成人在线| 久久综合伊人77777| 亚洲黄色高清| 99精品视频免费在线观看| 国产精品v欧美精品v日本精品动漫| 亚洲一区二区三区四区中文| 亚洲一区二区三区视频播放| 国产一级揄自揄精品视频| 裸体女人亚洲精品一区| 欧美成人免费小视频| 中文一区字幕| 性色av一区二区三区在线观看 | 极品日韩av| 亚洲日本欧美| 亚洲免费播放| 国产一区二区三区免费在线观看| 蜜桃久久精品乱码一区二区| 欧美二区在线| 午夜精品久久久久久久99樱桃 | 一区二区三区在线免费观看| 亚洲国产成人高清精品| 国产精品久久午夜| 美女久久一区| 欧美日韩一级片在线观看| 亚洲欧美综合| 久久先锋影音| 欧美一级大片在线观看| 另类av导航| 欧美一级久久久| 欧美国产日本在线| 久久夜色精品国产| 国产精品久久久久久久午夜片| 美女尤物久久精品| 国产精品日韩在线播放| 亚洲第一页在线| 国产一区二区高清| 这里只有视频精品| 日韩视频在线免费| 久久青草久久| 久久久av网站| 国产精品久久久久久久久搜平片| 欧美成人综合在线| 国内精品免费午夜毛片| 中国成人亚色综合网站| 亚洲精品在线免费| 久久久www成人免费精品| 亚洲欧美久久久| 欧美日韩国产三级| 亚洲电影免费观看高清完整版在线观看 | 国产日本欧美视频| 日韩一区二区精品葵司在线| 亚洲福利视频在线| 欧美一区二区三区四区高清 | 久久久久九九视频| 午夜精品久久久久久久99黑人| 欧美高清在线视频观看不卡| 久热精品在线| 国产字幕视频一区二区| 亚洲欧美色婷婷| 亚洲欧美日韩在线观看a三区| 欧美精品免费看| 亚洲精品一二| 亚洲特级片在线| 欧美视频日韩| 亚洲天堂久久| 国产精品久久久久久久7电影| 亚洲欧洲在线一区| 日韩特黄影片| 欧美日韩久久不卡| 99精品国产99久久久久久福利| 日韩视频在线免费观看| 欧美激情亚洲另类| 日韩视频免费观看| 一区二区欧美精品| 欧美日韩综合另类| 亚洲午夜免费视频| 久久精品夜色噜噜亚洲aⅴ| 国产视频在线观看一区二区| 久久不射网站| 欧美xxx在线观看| 亚洲精品视频在线观看免费| 欧美精品18| 亚洲砖区区免费| 久久乐国产精品| 亚洲精品乱码久久久久久按摩观| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲成色999久久网站| 一区二区国产在线观看| 国产精品一区免费视频| 久久久久免费| 亚洲日本中文| 欧美制服丝袜| 亚洲国产日韩在线| 欧美天天影院| 久久激情五月激情| 亚洲精品一线二线三线无人区| 亚洲男女毛片无遮挡| 极品尤物av久久免费看| 欧美激情1区2区3区| 亚洲永久精品国产| 欧美1区视频| 亚洲欧美清纯在线制服| 激情亚洲一区二区三区四区| 欧美精品一区二区三区视频| 亚洲一区美女视频在线观看免费| 欧美成人午夜剧场免费观看| 欧美一区二区三区久久精品茉莉花 | 亚洲一区不卡| 亚洲成色777777在线观看影院| 欧美精品系列| 久久国产视频网| 中文国产成人精品| 欧美成人r级一区二区三区| 亚洲女同同性videoxma| 亚洲大胆av| 国产一区二区三区电影在线观看| 欧美激情久久久久| 久久久久久久久蜜桃| 亚洲综合第一| 亚洲最新合集| 亚洲日韩视频| 免费短视频成人日韩| 久久国产欧美日韩精品| 亚洲一线二线三线久久久| 亚洲日韩欧美视频| 在线观看欧美精品| 国产自产女人91一区在线观看| 国产精品日韩| 国产精品青草综合久久久久99|