Skip to content

排序算法

包括冒泡排序、选择排序、插入排序、希尔排序、归并排序和快速排序等,用于对数组或链表进行排序。

哈希算法

通过哈希函数将数据映射到一个固定大小的数组中,并在数组中查找数据。常用于高效地实现数据存储和查找操作。

贪心算法

贪心算法是一种解决优化问题的算法。其基本思想是:在每个阶段选择当前状态下最优的解,并且不考虑该选择会对以后的选择造成什么影响,从而得到全局最优解。

贪心算法的优点在于其简单性和高效性。然而,由于其只考虑当前状态下的最优解,可能会导致得到局部最优解而不是全局最优解。因此,在使用贪心算法求解问题时,需要保证问题具有贪心选择性质,即通过贪心策略得到的局部最优解也一定是全局最优解。

动态规划

动态规划算法是一种具有优化思想的算法,它通常用于解决多阶段决策最优化问题。其基本思想是将原问题分解为子问题,并且通过存储子问题的解来避免重复计算,从而得到全局最优解。

二分法

二分法也叫折半查找法,是一种常用的查找算法。它适用于已经排好序的有序数组中查找某个元素的位置。

二分法的基本思想是:将有序数组分成两部分,检查中间的元素是否等于目标元素,如果等于,则返回其位置;如果不等于,则判断目标元素在左半部分还是右半部分,并继续进行相同的操作,直到找到目标元素或者确定目标元素不存在为止。

二分法的优点在于其时间复杂度较低,为O(log n),其中n为数组的长度。但是,二分法只适用于已经排好序的有序数组,并且数组通常需要使用顺序表或链表来存储。因此,在实际应用中,需要根据具体情况来选择是否使用二分法进行查找。

TIP

Chrome V8 引擎中 Array 的 includes() 方法使用的是二分法查找。 在具体实现中,如果数组长度小于等于 10,则采用线性查找(遍历);否则,采用二分法查找。

双指针

它通常适用于数组或链表等数据结构中,用来解决一些查找、判断和遍历问题。

双指针算法的基本思想是:使用两个指针分别指向数组或链表中不同的位置,并根据题目要求移动指针,以达到查找或判断的目的。

具体来说,双指针算法可以分为以下几类:

  1. 快慢指针:使用两个指针,一个快指针和一个慢指针,分别按照不同的步长移动,用于判断链表是否有环或者寻找链表的中间节点等。

  2. 对撞指针:使用两个指针,分别指向数组或者字符串的两端,从两端向中间靠拢,用于查找数组中的两个数之和等于目标值的问题。

  3. 滑动窗口:使用两个指针,分别表示窗口的左右边界,通过移动指针改变窗口大小,用于解决字符串匹配等问题。

  4. 三指针:使用三个指针,分别指向数组的头部、尾部和中部,根据题目的要求移动指针,用于解决一些排序和查找问题。

LRU缓存算法

LRU(Least Recently Used)缓存算法是一种常用的缓存淘汰策略,它根据数据的历史访问记录来进行淘汰决策,即淘汰最近最少使用的数据。

具体来说,LRU 缓存算法会维护一个缓存列表,当有新的数据需要加入缓存时,首先判断缓存空间是否已满,如果未满,则直接将新数据加入到缓存中;如果已满,则选择最近最少使用的数据淘汰,并将新数据加入到缓存中。为了实现 LRU 缓存算法,一般可以使用哈希表和双向链表两个数据结构。

  • LRU 缓存算法可以应用于很多场景中,例如数据库查询、页面缓存等,可以有效地提高数据访问效率,降低系统负载。

BFS 和 DFS 算法

BFS(Breadth First Search,广度优先搜索)和 DFS(Depth First Search,深度优先搜索)算法都是图(树是一种特殊的图)的遍历算法。

BFS 算法从图中某个顶点开始遍历,先访问其所有邻接点,再依次访问每个邻接点的所有未访问过的邻接点,直到所有可达顶点都被访问为止。在遍历时,可以使用队列来存储待访问的顶点,保证按照层级顺序访问所有顶点。BFS 算法适用于求最短路径问题,因为在遍历过程中,先访问的顶点一定比后访问的顶点更接近起点。

DFS 算法从图中某个顶点开始遍历,先访问该顶点,再选取任意一个邻接点继续遍历,直到所有可达顶点都被访问为止。在遍历时,可以使用递归函数来实现,或者使用栈来存储待访问的顶点,保证访问顺序符合深度优先的特点。DFS 算法适用于求连通性或者搜索所有可能解的问题,因为在遍历过程中,会将所有可达顶点都访问一遍。

TIP

在实际应用中,BFS 算法和 DFS 算法都有其优缺点。BFS 算法可以保证找到最短路径,但是需要额外的空间存储访问过的顶点信息;DFS 算法可以搜索所有可能解,但是可能会陷入死循环或者栈溢出等问题。因此,在选择算法时,需要结合具体问题进行考虑。

分治算法

将问题分成多个子问题,每个子问题独立求解,最后将结果合并起来得到问题的解。典型的应用包括归并排序和快速排序。

回溯算法

通过不断尝试,并及时撤销失败的尝试,最终找到问题的解。其典型应用包括八皇后问题和迷宫问题等。