zoukankan      html  css  js  c++  java
  • 开放定址法+平方探测法+再散列

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <stdbool.h>
      4 
      5 typedef int ElementType;
      6 enum KindOfEntry {Legitimate,Empty,Deleted};
      7 
      8 struct OAHashListNode
      9 {
     10     ElementType Element;
     11     int ExistNum;
     12     enum KindOfEntry State;
     13 };
     14 
     15 struct OAHashTable
     16 {
     17     int TableSize;
     18     int CurrentSize;
     19     struct OAHashListNode *OAHashNodeList;
     20 };
     21 
     22 bool _isPrime(int Input)
     23 {
     24     if (Input == 2 || Input == 3)
     25     {
     26         return true;
     27     }
     28     if (Input % 6 != 1 && Input % 6 != 5)
     29     {
     30         return false;
     31     }
     32     int i;
     33     for (i = 5; i*i <= Input; i += 6)
     34     {
     35         if (Input % i == 0 || Input % (i+2) == 0)
     36         {
     37             return false;
     38         }
     39     }
     40     return true;
     41 }
     42 
     43 int NextPrime(int Input)
     44 {
     45     bool state = _isPrime(Input);
     46     while(!state)
     47     {
     48         state = _isPrime(++Input);
     49     }
     50     return Input;
     51 }
     52 
     53 int Hash(ElementType Key,int TSize)
     54 {
     55     return Key % TSize;
     56 }
     57 
     58 struct OAHashTable* OAHashTableInit(int TableSizeInput)
     59 {
     60     struct OAHashTable *HashTable;
     61     int i;
     62 
     63     HashTable = malloc(sizeof(struct OAHashTable));
     64     HashTable -> TableSize = NextPrime(TableSizeInput);
     65     HashTable -> CurrentSize = 0;
     66     HashTable -> OAHashNodeList = malloc(HashTable->TableSize*sizeof(struct OAHashListNode));
     67 
     68     for(i = 0; i < HashTable -> TableSize; i ++)
     69     {
     70         HashTable -> OAHashNodeList[i].State = Empty;
     71         HashTable -> OAHashNodeList[i].ExistNum = 0;
     72     }
     73     return HashTable;
     74 }
     75 
     76 void OAHashTableDelete(struct OAHashTable* HashTable)
     77 {
     78     free(HashTable->OAHashNodeList);
     79 }
     80 
     81 //if doesn't find,return a index that HashTable->OAHashNodeList[Index].State == Empty
     82 int OAHashListNodeFind(struct OAHashTable* HashTable,ElementType ToBeFind)
     83 {
     84     int Index;
     85     int TmpAssist = 0;
     86 
     87     Index = Hash(ToBeFind,HashTable->TableSize);
     88     //F(i) = F(i-1) + 2i - 1
     89     while(HashTable->OAHashNodeList[Index].State != Empty
     90             && HashTable->OAHashNodeList[Index].Element != ToBeFind)
     91     {
     92         Index += 2 * ++TmpAssist - 1;
     93         if(Index >= HashTable->TableSize)
     94             Index -= HashTable->TableSize;
     95     }
     96     return Index;
     97 }
     98 
     99 struct OAHashTable* OAHashListRehash(struct OAHashTable* HashTable)
    100 {
    101     int i,OldSize,OldCurrent;
    102     struct OAHashListNode* OldNodes;
    103     struct OAHashTable* NewHashTable;
    104     
    105     OldNodes = HashTable->OAHashNodeList;
    106     OldSize = HashTable->TableSize;
    107     OldCurrent = HashTable->CurrentSize;
    108     
    109     NewHashTable = OAHashTableInit(2*OldSize);
    110     NewHashTable->CurrentSize = OldCurrent;
    111     for(i = 0;i < OldSize;i ++)
    112     {
    113         if(OldNodes[i].State == Legitimate)
    114         {
    115             int Index = OAHashListNodeFind(NewHashTable,OldNodes[i].Element);
    116         //    printf("%d
    ",Index);
    117             NewHashTable->OAHashNodeList[Index].Element = OldNodes[i].Element;
    118             NewHashTable->OAHashNodeList[Index].ExistNum = OldNodes[i].ExistNum;
    119             NewHashTable->OAHashNodeList[Index].State = OldNodes[i].State;
    120         }
    121     }
    122     OAHashTableDelete(HashTable);
    123     return NewHashTable;
    124 }
    125 
    126 struct OAHashTable* OAHashListNodeInsert(struct OAHashTable* HashTable,ElementType ToBeInsert)
    127 {
    128     int Index;
    129 
    130     Index = OAHashListNodeFind(HashTable,ToBeInsert);
    131 
    132     HashTable->OAHashNodeList[Index].State = Legitimate;
    133     HashTable->OAHashNodeList[Index].Element = ToBeInsert;
    134     HashTable->OAHashNodeList[Index].ExistNum ++;
    135     HashTable->CurrentSize ++;
    136     
    137     if(2*HashTable->CurrentSize >= HashTable->TableSize)
    138     {
    139         struct OAHashTable* NewHashTable = OAHashListRehash(HashTable);
    140         HashTable = NewHashTable;
    141         return NewHashTable;
    142     }
    143     return HashTable;
    144 }
    145 
    146 //return the ExistNum,if not find return -1,if error return -2
    147 int OAHashListNodeDelete(struct OAHashTable* HashTable,ElementType ToBeDelete)
    148 {
    149     int Index;
    150     
    151     Index = OAHashListNodeFind(HashTable,ToBeDelete);
    152     if(HashTable->OAHashNodeList[Index].State == Empty)
    153     {
    154         return -1;
    155     }
    156     else
    157     {
    158         HashTable->OAHashNodeList[Index].State = Deleted;
    159         HashTable->OAHashNodeList[Index].ExistNum --;
    160         return HashTable->OAHashNodeList[Index].ExistNum;
    161     }
    162     
    163     return -2;
    164 }
    165 
    166 int main()
    167 {
    168     struct OAHashTable* HashTable = OAHashTableInit(5);
    169     
    170     HashTable = OAHashListNodeInsert(HashTable,23);
    171     HashTable = OAHashListNodeInsert(HashTable,23);
    172     HashTable = OAHashListNodeInsert(HashTable,23);
    173     OAHashListNodeDelete(HashTable,23);
    174     HashTable = OAHashListNodeInsert(HashTable,47);
    175     HashTable = OAHashListNodeInsert(HashTable,50);
    176     
    177     int OutputIndex = OAHashListNodeFind(HashTable,23);
    178     printf("%d %d
    ",HashTable->OAHashNodeList[OutputIndex].Element,HashTable->OAHashNodeList[OutputIndex].ExistNum);
    179     OutputIndex = OAHashListNodeFind(HashTable,47);
    180     printf("%d %d
    ",HashTable->OAHashNodeList[OutputIndex].Element,HashTable->OAHashNodeList[OutputIndex].ExistNum);
    181     OutputIndex = OAHashListNodeFind(HashTable,39);
    182 
    183     if(HashTable->OAHashNodeList[OutputIndex].State == Empty)
    184         printf("where is my princess Hatsune Miku?
    ");
    185     OAHashTableDelete(HashTable);
    186     return 0;
    187 }
  • 相关阅读:
    python中的编码问题
    CVPR2018 Tutorial 之 Visual Recognition and Beyond
    hdu 1376 Octal Fractions
    hdu 1329 Hanoi Tower Troubles Again!
    hdu 1309 Loansome Car Buyer
    hdu 1333 Smith Numbers
    hdu 1288 Hat's Tea
    hdu 1284 钱币兑换问题
    hdu 1275 两车追及或相遇问题
    hdu 1270 小希的数表
  • 原文地址:https://www.cnblogs.com/Asurudo/p/9432933.html
Copyright © 2011-2022 走看看