摘要: 散列表碰撞攻击 在极端情况下,有些恶意的攻击者,还有可能通过精心构造的数据,使得所有的数据经过散列函数之后,都散列到同一个槽里。 如果我们使用的是基于链表的冲突解决方法,那这个时候,散列表就会退化为链表,查询的时间复杂度就从 O(1) 急剧退化为 O(n)。 如何设计一个可以应对各种异常情况的工业级 阅读全文
posted @ 2018-11-12 22:27 田错 阅读(278) 评论(0) 推荐(0) 编辑
摘要: 散列表 概述 散列表Hash Table来源于数组,它借助散列函数对数组这种数据结构进行扩展,利用的是数组支持按照下标随机访问元素的特性。 需要存储在散列表中的数据我们称为键key,将键转化为数组下标的方法hash(key)称为散列函数,散列函数的计算结果称为散列值。 将数据存储在散列值对应的数组下 阅读全文
posted @ 2018-11-12 21:05 田错 阅读(681) 评论(1) 推荐(0) 编辑
摘要: 跳表的概念 对链表建立n级索引,例如每两个结点提取一个节点到上一层,称之为索引层。 图中的down表示down指针,指向下一级结点 跳表的时间复杂度 跳表的高度 跳表的高度是log2n。 跳表的时间复杂度 跳表中查询某个数据的时间复杂度是O(logn)。 跳表的空间复杂度及优化 跳表的空间复杂度 跳 阅读全文
posted @ 2018-11-12 19:53 田错 阅读(458) 评论(0) 推荐(0) 编辑
摘要: 四种常见的二分查找变形问题 查找第一个值等于给定值的元素 查找最后一个值等于给定值的元素 查找第一个大于等于给定值的元素 查找最后一个小于等于给定值的元素 适用性分析 凡是能用二分查找解决的,绝大部分我们更倾向于用散列表或者二叉查找树, 即便二分查找在内存上更节省,但是毕竟内存如此紧缺的情况并不多。 阅读全文
posted @ 2018-11-12 18:56 田错 阅读(211) 评论(0) 推荐(0) 编辑