发布于: 2023-10-9最后更新: 2023-10-9字数 00 分钟

top-k问题

第 k个max。快排的思路,对pivot二分找order,然后就可以排除一半。平均复杂度是O(n)

Dijkstra算法

迪杰斯特拉(Dijkstra)算法是一种用于在图中找到最短路径的算法。这个算法用于找到从起始节点到所有其他节点的最短路径。以下是该算法的一般步骤:
  1. 创建两个集合,已访问节点集合(visited)和未访问节点集合(unvisited)。起始节点加入未访问节点集合。
  1. 设置起始节点的距离为0,所有其他节点的距离为无穷大(在实际应用中,这可以是一个很大的值)。
  1. 选择未访问节点集合中距离最小的节点,访问该节点的所有未访问邻居。对于每个邻居,计算从当前节点到邻居节点的距离,并更新邻居节点的距离值(如果计算出的新距离小于原来的距离值)。
  1. 当前节点加入已访问节点集合,从未访问节点集合中移除。
  1. 如果目标节点已被访问,或者未访问节点集合中最小距离为无穷大(这意味着没有路径连接到目标节点),则算法结束。
  1. 否则,回到第3步。
算法实现1,邻接图,通过优先队列:
算法实现2,邻接矩阵:
m*n的二维矩阵?不是很懂。
如果你有一个m*n的邻接矩阵(也就是说,你的图不是一个完全图,而是一个有向图),你仍然可以使用Dijkstra算法,但是你需要对算法做一些小的修改。
你可以将m*n的邻接矩阵看作是一个图,其中每个格子是一个节点,每个节点与其上下左右的邻居相连。然后,你可以将这个图转换为一个一维的邻接矩阵,然后在这个一维的邻接矩阵上运行Dijkstra算法。
以下是一个基本的实现:
在这个实现中,dijkstra函数首先初始化所有节点到起始节点的距离为无穷大,除了起始节点本身到自己的距离为0。然后,它使用一个优先队列来保存所有已经找到但还未访问的节点,并按照这些节点的最短路径长度进行排序。每一步,它都会从优先队列中取出一个未访问的节点,然后更新所有从这个节点直接可达的节点的最短路径长度。这个过程会一直持续,直到优先队列为空,也就是说所有可达的节点都已经被访问过。
main函数中,我们创建了一个图,并调用dijkstra函数来计算从节点0到所有其他节点的最短距离。

LRU Cache

使用STL的list和unorder_map,考虑大规模数据量下重复删除、添加的问题。另外可以自行设计链表和哈希表等数据结构更高效地自定义。懒得弄了。
实现参考

中位数

给一个数组,再给一个这个数组下标作为元素的数组,逐个删除元素,计算中位数。
代码

KMP

假设我们有一个文本串 "ABABABCAB",我们想在其中找到模式串 "ABABC"。使用 KMP 算法的话,首先我们需要创建一个部分匹配表。
部分匹配表的创建方法是:对于模式串的每个位置,找出该位置左侧的所有前缀和后缀的最长公共元素长度。我们先假定模式串 "ABABC" 的部分匹配表如下:
A
B
A
B
C
0
0
1
2
0
我们开始从文本串的第一个字符开始匹配。每当字符匹配,我们就将文本串和模式串的位置都向后移动一位。一旦出现不匹配的字符,我们就查看模式串中最后一个匹配字符的部分匹配值。
例如,当我们在文本串的第5位 'A' 和模式串的第5位 'C' 不匹配时,我们看到模式串的前4位 'ABAB' 的最后一个字符 'B' 的部分匹配值为2。这意味着 'ABAB' 的最长前缀和后缀公共元素是 'AB',长度为2。
因此,我们将模式串向右移动2位,使得 'AB' 与文本串中的 'AB' 对齐。然后,我们继续比较文本串的下一个字符 'A' 和模式串的当前字符 'A',由于它们匹配,所以我们继续进行。
这样,每当字符不匹配,我们就利用部分匹配表跳过一些已知不会匹配的字符,从而提高了搜索效率。
匹配表构建:
对于模式串的每个位置,计算该位置左侧的所有前缀和后缀的最长公共元素长度,可以通过以下步骤进行:
以模式串 "ABABC" 为例,我们为每个字符构建部分匹配表。
  1. 字符 'A':这是模式串的第一个字符,所以其左侧没有其他字符,因此它的部分匹配值为 0。
  1. 字符 'B':它的左侧只有一个字符 'A'。既然 'A' 没有前缀和后缀,所以它的部分匹配值也是 0。
  1. 字符 'A':它的左侧有两个字符 'AB'。'AB' 的所有前缀有:'A',所有后缀有:'B'。它们没有公共元素,因此这个位置的部分匹配值为 0。
  1. 字符 'B':它的左侧有三个字符 'ABA'。'ABA' 的所有前缀有:'A', 'AB',所有后缀有:'A', 'BA'。它们的最长公共元素是 'A',长度为1,因此这个位置的部分匹配值为 1。
  1. 字符 'C':它的左侧有四个字符 'ABAB'。'ABAB' 的所有前缀有:'A', 'AB', 'ABA',所有后缀有:'B', 'AB', 'BAB'。它们的最长公共元素是 'AB',长度为2,因此这个位置的部分匹配值为 2。
通过上述步骤,我们就得到了模式串 "ABABC" 的部分匹配表:
A
B
A
B
C
0
0
1
2
0
实际上,计算部分匹配表是一个动态规划的过程,可以通过一些优化的方法来提高效率,但基本思想是一样的。
代码实现:

归并多个有序链表


秋招复盘7.18:算法、八股
秋招复盘7.18:算法、八股