IT培训机构|91免费精品视频|专注编程培训|91免费精品|软件开发培训_91免费国产视频_华清远见教育

當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 數(shù)據(jù)結(jié)構(gòu)哈希表怎么設(shè)計(jì)及實(shí)現(xiàn)

數(shù)據(jù)結(jié)構(gòu)哈希表怎么設(shè)計(jì)及實(shí)現(xiàn) 時(shí)間:2018-01-26      來源:未知

數(shù)據(jù)結(jié)構(gòu)一直都是軟件工程師必備技能之一,也是難點(diǎn)之一。數(shù)據(jù)結(jié)構(gòu)其實(shí)是數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),它采用不同的存儲(chǔ)方式和邏輯思路,實(shí)現(xiàn)各種數(shù)據(jù)和數(shù)據(jù)之間的關(guān)聯(lián),并且加上對(duì)應(yīng)的算法,來解決問題。哈希表(散列表)是數(shù)據(jù)結(jié)構(gòu)中一種散列存儲(chǔ)方式,優(yōu)點(diǎn)在于關(guān)鍵值key可以通過指定的算法直接得到數(shù)據(jù)的存儲(chǔ)位置hash(key),這樣一來不需要輪詢,時(shí)間復(fù)雜度大大的降低。從而,哈希表滿足了對(duì)數(shù)據(jù)操作高效率的要求。但是,哈希表也不是全能的,它的使用有一定的局限性。下面我們來介紹一下哈希表的設(shè)計(jì)和實(shí)現(xiàn)。

哈希表的設(shè)計(jì)

哈希表主要是確認(rèn)關(guān)鍵值key和關(guān)鍵值存儲(chǔ)位置hash(key)之間的具體關(guān)聯(lián)算法。并且保證少的哈希沖突(多個(gè)不同數(shù)據(jù)通過算法得到存儲(chǔ)位置相同,這時(shí)就是哈希沖突)產(chǎn)生。常見的哈希表的設(shè)置方法如下:

(1)直接定址法:直接的構(gòu)造哈希表的方法,存儲(chǔ)位置是通過線性函數(shù)得到的:

hash(key) = a * key + b {a、b為常數(shù)}

特點(diǎn):這樣得到的 hash(key) 和 key之間一一對(duì)應(yīng),一般不會(huì)產(chǎn)生沖突;

空間:這的哈希表要求地址空間大小與key集合大小相同;

應(yīng)用:一般用于有序的key集合,例如各種編號(hào)。

(2)數(shù)字分析法: 分析已有數(shù)據(jù)的特點(diǎn),選擇盡量沖突少的數(shù)字來構(gòu)造哈希表。

特點(diǎn):數(shù)據(jù)是多位組成,數(shù)據(jù)和數(shù)據(jù)之間有相同的也有不同的,根據(jù)數(shù)據(jù)中每位的分布特點(diǎn),選取若干位作為哈希表地址。

空間:根據(jù)選擇的位的個(gè)數(shù)而定;

應(yīng)用:數(shù)據(jù)位數(shù)多,且都相似, 例如生日,日期等等。

(3)除留余數(shù)法:n個(gè)數(shù)據(jù),選取一個(gè)接近于n的質(zhì)數(shù)p,這時(shí)哈希地址公式:

hash(key) = key % p 除法后得到的余數(shù)就是數(shù)據(jù)存儲(chǔ)位置

特點(diǎn):余數(shù)的取值范圍 0 到 p-1 內(nèi),這樣存儲(chǔ)數(shù)據(jù)空間大小是固定的 p 個(gè);

空間:p個(gè)存儲(chǔ)空間;

應(yīng)用: 數(shù)據(jù)值較大,數(shù)據(jù)個(gè)數(shù)較少。

(4)乘余取整法:先讓關(guān)鍵值key乘上一個(gè)常數(shù)A(0 <1),提取乘積的小數(shù)部分。然后再用整數(shù)n乘以這個(gè)值,對(duì)結(jié)果向下取整,這個(gè)結(jié)果就是存儲(chǔ)位置。<>

公式:hash(key) = (int)((((float)key*A) - (int)(key*A))*n)

應(yīng)用:數(shù)據(jù)是小數(shù),并且相差很少。

(5)平方取中法:一般哈希地址位置數(shù)據(jù)2的某次冪,例如:哈希地址總數(shù)為 m = 2^r。哈希地址hash(key) = 2^key 值中間的r位。

(6)折疊法:數(shù)據(jù)信息很長(zhǎng),可以將數(shù)據(jù)從左到有分成幾個(gè)部分,每部分位數(shù)應(yīng)與hash(key)存儲(chǔ)位置的位數(shù)相同,將每部分都疊加求和,這個(gè)和就是hash(key)存儲(chǔ)位置。

應(yīng)用:例如:圖書館中圖書的標(biāo)準(zhǔn)編號(hào)。

(7)隨機(jī)數(shù)法:獲取一個(gè)隨機(jī)數(shù),作為存儲(chǔ)位置,公式:hash(key) = random(key);

應(yīng)用:key關(guān)鍵字長(zhǎng)度不等時(shí)使用。

哈希表的實(shí)現(xiàn)

這里我們以第三種方式除留余數(shù)法舉例。

例子:已知存在以下數(shù)據(jù) : 23 , 26 , 29 ,30,34 ,40

利用哈希表存儲(chǔ)上面數(shù)據(jù),并寫出查找方法。

第一步:確認(rèn)hash(key)和key之間的關(guān)聯(lián)公式

數(shù)據(jù)有6個(gè),先選取一個(gè)質(zhì)數(shù)p = 7 或 11或 13

為盡量減少哈希沖突,當(dāng)選擇p=7時(shí):余數(shù)2 5 1 2 6 5有沖突

當(dāng)選擇p=11時(shí):余數(shù)1 4 7 8 1 6有沖突

當(dāng)選擇p=13時(shí):余數(shù)10 0 3 4 8 1無沖突

所以公式:hash(key) = key % 13;

實(shí)現(xiàn)代碼:
#include<stdio.h>
typedef int data_t;
#define M 13
int emptyHash(data_t *p)  // 判斷哈希地址中是否空閑
{
         return *p == 0 ? 1:0;
}
int setHash(data_t *hp,data_t key)
{
         int i = key % M;
         if(emptyHash(&hp[i]))      // 判讀指定位置是否空閑
                   hp[i] = key;                  // 存儲(chǔ)到哈希表中
         else 
return 0;       // 失敗
         return 1;           // 成功
}
int getHash(data_t *hp,data_t key)
{
         int i = key % M;
         if(hp[i] != key)    
         {
                   printf("數(shù)據(jù)沒有存儲(chǔ)到哈希表中\(zhòng)n");
                   return 0;
         }
         else
                   printf("數(shù)據(jù)在哈希表中,位置%d --> %d\n",i, hp[i]);
         return 1;
}
int main()
{
         data_t hash[13] = {0};          // 定義一個(gè)哈希表(數(shù)組)存儲(chǔ)數(shù)據(jù)空間
         setHash(hash,23);
         setHash(hash,26);
         setHash(hash,29);           // 哈希表中存入數(shù)據(jù)
         setHash(hash,30);
         setHash(hash,34);
         setHash(hash,40);
         getHash(hash,34);           // 查找哈希表
         getHash(hash,32);                    
         return 0;
}

上一篇:嵌入式系統(tǒng)移植步驟

下一篇:嵌入式linux啟動(dòng)過程分析

熱點(diǎn)文章推薦
華清學(xué)員就業(yè)榜單
高薪學(xué)員經(jīng)驗(yàn)分享
熱點(diǎn)新聞推薦
前臺(tái)專線:010-82525158 企業(yè)培訓(xùn)洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠(yuǎn)見科技集團(tuán)有限公司 版權(quán)所有 ,京ICP備16055225號(hào)-5京公海網(wǎng)安備11010802025203號(hào)

回到頂部

主站蜘蛛池模板: 消防施工,消防工程施工,消防施工改造-北京消防工程公司-亿杰(北京)消防工程有限公司 | 微EAM - EHS安全管理系统-设备管理系统-设备全生命周期管理软件-HSE安全管理软件 | 消泡剂_有机硅消泡剂_水处理消泡剂_新万成消泡剂厂家 | 中婴网,推动母婴产业健康·可持续发展,婴童网络专业传媒,母婴网,360孕婴童网,婴童品牌,婴儿用品品牌,婴儿用品加盟店,母婴用品加盟店 | 无锡纯铁-中纯特钢纯铁公司 | 江西挤塑板_挤塑板厂家_挤塑板价格-江合保温材料 | 麦秸映像网络技术有限公司,河南省政府采网入驻对接,新乡网站维护建设,小程序开发,APP定制开发,钉钉开发,新乡软件开发等相关网络业务 | 仪器校准-计量检测-计量校准-中健计量检测(广东)有限公司 | 聚丙烯酰胺,聚合氯化铝,重金属捕捉剂,污泥调理剂,活性氧化铝,生石灰,反渗透阻垢剂,工业葡萄糖,硫酸铝,果壳活性炭,柱状活性炭,蜂窝活性炭,石英砂,锰砂-北京雁归来环保科技有限公司-以真诚为立足之本,以质量为生存之本,愿与海内外同仁共创双赢。雁归来人一路走来,气贯长虹,勇锐盖过怯弱,进取压倒苟安!我们紧扣时代脉搏,专注水处理、继往开来! | 机械设备回收_二手机器回收_设备拆除回收_广州益美机械设备回收公司 | 无线计量仪表-电力物联网仪表-CE认证电表 | 中科先农农业(河北)智能设备有限责任公司 | 江门市金环电器有限公司 | 外圆/圆管抛光机_方管抛光机/除锈机_活塞杆抛光机-不锈钢管抛光机-邢台欧邦机械 | 深圳彩盒印刷-纸盒包装-不干胶标签印刷-深圳印刷厂家-深圳贝的印刷 | 气动法兰软密封蝶阀-电动高温通风蝶阀-气动开关球阀-川沪阀门 | 塑木地板-木塑地板厂家「云南昆明楚雄曲靖玉溪塑木地板」云南云冶中信塑木新型材料有限公司 | 消防车厂家_东风水罐泡沫消防车价格图片吨位-湖北新东日专用汽车有限公司 | 液体粉末包装机_颗粒粉剂自动包装机-上海巧慈自动化设备有限公司 | 西安logo设计公司/西安包装设计公司/西安画册设计公司/西安广告公司/西安品牌设计公司/泰勒广告 雾度计-雾度仪-透光率测试仪-3nh品牌雾度仪生产厂家 | 上海译擎金属材料有限公司| 宁波刑事辩护律师-建设工程律师-工程款合同律师-喻明辉律师 | 豪顺物流官网-南京物流公司,南京货运公司「全国专线配送」 | 深圳钢成培训专业从事,五轴培训,车铣复合培训,数控车床,CNC数控编程,模具编程 ,钣金机械与模具设计,powermill,mastercam,solidworks,ug,hypermill培训 | 湖北江南专用特种汽车有限公司官方网站 | 随州市恒利达包装制造有限公司| 上海喷涂厂|上海喷漆厂|粉末喷涂|平湖喷涂厂|平湖喷漆厂-平湖华梦金属科技有限公司 | 叛逆孩子改造,青少年行为矫正,戒网瘾学校,特训学校,全封闭军事化管理学校 | 木马交互设计研究中心 ,专注于用户体验与人机交互设计 - 首页 | 塑料植草格_停车场植草格_消防车道植草格厂家_山东朋联建材 | 南通市科脉电子科技有限公司| 智汇工业-智慧工业、智能制造及工业智能、工业互联门户网站,专业的工业“互联网+”传媒 | 四合扣-工字扣-帽钉(831,200,警用,大拉力四合扣)-永嘉县鑫达钮扣有限公司 | 普利卡管|普利卡管接头|普利卡接头-上海闵彬管业有限公司 | 潍坊网络推广,临沂360推广,东营360推广,枣庄360推广,潍坊网站建设,潍坊网络公司,潍坊360搜索,潍坊APP开发,潍坊360推广,潍坊360代理,潍坊点睛网络科技有限公司 | 耐磨涂料_陶瓷涂料_高温涂料_高硬度耐磨涂料-北京耐默科技 | 亚洲一区日韩一区欧美一区a,中文字幕乱妇无码AV在线,欧美日韩免费在线观看,国产精品一区二区三区免费,日韩精品免费一线在线观看,日韩一本在线,国产呦精品一区二区三区下载,国产日韩精品一区二区在线观看,欧美日韩高清一区二区三区,日韩在线免费观看视频,欧美日韩一区在线观看 | 围挡厂家_施工围挡_PVC围挡_建筑工程围挡_深圳市旭东钢构技术开发有限公司【官网】 | 妙手网-圆心大药房-广东圆心恒金堂医药连锁有限公司-放心的网上药店_妙手医生旗下正规网上买药平台 | 宿迁网站建设-宿迁做网站-宿迁网站制作-宿迁网络公司-宿迁网页设计-宿迁软件开发-宿迁新动力软件开发有限公司 | 景观灯-庭院灯-多功能路灯-高杆灯-智慧灯杆生产厂家-扬州景尚光电 |