关于map处理String的复杂度问题

本文探讨了C++标准库中的map在处理大量字符串时的复杂度问题及其原因,并提出了两种解决方案:一是通过哈希值映射减少冲突;二是利用Trie树进行存储,避免误差。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

map复杂度

关于map平时一般用得比较多,毕竟自己写一个平衡二叉树或者Treap还是较麻烦的,map一般复杂度为logn,但是有时候发现用map竟然也超时,比如统计不同单词个数(字符总个数不超过1000w),用map时就超时了,原因是C++中的map根据重载运算符计算的,所以并不会将字符串映射成一个整数存进去,这样导致复杂度为lenlog(len),总复杂度大概为nlog(maxlen),所以将导致超时,至于java中的hashMap可能有改进。

map处理字符串解决方法

一种处理办法是直接将一个字符串映射成一个hash值,不过这样对hash公式有点要求,mod值不应该太小,太小冲突的概率会增大,所以映射成一个较大整数后(尽量保证冲突较少的hash公式),使用hash表存储(再mod值存入,一般用数组模拟链表存储,图算法中有使用到),是否相等就查找hash表就行。
另外一种就不会出现误差问题,就是用Trie存储,每次查找直接在Trie(字符串分类中)中查找是否存在,但是Trie有一个缺点就是空间耗费太大,就算用动态存储也是一样,出现的字符个数就要有n*字符个数的空间大小。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值