链地址法实现一个很简单的hash表

                    链地址法实现一个很简单的hash表
[1]hash函数定义
   根据key,计算出key对应记录的储存位置
   position = f(key)
   函数f就是hash函数

[2]hash冲突定义
    不同的key可能得到相同的position。原因为key值的范围过大。如int.
如果构造一个完全没有冲突的表。那么对应的地址空间就是4G,这是根本不
实现的。为了处理这个问题。就允许不同的key可以有相同的position。

[3]hash表定义
   映射的集合

[4]设计一个好的hash函数非常重要
   由[2]可知,一个好的hash函数可以使positions集中分布在某一段内存地址范围内。
   并且position在这段地址范围内存尽量均匀。这样每个key对应的position就尽可能
  少了,即hash冲突少。查找就会快一点。

[5]所谓的hash桶定义
   就是预分配的一段连续的储存空间

[6]处理冲突的方法
 (1)开放定址法:就是先指定一个桶,然后position = f(key,d),如果postion已经存在了,改变参数d,
     继续计算position = f(key,d),直到postion不存在
    d的不同取值的算法有:线性探测再散列,二次探测再散列,伪随机探测再散列。
     听这名字觉得好高深哦。实际上, 就是为了更高效地计算出没有使用的position
 (2)链地址法
     就是把position相同的item按插入的先后顺序组成一个链表

现用链地址法实现一个很简单的hash表

 

 

 

 


 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
哈希表是一种数据结构,用于实现字典或映射。哈希表使用哈希函数将键映射到存储桶中,以便快速查找值。地址哈希表的一种实现方式,它使用来解决哈希冲突的问题。下面是使用地址实现哈希表的C语言代码示例: 首先,定义一个哈希表节点的结构体: ``` typedef struct HashNode{ int key; int value; struct HashNode* next; }HashNode; ``` 哈希表节点包含键值对和一个指向下一个节点的指针。 接着,定义一个哈希表的结构体: ``` typedef struct HashTable{ int size; HashNode** table; }HashTable; ``` 哈希表包含一个大小和一个指向指针数组的指针。 接下来,实现哈希函数,将键映射到存储桶中: ``` int hash(int key, int size){ return key % size; } ``` 这里使用取模运算将键映射到存储桶中。 然后,实现哈希表的初始化函数: ``` HashTable* createHashTable(int size){ HashTable* ht = (HashTable*)malloc(sizeof(HashTable)); ht->size = size; ht->table = (HashNode**)malloc(sizeof(HashNode*) * size); for(int i = 0; i < size; i++){ ht->table[i] = NULL; } return ht; } ``` 这里使用malloc动态分配哈希表和指针数组的内存空间,并将指针数组中的元素初始化为NULL。 接下来,实现插入操作: ``` void insert(HashTable* ht, int key, int value){ int index = hash(key, ht->size); HashNode* node = (HashNode*)malloc(sizeof(HashNode)); node->key = key; node->value = value; node->next = ht->table[index]; ht->table[index] = node; } ``` 这里首先使用哈希函数计算键的索引,然后创建一个新的哈希节点并将其插入到的头部。 最后,实现查找操作: ``` int search(HashTable* ht, int key){ int index = hash(key, ht->size); HashNode* node = ht->table[index]; while(node != NULL){ if(node->key == key){ return node->value; } node = node->next; } return -1; } ``` 这里首先使用哈希函数计算键的索引,然后遍历该索引处的,查找对应的键值对。如果找到,则返回其值,否则返回-1。 以上就是使用地址实现哈希表的C语言代码示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值