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*字符个数的空间大小。