C语言实现Hash Map(1):Map基础知识入门

Map(映射)是一种重要的数据结构,用于存储键值对。它提供了一种高效的方式来存储和检索数据。常见的Map实现有基于哈希表的Hash Map和基于平衡二叉树的红黑树Map。在这篇博客中,我们将介绍Map的基础知识,探索不同的Map实现,并简要介绍C++中的这两种实现。

1 基础知识学习

1.1 什么是Map?

Map是一种关联容器,它存储键值对(key-value pairs),通过键(key)来快速查找对应的值(value)。它支持以下主要操作:

  • 插入(Insert):将一个键值对插入Map。
  • 查找(Find):根据键查找对应的值。
  • 删除(Delete):从Map中删除一个键值对。

1.2 为什么使用Map?

Map提供了高效的数据存储和检索方法,常用于需要快速访问数据的场景。例如,符号表、缓存系统、数据库索引等都广泛使用Map数据结构。

2 不同的Map实现原理

2.1 Hash Map

Hash Map是一种基于哈希表的数据结构,它通过哈希函数将键映射到哈希表中的桶(bucket),从而实现快速的查找、插入和删除操作。

原理图示

在这里插入图片描述

2.1.1 哈希函数

哈希函数将键转换为整数(哈希值),然后使用哈希值确定键在哈希表中的位置。一个好的哈希函数应当均匀分布键以减少冲突。

2.1.2 哈希冲突

当两个不同的键产生相同的哈希值时,就会发生哈希冲突。解决哈希冲突的方法包括:

  • 链地址法:每个桶存储一个链表,冲突的键值对将被添加到链表中。
  • 开放寻址法:当冲突发生时,寻找下一个空闲位置存储键值对。

链地址法图示

在这里插入图片描述

2.2 红黑树Map

红黑树是一种自平衡二叉搜索树,确保插入、删除和查找操作的时间复杂度为O(log n)。它通过节点的颜色(红或黑)和一系列平衡规则来保持树的平衡。

红黑树图示

在这里插入图片描述

3 C++中的Map实现

3.1 std::map

std::map 是C++标准库提供的基于红黑树实现的有序映射。它按照键的顺序存储键值对,插入、删除和查找操作的时间复杂度为O(log n)。这意味着:

  • 有序性std::map 按照键的顺序存储元素。
  • 遍历顺序:遍历 std::map 时,会按照键的升序输出元素。

示例代码

#include <map>
#include <iostream>

int main() {
    std::map<int, std::string> myMap;
    myMap[1] = "one";
    myMap[2] = "two";
    myMap[3] = "three";

    for (const auto &pair : myMap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }
    return 0;
}

输出结果:
在这里插入图片描述

3.2 std::unordered_map

std::unordered_map 是C++标准库提供的基于哈希表的无序映射。它的插入、删除和查找操作的平均时间复杂度为O(1)。这意味着:

  • 无序性std::unordered_map 按照哈希值存储元素,元素的存储顺序取决于哈希函数和桶的分配情况。
  • 遍历顺序:遍历 std::unordered_map 时,输出顺序与插入顺序无关,取决于内部哈希表结构。

示例代码

#include <unordered_map>
#include <iostream>

int main() {
    std::unordered_map<int, std::string> myMap;
    myMap[1] = "one";
    myMap[2] = "two";
    myMap[3] = "three";

    for (const auto &pair : myMap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }
    return 0;
}

输出结果:
在这里插入图片描述

4 总结

在本篇博客中,介绍了Map的基本概念和两种主要实现方式:Hash Map和红黑树Map。我们还简要介绍了C++标准库中的std::mapstd::unordered_map。但理论永远是抽象的,在下一篇博客中,我将详细分析C语言中的Hash Map是如何实现的,同时也能加深我们对理论知识的理解。

  • 33
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您好,以下是C语言map的一个实现方式: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_HASH 1000000 typedef struct node { char* key; int value; struct node* next; } Node; typedef struct { Node* nodes[MAX_HASH]; } Map; unsigned int hash(char* key) { unsigned int hash = 0; for (int i = 0; i < strlen(key); i++) { hash = hash * 31 + key[i]; } return hash % MAX_HASH; } Node* createNode(char* key, int value) { Node* node = (Node*)malloc(sizeof(Node)); node->key = (char*)malloc(strlen(key) + 1); strcpy(node->key, key); node->value = value; node->next = NULL; return node; } void insert(Map* map, char* key, int value) { unsigned int index = hash(key); Node* node = map->nodes[index]; while (node != NULL) { if (strcmp(node->key, key) == 0) { node->value = value; return; } node = node->next; } node = createNode(key, value); node->next = map->nodes[index]; map->nodes[index] = node; } int* find(Map* map, char* key) { unsigned int index = hash(key); Node* node = map->nodes[index]; while (node != NULL) { if (strcmp(node->key, key) == 0) { return &(node->value); } node = node->next; } return NULL; } int main() { Map map; memset(&map, 0, sizeof(map)); insert(&map, "hello", 1); insert(&map, "world", 2); int* value = find(&map, "hello"); if (value != NULL) { printf("hello: %d\n", *value); } else { printf("hello not found\n"); } value = find(&map, "world"); if (value != NULL) { printf("world: %d\n", *value); } else { printf("world not found\n"); } return 0; } ``` 希望对您有用,您可以自己尝试运行代码看看效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tilblackout

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值