时间 57个相关结果 465次搜索

数据结构与算法十四:哈希算法(上)

什么是哈希算法? 我们前面几节讲到“散列表”“散列函数”,这里又讲到“哈希算法”,你是不是有点一头雾水?实际上,不管是“散列”还是“哈希”,这都是中文翻译的差别,英文其实就是“Hash”。所以,我们常听到有人把“散列表”叫作“哈希表”“Ha …

数据结构与算法十三:散列表(下)

你有没有发现,有两种数据结构,散列表和链表,经常会被放在一起使用。你还记得,前面的章节中都有哪些地方讲到散列表和链表的组合使用吗? 在链表那一节,我讲到如何用链表来实现 LRU 缓存淘汰算法,但是链表实现的 LRU 缓存淘汰算法的时间复杂度 …

数据结构与算法十三:散列表(中)

通过上一节的学习,我们知道,散列表的查询效率并不能笼统地说成是 O(1)。它跟散列函数、装载因子、散列冲突等都有关系。如果散列函数设计得不好,或者装载因子过高,都可能导致散列冲突发生的概率升高,查询效率下降。 在极端情况下,有些恶意的攻击者 …

数据结构与算法十三:散列表(上)

散列思想 散列表的英文叫“Hash Table”,我们平时也叫它“哈希表”或者“Hash 表”。 散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。 用一个 …

数据结构与算法十二:跳表

上两节讲到,因为二分查找底层依赖的是数组随机访问的特性,所以只能用数组来实现。如果数据存储在链表中,就真的没法用二分查找算法了吗? 实际上,只需要对链表稍加改造,就可以支持类似“二分”的查找算法。我们把改造之后的数据结构叫作跳表(Skip …

数据结构与算法十一:二分查找(上)

无处不在的二分思想 二分查找是一种非常简单易懂的快速查找算法,生活中到处可见。比如说,我们现在来做一个猜字游戏。我随机写一个 0 到 99 之间的数字,然后你来猜我写的是什么。猜的过程中,你每猜一次,我就会告诉你猜的大了还是小了,直到猜中为 …

数据结构与算法十:排序优化

如何选择合适的排序算法? 如果要实现一个通用的、高效率的排序函数,应该选择哪种排序算法? 前面讲过,线性排序算法的时间复杂度比较低,适用场景比较特殊。所以如果要写一个通用的排序函数,不能选择线性排序算法。 如果对小规模数据进行排序,可以选择 …

数据结构与算法九:线性排序

这一节讲述三种时间复杂度是O(n)的排序算法:桶排序、技术排序、基数排序。因为这些排序算法的时间复杂度是线性的,所以又叫作线性排序(Linear sort)。之所以能做到线性的时间复杂度,主要原因是,这三个算法是非基于比较的排序算法,都不涉 …

数据结构与算法八:排序(下)

上一节讲述了冒泡排序、插入排序、选择排序这三种排序算法,它们的时间复杂度都是O(n²),比较高,适合小规模数据的排序。这一节讲两种时间复杂度为O(nlogn)的排序算法,归并排序和**快速排序***。 归并排序原理 归并排序的核心思想很简单 …

数据结构与算法八:排序(上)

如何分析一个“排序算法” 学习排序算法,我们除了学习它的算法原理、代码实现之外,更重要的是要学会如何评价、分析一个排序算法。那分析一个排序算法,要从哪几个方面入手呢? ==排序算法的执行效率== 对于排序算法执行效率的分析,我们一般会从这几 …