- 在使用word文档时,word如何判断某个单词是否拼写正确?
- 网络爬虫程序,怎么让它不去爬相同的url页面?
- 垃圾邮件(短信)过滤算法如何设计?
- 公安办案时,如何判断嫌疑人是否在网逃名单中?
- 缓存穿透问题如何解决?
- 请求数据的时候:server redis MysqL。
- 数据访问步骤:
- 所谓穿透,就是redis和MysqL都没有数据,黑客利用这个漏洞,不断请求这个数据,导致数据压力堆积在MysqL中,最终导致系统崩溃。
- 在redis端设置<key, null>键值对,以此避免访问MysqL;缺点是<key, null>过多的话,会占用过多的内存
- 可以设置key过期,这样redis就不会存在过多的数据,黑客停止攻击之后,这些key会被淘汰。
- 在server端存储一个布隆过滤器,将MysqL包含的key放入布隆过滤器中;布隆过滤器一定能过滤不存在的数据。即利用这个数据结构快速查询数据是否在MysqL中。
- set,map和unordered_map
- set和map用红黑树实现的,unordered_map用哈希表实现。
- set和map关键区别,set不存储val字段。
- 红黑树全称为平衡二叉搜索树,不是严格的平衡二叉搜索树
- 红黑树时间复杂度是O(logn)
- 查找的时候,最差的情况是树的高度
- 红黑树的最长路径是最短路径的两倍
- 红黑树能不能插入相同的节点,看实现,可以实现为插入或者更新,或者直接丢弃
- 红黑树优点:存储效率高,访问速度高效。例如当int作为key时。
- 缺点:对于数据量大且查询字符串比较长且查询字符串相似时将会是噩梦。邮件或短信作为key,比较慢;字符串相似时,耗时间。
- AVL树:是严格的平衡二叉树
- 时间复杂度接近O(logn)
- 100w条数据组成的红黑树,只需要比较20次就能找到该值;对于10亿条数据,只需要比较30次,就能找到该数据。
- 问题:比较20,30次,如果是垃圾邮件,垃圾短信过滤,这种长字符串,比较二三十次,效率也很低,所以不适用于红黑树。
- STL中的unordered_map使用hashtable实现的。
- 构成:数组+hash函数
- 它是将字符串通过hash函数生成一个整数,再映射到数组当中;增删改查的时间复杂度是O(1);
- hash函数的作用:避免插入的时候字符串的比较
- 如何选取hash函数:
- 负载因子:数组存储元素的个数:负载因子越小,冲突越大;负载因子越大,冲突越小;
- 负载因子<1最好
- hash冲突解决方案:
- 链表法:将冲突的元素,用链表的方式连接起来;极端情况,链表过长,为了减少比较次数,可以将这个链表转换为红黑树(JAVA 8)。经验值:超过256或512的时候转换为红黑树。redis 6.0,对内存有严格的限制,使用链表发,并且是头插法。
- 开放地址法:所有元素都存在于哈希表中,不使用额外的数据结构。一般使用线性探测的思路解决冲突:
- hash表同样存储了key和value,key没有顺序。同样可以修改代码,让插入数据变成修改操作。
- 如果数组长度过小,导致链表长度过长,可以一:将链表改为红黑树 二:rehash
- 优点:访问速度更快;不需要进程字符串比较
- 缺点:需要引入策略避免冲突,存储效率不高;空间换时间。
- 定义:布隆过滤器是一种概率型数据结构(跳表也是),它的特点是高效的插入和查询,能明确告知某个字符串一定不存在或可能存在。适用于误差不是零容忍的情况。
- 布隆过滤器相比于传统的查询结构(hash, set, map等结构)更加高效,占用空间更小;但缺点是它的结果是概率性的,也就是说结果存在误差,虽然这个误差是可控的;同时它不支持删除操作。
- 组成:位图(bit) + n个hash函数。在C++中可以使用byte b[8]来构建64bit的位图。
- 原理:当一个元素加入位图时,通过k个hash函数将这个元素映射到位图的k个点,并把它们置为1;当检索时,再通过k个hash函数检测位图的k个点是否都为1;如果有不为1的点,那么认为不存在;如果全部为1,则可能存在(存在误差)。
- 在位图中每个槽位只有两种状态(0或1),一个槽位被设置为1状态,但不明确它被设置了多少次;也就是不知道被多少个str哈希映射以及是被哪个hash函数映射过来的;所以不支持删除操作。
- 在实际应用过程中,布隆过滤器如何使用?要选择多少个hash函数,要分配多少空间的位图,存储多少元素?另外如何控制假阳率?Bloom Filter Calculator
- 已知k,如何选择k个hash函数?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。