• 哈希表


     
    【hash字典】

     

        1. typedef struct dict {  
        2.     dictType *type;//上边的type,为不同数据类型hash使用的回调函数,  
        3.     void *privdata;  //传给类型特定函数的可选参数
        4.     dictht ht[2]; //使用的两个hash表,主要是用来旧的到新的转换  
        5.     int rehashidx; /* rehashing not in progress if rehashidx == -1 */是否在使用  
        6.     int iterators; /* number of iterators currently running */数量  
        7. } dict;  
     
     
     

    【hash表】

     
        1. typedef struct dictht {  
        2.     dictEntry **table;  
        3.     unsigned long size;  
        4.     unsigned long sizemask;  
        5.     unsigned long used;  
        6. } dictht;  

     

    table 属性组成了一个数组,数组里带有节点指针,用作链表。

    size 、 sizemask 和 used 这三个属性初看上去让人有点头晕,实际上,它们分别代表的是:

    size :桶的数量,也即是, table 数组的大小。

    sizemask :这个值通过 size – 1 计算出来,给定 key 的哈希值计算出来之后,就会和这个数值进行 & 操作,决定元素被放到 table 数组的那一个位置上。

    used :这个值代表目前哈希表中元素的数量,也即是哈希表总共保存了多少 dictEntry 结构。

     

    【节点项】

     

     

     

    typedef struct dictEntry {
        void *key;
        union {
            void *val;
            uint64_t u64;
            int64_t s64;
            double d;
        } v;
        struct dictEntry *next;
    } dictEntry;

     

     

     

     

    【hash表迭代器】

     
        1. typedef struct dictIterator {  
        2.     dict *d;  
        3.     int table, index, safe;  
        4.     dictEntry *entry, *nextEntry;  
        5.     long long fingerprint; /* unsafe iterator fingerprint for misuse detection */  
        6. } dictIterator;  

     

    【hash算法回调函数】

     
        1. typedef struct dictType {  
        2.     unsigned int (*hashFunction)(const void *key);  
        3.     void *(*keyDup)(void *privdata, const void *key);  
        4.     void *(*valDup)(void *privdata, const void *obj);  
        5.     int (*keyCompare)(void *privdata, const void *key1, const void *key2);  
        6.     void (*keyDestructor)(void *privdata, void *key);  
        7.     void (*valDestructor)(void *privdata, void *obj);  
        8. } dictType;  
     

    该数据结构,用来指定hash算法的一些回调函数,比如key 比较,复制等。

     
    dictEntry *dictAddRaw(dict *d, void *key)  
    {  
        int index;  
        dictEntry *entry;  
        dictht *ht;
     
        if (dictIsRehashing(d)) _dictRehashStep(d);  
     
        /* Get the index of the new element, or -1 if
         * the element already exists. */  
        if ((index = _dictKeyIndex(d, key)) == -1)  
            return NULL;  
     
        /* Allocate the memory and store the new entry */  
        ht = dictIsRehashing(d) ? &d->ht[1] : &d->ht[0];  
        entry = zmalloc(sizeof(*entry));  
        entry->next = ht->table[index];  
        ht->table[index] = entry;  
        ht->used++;  
     
        /* Set the hash entry fields. */  
        dictSetKey(d, entry, key);  
        return entry;  
    }  

     

  • 相关阅读:
    Educational Codeforces Round 19 题解【ABCDE】
    喵哈哈村的魔法考试 Round #14 (Div.2) 题解
    Codeforces Round #408 (Div. 2) 题解【ABCDE】
    喵哈哈村的魔法考试 Round #13 (Div.2) 题解
    喵哈哈村的魔法考试 Round #12 (Div.2) 题解
    April Fools Contest 2017 题解
    Kaggle Titanic solution 纯规则学习
    喵哈哈村的魔法考试 Round #11 (Div.2) 题解
    Codeforces Round #406 (Div. 1) B. Legacy 线段树建图跑最短路
    Codeforces Round #407 div2 题解【ABCDE】
  • 原文地址:https://www.cnblogs.com/lsx1993/p/4614884.html
Copyright © 2020-2023  润新知