在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ 數(shù)據(jù)分析&挖掘/ hash表
hash表
單詞統(tǒng)計
鏈表排序
查找
可變參數(shù)
爬樓梯
內(nèi)存
prim算法 中
線性結構的處理
數(shù)據(jù)選擇
prim算法 上
循環(huán)單向鏈表
基數(shù)排序
堆排序
鏈表重合
排序二叉樹的保存和加載
圖添加和刪除
排序二叉樹線索化
非遞歸排序
字符串查找 下篇
鏈表逆轉
函數(shù)堆棧顯示
遞歸和堆棧
二叉樹深度遍歷
線性隊列
循環(huán)和遞歸
快速排序
尋找丟失的數(shù)
A*算法
克魯斯卡爾算法 下
排序二叉樹
大數(shù)計算
二叉樹廣度遍歷
prim算法 下
洗牌算法
圖結構
最大公約數(shù)、最小公倍數(shù)
圖創(chuàng)建
雙向鏈表
字符串查找 上篇
尋路
通用算法的編寫
哈夫曼樹 下
線性堆棧
八皇后
排序二叉樹刪除-1
挑選最大的n個數(shù)
字符串查找 中篇
哈夫曼樹 上
合并排序
回數(shù)
選擇排序
哈希二叉樹
通用數(shù)據(jù)結構
“數(shù)星星”
單向鏈表
排序二叉樹插入
圖的保存
排序二叉樹刪除-2
排序二叉樹刪除-3
n!中末尾零的個數(shù)統(tǒng)計

hash表

hash表,有時候也被稱為散列表。個人認為,hash表是介于鏈表和二叉樹之間的一種中間結構。鏈表使用十分方便,但是數(shù)據(jù)查找十分麻煩;二叉樹中的數(shù)據(jù)嚴格有序,但是這是以多一個指針作為代價的結果。hash表既滿足了數(shù)據(jù)的查找方便,同時不占用太多的內(nèi)容空間,使用也十分方便。

打個比方來說,所有的數(shù)據(jù)就好像許許多多的書本。如果這些書本是一本一本堆起來的,就好像鏈表或者線性表一樣,整個數(shù)據(jù)會顯得非常的無序和凌亂,在你找到自己需要的書之前,你要經(jīng)歷許多的查詢過程;而如果你對所有的書本進行編號,并且把這些書本按次序進行排列的話,那么如果你要尋找的書本編號是n,那么經(jīng)過二分查找,你很快就會找到自己需要的書本;但是如果你每一個種類的書本都不是很多,那么你就可以對這些書本進行歸類,哪些是文學類,哪些是藝術類,哪些是工科的,哪些是理科的,你只要對這些書本進行簡單的歸類,那么尋找一本書也會變得非常簡單,比如說如果你要找的書是計算機方面的書,那么你就會到工科一類當中去尋找,這樣查找起來也會顯得麻煩。

不知道這樣舉例你清楚了沒有,上面提到的歸類方法其實就是hash表的本質(zhì)。下面我們可以寫一個簡單的hash操作代碼。

a)定義hash表和基本數(shù)據(jù)節(jié)點

typedef struct _NODE
{
    int data;
    struct _NODE* next;
}NODE;

typedef struct _HASH_TABLE
{
    NODE* value[10];
}HASH_TABLE;

b)創(chuàng)建hash表

HASH_TABLE* create_hash_table()
{
    HASH_TABLE* pHashTbl = (HASH_TABLE*)malloc(sizeof(HASH_TABLE));
    memset(pHashTbl, 0, sizeof(HASH_TABLE));
    return pHashTbl;
}

c)在hash表當中尋找數(shù)據(jù)

NODE* find_data_in_hash(HASH_TABLE* pHashTbl, int data)
{
    NODE* pNode;
    if(NULL ==  pHashTbl)
        return NULL;

    if(NULL == (pNode = pHashTbl->value[data % 10]))
        return NULL;

    while(pNode){
        if(data == pNode->data)
            return pNode;
        pNode = pNode->next;
    }
    return NULL;
}

d)在hash表當中插入數(shù)據(jù)

STATUS insert_data_into_hash(HASH_TABLE* pHashTbl, int data)
{
    NODE* pNode;
    if(NULL == pHashTbl)
        return FALSE;

    if(NULL == pHashTbl->value[data % 10]){
        pNode = (NODE*)malloc(sizeof(NODE));
        memset(pNode, 0, sizeof(NODE));
        pNode->data = data;
        pHashTbl->value[data % 10] = pNode;
        return TRUE;
    }

    if(NULL != find_data_in_hash(pHashTbl, data))
        return FALSE;

    pNode = pHashTbl->value[data % 10];
    while(NULL != pNode->next)
        pNode = pNode->next;

    pNode->next = (NODE*)malloc(sizeof(NODE));
    memset(pNode->next, 0, sizeof(NODE));
    pNode->next->data = data;
    return TRUE;
}

e)從hash表中刪除數(shù)據(jù)

STATUS delete_data_from_hash(HASH_TABLE* pHashTbl, int data)
{
    NODE* pHead;
    NODE* pNode;
    if(NULL == pHashTbl || NULL == pHashTbl->value[data % 10])
        return FALSE;

    if(NULL == (pNode = find_data_in_hash(pHashTbl, data)))
        return FALSE;

    if(pNode == pHashTbl->value[data % 10]){
        pHashTbl->value[data % 10] = pNode->next;
        goto final;
    }

    pHead = pHashTbl->value[data % 10];
    while(pNode != pHead ->next)
        pHead = pHead->next;
    pHead->next = pNode->next;

final:
    free(pNode);
    return TRUE;
}

總結:

1、hash表不復雜,我們在開發(fā)中也經(jīng)常使用,建議朋友們好好掌握;

2、hash表可以和二叉樹形成復合結構,至于為什么,建議朋友們好好思考一下?