散列,桶排序

一、散列原理

      理想的散列结构不过是一个包含关键字的具有固定大小的数组,散列表的长度是数据结构的一部分。散列中的关键字不需要支持比较大小,只要能够支持判等操作就行了。每个关键字按照一个散列函数被映射到0到TableSize-1范围内的桶单元。当不同的关键字被映射到相同的单元时,称作冲突(conflict)。散列的插入,查找,删除都是常数时间复杂度。
      常见的散列方法有除余法hash(key)=key%M,字符串为key时也常对字符求和作为散列值。

二、闭路定址


      散列表的值为一个指向链表节点的指针,当对应的桶单元被占用时,将对应的值插入到对应的链表中(比如插入到链表的

头结点),这种方式节省空间,删除操作简单,但是需要动态的申请节点内存,影响速度,并且空间分布不连续,系统缓存

失效,I/O次数增多。

//结构定义
struct ListNode;
typedef struct ListNode* Position;
struct HashTbl;
typedef struct HashTbl *HashTable;
HashTable InitializeTable(int TableSize);
void DestroyTable(HashTable H);
Position Find(ElementType Key,HashTable H);
void Insert(ElementType Key,HashTable H);
ElementType Retrieve(Position P);
struct ListNode
{
    ElementType Element;
    Position Next;
}
typedef Position List;
struct HashTbl
{
    int TableSize;
    List* TheLists;//二级指针,表示存放节点地址的数组;
}