哈希表(C++的map、Java的HashMap、Python的dict)

文章目录


哈希表又叫散列表,是通过键值对(key-value)来存储信息的,可以直接通过key获取value,时间复杂度为O(1),用在需要高速查找的地方。

C++

C++中的哈希表是STL中的map(头文件为#include ),可以自己定义键值对<key, value>,下面以<string,int>为例。
此外,map中的元素是按照key自动排序的,STL中还有另一个哈希表:unordered_map,两者的区别为:

  • map自动排序,底层用红黑树实现,插入和查询时间复杂度均为O(logn);
  • unordered_map不排序,底层用哈希表实现,插入复杂度为O(logn),查询复杂度为O(1)。

具体区别见https://blog.csdn.net/weixin_52115456/article/details/127698255

map<string, int> age;       // 定义map

int mapLen = age.size();    // 获取map长度
bool flag = age.empty();    // 判断map是否为空

// 增加键值
age["Zhangsan"] = 20;       // 方式一
age.insert({"Lisi", 22});   // 方式二
age.insert(pair<string,int>("Xiaoming", 10)); // 方式三
// 注意:insert的时候,如果key已经存在,则会忽略,用方式一则会覆盖

// 删除键值
map<string, int>::iterator it = age.find("Lisi");
age.erase(it);  // 方式一:用迭代器删除
int ret = age.erase("Lisi");    // 方式二:按key删除,成功返回1
int ret2 = age.erase("Alice");  // 删除不存在的key会失败,返回0
age.erase(age.begin(), age.end());  // 删除所有键值
age.clear();    // 删除所有键值

// 修改键值
age["Xiaoming"] += 1;   // 直接通过key修改

// 查找键值
// 获取某个key的值,类似数组的下标访问
int a = age["Xiaoming"];
// 判断是否有某个key
// 方式一:用.count(),有则返回1,没有则返回0
int flag = age.count("Lisi");
// 方式二:用.find()返回迭代器,然后和.end()比较(因为没查找到会返回.end())
map<string, int>::iterator it = age.find("Lisi");
if (it != age.end())
    cout<<"has Lisi"<<endl;

// 遍历
// 方式一:通过迭代器遍历
for (map<string, int>::iterator it = age.begin(); it != age.end(); it++){
    cout<<it->first<<':'<<it->second<<endl;
}
// 方式二:通过基于范围的for循环遍历
for (auto a: age){
    cout<<a.first<<':'<<a.second<<endl;
}

Java

Java中常用的哈希表是HashMap,此外还有HashTable和HashSet。
下面的代码需要import java.util.HashMap;

HashMap<String, Integer> age = new HashMap<String, Integer>();  // 定义新的map

int mapLen = age.size();        // 获取map长度
boolean flag = age.isEmpty();   // 判断map是否为空

// 增加键值
age.put("Zhangsan", 20);
age.put("Lisi", 22);
age.put("Xiaoming", 10);

// 删除键值
age.remove("Lisi");     // 按key删除
age.clear();            // 删除所有键值对

// 修改键值
age.put("Xiaoming", 12);        // 重新put来更新value
age.replace("Xiaoming", 12);    // 用replace来更新key对应的value
age.replaceAll((key, val) -> val +=5);  // 对所有键值对进行修改

// 查找键值
int a = age.get("Xiaoming");    // 通过key获取value
int b = age.getOrDefault("Alice", 18);  // 通过key获取value,若没有则返回默认值
boolean flag2 = age.containsKey("Lisi");    // 判断是否包含某个key
boolean flag3 = age.containsValue(22);      // 判断是否包含某个value

// 遍历
// 遍历key
for (String i : age.keySet()) {
    System.out.println("key: " + i + " value: " + age.get(i));
}
// 遍历value
for(Integer value: age.values()) {
  System.out.print(value + ", ");
}

Python

Python中的哈希表是字典dict,基本形式为:{key1:value1, key2: value2, …}

dic = {}        # 定义空字典
dic = dict()    # 定义空字典
dic = {"name":"zhangshan", "age":20}  # 定义字典

# 获取字典长度
dicLen = len(dic)

# 判断字典是否有键"age"
if "age" in dic:    
    print("has age")

# 增加键值
dic["hobby"] = "basketball"     # 直接用key访问,若key不存在则会报错

# 删除键值
del dic["hobby"]            # 通过key删除
ret = dic.pop("age")        # 通过key删除,返回被删的项的value
key,val = dic.popitem()     # 删除最后一个键值对,并返回键值对

# 修改键值
dic["age"] += 1             # 若key不存在则会报错

# 查询键值
age = dic["age"]            # 通过key查询,若不存在则报错
h = dic.get("height", 1.8)  # 查询key,不存在返回给定的默认值(1.8)
h = dic.setdefault("height", 1.8) # 查询key,不存在返回给定的默认值(1.8)
# 此处.get()和.setdefault()的区别在于前者不会改变原字典,后者会改变

# 遍历
for k in dic:               # 直接遍历的是key
    print(k,dic[k])

for key in dic.keys():      # 遍历字典的key
    print(key)

for val in dic.values():    # 遍历字典的value
    print(val)

for key,val in dic.items(): # 遍历字典的键值对
    print(key,val)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值