• HashTable 解决碰撞(冲突)的方法 —— 分离链接法(separate chaining)


    1. ListNode 及 HashTable 的类型声明

    • 声明

      typedef int ElementType;
      typedef unsigned int Index;
      
      struct ListNode;
      typedef struct ListNode* Position;
      struct HashTbl;
      typedef struct HashTbl* HashTable;
      
      HashTable InitHashTable(int TableSize);
      void DestroyHashTable(HashTable H);
      Position Find(ElementType Element, HashTable H);
      void Insert(ElementType Element, HashTable H);;
      ElementType Retrieve(Position P);
    • 定义

      struct ListNode{
          ElementType Element;
          Position Next;  
      };
      
      typedef Position List;
      
      struct HashTbl {
          int TableSize;
          List* TheLists; 
      };

    2. HashTable 的构建

    HashTable InitHashTable(int TableSize){
        HashTable H;
        if (TableSize < MinTableSize){
            Error(" ... ");
            return NULL;
        }
    
        H = (HashTable)malloc(sizeof(struct HashTbl));
        if (!H)
            FatalError("out of space !!!");
        H->TableSize = NextPrime(TableSize);
        H->TheLists = (List*)malloc(sizeof(struct ListNode)*H->TableSize);
    
        for (int i = 0; i < H->TableSize; ++i){
            H->TheLists[i] = (List)malloc(sizeof(struct ListNode));
            if (!H->TheLists[i])
                FatalError("");
            else
                H->TheLists[i]->Next = NULL;
        }
    }

    3. 插入新的结点

    void Insert(ElementType Key, HashTable H){
        Position Pos, NewCell;
        List L;
        Pos = Find(key, H);
        if (!Pos){
            NewCell = (Position)malloc(sizeof(struct ListNode));
            if (!NewCell)
                FatalError("");
            L = H->TheLists[Hash(Key, H->TableSize)];
            NewCell->Next = L->Next;
                                        // 插入在首部
            NewCell->Element = Key;
            L->Next = NewCell->Next;
        }
    }
  • 相关阅读:
    01背包----简单DP
    小a的计算器
    BZOJ3160 万径人踪灭 【fft + manacher】
    BZOJ3527 [Zjoi2014]力 【fft】
    BZOJ2194 快速傅立叶之二 【fft】
    BZOJ2123 [Sdoi2013]森林 【主席树 + 启发式合并】
    BZOJ3720 Gty的妹子树 【树分块】
    洛谷P1822 魔法指纹 【分块打表】
    洛谷3396 哈希冲突 【分块】
    分块算法
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9423656.html
Copyright © 2020-2023  润新知