zoukankan      html  css  js  c++  java
  • dict, hash

    dict: 

      dictKey -- > dictVal

    example:

         dictEntry *dictFind(dict *d, const void *key)
         Key is like a index which to find the real entry.

    how to find:

      depend on the construction of dict.

           if dict is constructed by arr then we get arr[i]. key is not integer usual and here the array is a map.

      if dict is constructed by hash table, then we get hash table value.

    redis code dictFind:

      

    typedef struct dict {
        dictType *type;
        void *privdata;
        dictht ht[2];
        long rehashidx; /* rehashing not in progress if rehashidx == -1 */
        int iterators; /* number of iterators currently running */
    } dict;
    
    typedef struct dictht {
        dictEntry **table;
        unsigned long size;
        unsigned long sizemask;
        unsigned long used;
    } dictht;
    

      

    dictEntry *dictFind(dict *d, const void *key)
    {
        dictEntry *he;
        unsigned int h, idx, table;
    
        if (d->ht[0].size == 0) return NULL; /* We don't have a table at all */
        if (dictIsRehashing(d)) _dictRehashStep(d);
        h = dictHashKey(d, key);
        for (table = 0; table <= 1; table++) {
            idx = h & d->ht[table].sizemask;
            he = d->ht[table].table[idx];
            while(he) {
                if (dictCompareKeys(d, key, he->key))
                    return he;
                he = he->next;
            }
            if (!dictIsRehashing(d)) return NULL;
        }
        return NULL;
    }
    
    

      key -> hashValue -> &hashMask -> hashIndex -> hashTable[hashIndex] (hashTableEleList[idx]) -> hashTableEleList[idx][j]

      dictKey ----------------------------------------------------------------------------------------------------------------------> dictVal

    why hash:

       

         no  hash table , store m * n elems. 

      hash, store m list head.

        seraching, storing...

        比如 dict 是个管理仓库的,仓库管理员按客人的姓名笔划来分架子。李一一来取货,dict算下李的在8号架子上,但是是8号架上的哪个柜子,要一个个来查看,只能根据姓名来一一对比了,最终找到客人的柜子,那个大的东西,肯定不好拿了,直接告诉李一一你的柜子地址就好了,让李一一去自己去对这个柜子中的东西操作。
      

  • 相关阅读:

    高度优化
    c++函数学习-关于c++函数的林林总总
    重载操作符
    【一周一算法】算法7:Dijkstra最短路算法
    【一周一算法】算法6:只有五行的Floyd最短路算法
    【一周一算法】算法4:解密QQ号——队列
    【一周一算法】小哼买书
    【一周一算法】算法3:最常用的排序——快速排序
    【一周一算法】算法2:邻居好说话——冒泡排序
  • 原文地址:https://www.cnblogs.com/ashen/p/11301828.html
Copyright © 2011-2022 走看看