11 2022 档案
摘要:并查集 并查集(union-find, 或 disjoint set)可以动态地连通两个点,并且可以非常快速地判断两个点是否连通。假设存在 n 个节点,我们先将所有节点的父亲标为自己;每次要连接节点 i 和 j 时, 我们可以将 i 的父亲标为 j;每次要查询两个节点是否相连时,我们可以查找 i 和
阅读全文
摘要:图通常分为有向(directed)或无向(undirected),有循环(cyclic)或无循环(acyclic),所有节点相连(connected)或不相连(disconnected)。树即是一个相连的无向无环图,而另一种很常见的图是有向无环图(Directed Acyclic Graph,DAG
阅读全文
摘要:树的递归 层次遍历 我们可以使用广度优先搜索进行层次遍历。注意,不需要使用两个队列来分别存储当前层的节点和下一层的节点,因为在开始遍历一层的节点时,当前队列中的节点数就是当前层的节点数,只要控制遍历这么多节点数,就能保证这次遍历的都是当前层的节点。 字典树 字典树(Trie)用于判断字符串是否存在或
阅读全文
摘要:(单)链表是由节点和指针构成的数据结构,每个节点存有一个值,和一个指向下一个节点的指针,因此很多链表问题可以用递归来处理。不同于数组,链表并不能直接获取任意节点的值, 必须要通过指针找到该节点后才能获取其值。同理,在未遍历到链表结尾时,我们也无法知道链表的长度,除非依赖其他数据结构储存长度。Leet
阅读全文
摘要:C++STL 1. Sequence Containers:维持顺序的容器。 (a). vector:动态数组,是我们最常使用的数据结构之一,用于 O(1) 的随机读取。因为大部分算法的时间复杂度都会大于 O(n),因此我们经常新建 vector 来存储各种数据或中间变量。因为在尾部增删的复杂度是
阅读全文
摘要:位运算是算法题里比较特殊的一种类型,它们利用二进制位运算的特性进行一些奇妙的优化和计算。常用的位运算符号包括:“∧”按位异或、“&”按位与、“|”按位或、“∼”取反、“<<” 算术左移和“>>”算术右移。以下是一些常见的位运算特性,其中0s和1s 分别表示只由 0 或 1 构成的二进制数字。除此之外
阅读全文
摘要:1.最小公倍数和最大公约数 2.质数 3.随机取样 4.Boyer-Moore 投票算法
阅读全文
摘要:我们可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元。这完全是我们自己的安排。 我们可以用一个段存放数据,将它定义为“数据段”; 我们可以用一个段存放代码,将它定义为“代码段”; 我们可以用一个段当作栈,将它定义为“栈段”。 我们可以这样安排,但若要让CPU按照我们的安排来访
阅读全文
摘要:动态规划(Dynamic Programming, DP)在查找有很多重叠子问题的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费时间 · · ·
阅读全文
摘要:深度优先搜索:在搜索到一个新的节点时,立即对该节点进行遍历;因此需用先入后出的栈,也可以通过与栈等价的递归来实现。深度优先搜索也可以用来检测环路:记录每个遍历过的节点的父节点,若一个节点被再次遍 历且父节点不同,则说明有环。我们也可以用之后会讲到的拓扑排序判断是否有环路,若最后存 在入度不为零的点,
阅读全文
摘要:防火墙是一种特殊编程的路由器,安装在一个站点和网络的其余部分之间,为了实施访问控制策略。一般分为两类: 1.分组过滤路由器,一种具有分组过滤功能的路由器,根据过滤规则对进出内部网络的分组执行转发或丢弃。过滤规则基于分组的网络层或运输层首部信息。 2.应用网关,也称代理服务器,在应用层打开报文,查看该
阅读全文
摘要:1.快速排序 2.归并排序 3.插入排序 4.冒泡排序 5.选择排序
阅读全文
摘要:双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务。也可以延伸到多个数组的多个指针。若两个指针指向同一数组,遍历方向相同且不会相交,则也称为滑动窗口(两个指针包围的 区域即为当前的窗口),经常用于区间搜索。若两个指针指向同一数组,但是遍历方向相反,则可以用来进行搜索,待搜索的数组往往是
阅读全文