zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    python命令行工具模块-click
    python项目代码打包成Docker镜像
    背包九讲
    秒杀项目的3个奇数问题:并发队列的选择,请求接口的合理设计,高并发下的数据安全
    java类加载过程
    索引失效
    java面试
    进程间通信
    HashMap在Jdk1.7和1.8中的实现
    十大排序算法
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9423655.html
Copyright © 2011-2022 走看看