我们想到使用c++中的setmap容器。由于内部使用红黑树,所以他的综合效率非常好。但试想一下,如果有w的字符串,假设每个字符串长度平均下来是20个字节,单个节点约占40个字节左右,w*40bit/(*)=38.GB,可能此时你的服务器内存要炸开了。你的进程就被kill掉了。
我们也很容易想到c++中的unorderedmapstd::string,bool,内部使用哈希表数据结构。
利用一个数组+哈希函数即可构成。内部是将字符串通过hash函数生成一个整数在映射到数组中,他的增删查改的时间复杂度是o(1),可以说非常快了。hash函数一般返回的是一个64位整数,计算出来的值通常会对数组取模分配在数组之中。但当数据量庞大时,也就会引起hash冲突。hash冲突解决方案链表法将冲突元素用链表链接起来;当链表元素太多时,一般都把该链表转换为红黑树。开放寻址法
插入时,使用哈希函数定位元素位置若不存在,直接插入即可若存在,则需要加一定步长来接着检查,步长一般来说不是固定的。当插入新的元素冲突时,一般使用线性探查的方案双重散列哈希
这里不展开介绍,感兴趣可以看看这一篇博客[