亚洲精品一二区_国产黄色片网站_99久久久成人国产精品_蜜臀网_国产精品一区二区三区免费_成人av中文字幕_91精品国产欧美一区二区成人

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > 數據結構哈希表怎么設計及實現

數據結構哈希表怎么設計及實現 時間:2018-01-26      來源:未知

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

哈希表的設計

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

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

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

特點:這樣得到的 hash(key) 和 key之間一一對應,一般不會產生沖突;

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

應用:一般用于有序的key集合,例如各種編號。

(2)數字分析法: 分析已有數據的特點,選擇盡量沖突少的數字來構造哈希表。

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

空間:根據選擇的位的個數而定;

應用:數據位數多,且都相似, 例如生日,日期等等。

(3)除留余數法:n個數據,選取一個接近于n的質數p,這時哈希地址公式:

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

特點:余數的取值范圍 0 到 p-1 內,這樣存儲數據空間大小是固定的 p 個;

空間:p個存儲空間;

應用: 數據值較大,數據個數較少。

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

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

應用:數據是小數,并且相差很少。

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

(6)折疊法:數據信息很長,可以將數據從左到有分成幾個部分,每部分位數應與hash(key)存儲位置的位數相同,將每部分都疊加求和,這個和就是hash(key)存儲位置。

應用:例如:圖書館中圖書的標準編號。

(7)隨機數法:獲取一個隨機數,作為存儲位置,公式:hash(key) = random(key);

應用:key關鍵字長度不等時使用。

哈希表的實現

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

例子:已知存在以下數據 : 23 , 26 , 29 ,30,34 ,40

利用哈希表存儲上面數據,并寫出查找方法。

第一步:確認hash(key)和key之間的關聯公式

數據有6個,先選取一個質數p = 7 或 11或 13

為盡量減少哈希沖突,當選擇p=7時:余數2 5 1 2 6 5有沖突

當選擇p=11時:余數1 4 7 8 1 6有沖突

當選擇p=13時:余數10 0 3 4 8 1無沖突

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

實現代碼:
#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;                  // 存儲到哈希表中
         else 
return 0;       // 失敗
         return 1;           // 成功
}
int getHash(data_t *hp,data_t key)
{
         int i = key % M;
         if(hp[i] != key)    
         {
                   printf("數據沒有存儲到哈希表中\n");
                   return 0;
         }
         else
                   printf("數據在哈希表中,位置%d --> %d\n",i, hp[i]);
         return 1;
}
int main()
{
         data_t hash[13] = {0};          // 定義一個哈希表(數組)存儲數據空間
         setHash(hash,23);
         setHash(hash,26);
         setHash(hash,29);           // 哈希表中存入數據
         setHash(hash,30);
         setHash(hash,34);
         setHash(hash,40);
         getHash(hash,34);           // 查找哈希表
         getHash(hash,32);                    
         return 0;
}

上一篇:嵌入式系統移植步驟

下一篇:嵌入式linux啟動過程分析

熱點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

主站蜘蛛池模板: 日本免费看片网站 | 日本一道高清不卡免费 | 久久99国产亚洲高清 | 人人澡 人人澡碰人人看软件 | 精品99视频 | 激情在线网站 | 久久这里只有精品免费播放 | 日本一区二区在线免费观看 | 黄色在线播放 | 免费在线日本 | 天天色综合1 | 青青热久久国产久精品秒播 | 免费看真人a一级毛片 | 日本高清不卡一区久久精品 | 视频在线观看一区二区 | 国产精品白嫩在线观看 | 精品日本三级在线观看视频 | 日本免费不卡在线一区二区三区 | 日日摸日日碰夜夜爽视频网站 | xxxx欧美69免费 | 久久久这里有精品 | 免费香蕉成视频成人网 | 69日本人 | 日本在线免费观看视频 | 色成人在线 | 国产一二三四2022精字窝 | 亚洲欧美v视色一区二区 | aaaa大片| 天天爽天天干 | 中文字幕一区二区三区在线观看 | 激情六月婷婷 | 国产日韩在线观看视频 | 另类视频在线观看 | 青娱乐手机免费视频 | 国产一级鲁丝片 | 中文字幕日韩三级 | 欧美xxxwww | 黄色大片在线观看 | 噜噜噜久久| 精品久久久久久亚洲精品 | 国产女人在线 |