
数据结构与算法
文章平均质量分 84
数据结构与算法
码上生花
强者创造时代,能者顺应时代,弱者繁衍后代。
展开
-
牛顿迭代法(求解整数的近似平方根)
假设有函数:𝑓(𝑥)=0,要想求出其根,则可以:1: 给出一个初始点,则在该点的切线为:2: 沿着切线方向,与横轴相交,也即令则求的:3:更新,令4:按照1-3步骤迭代下去,直到精度满足要求上述算法的第1、2步,其实也就是函数𝑓(𝑥)在处的泰勒展开取前两项:上述泰勒展开式,取前两项并使之等于0,则有:,可以得到步骤2中的迭代公式。容易得出,点的切线方程为,要求,即相当于求的解。原创 2024-06-22 14:51:34 · 1188 阅读 · 5 评论 -
数据结构 -- 树状数组
树状数组或二叉索引树(Binary Indexed Tree),又以其发明者命名为 Fenwick 树。其初衷是解决数据压缩里的累积频率的计算问题,现多用于高效计算数列的前缀和、区间和。它可以以 O(logn) 的时间得到任意前缀和。并同时支持在 O(logn) 时间内支持动态单点值的修改。空间复杂度 O(n)。具体区别和联系如下:1.两者在复杂度上同级, 但是树状数组的常数明显优于线段树, 其编程复杂度也远小于线段树.原创 2024-06-09 01:10:19 · 1418 阅读 · 0 评论 -
从集合论到位运算
本文将扫清位运算的迷雾,在集合论与位运算之间建立一座桥梁。在高中,我们学了集合论(set theory)的相关知识。例如,包含若干整数的集合 S={0,2,3}。在编程中,通常用哈希表(hash table)表示集合。例如 Java 中的 HashSet,C++ 中的 std::unordered_set。在集合论中,有交集 ∩、并集 ∪、包含于 ⊆等等概念。如果编程实现「求两个哈希表的交集」,需要一个一个地遍历哈希表中的元素。那么,有没有效率更高的做法呢?该二进制登场了。原创 2024-06-02 12:06:02 · 977 阅读 · 0 评论 -
前缀和与差分算法
前缀和是指某序列的前n项和,可以把它理解为数学上的数列的前n项和,而差分可以看成前缀和的逆运算。合理的使用前缀和与差分,可以将某些复杂的问题简单化。原创 2024-05-25 11:53:57 · 896 阅读 · 0 评论 -
数据结构 - 链表
使用单向环形链表解决Josephu问题,用不带头结点的单向循环链表先构成一个有n个节点的链表,然后由k节点起从1开始计数,直到第m时,对应节点删除,然后从被删除的下一个节点开始从1开始计数,直到最后一个节点被删除结束算法。链表是一个在物理存储单元中不连续,没有顺序的的存储结构,关于它的顺序是由链表中的指针链接实现的,是一种递归的数据结构,链表有一系列节点组成,而这些节点会在运行时动态生成。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3。双向链表可以自我删除,单向链表不可以,需要靠辅助节点来删除。原创 2024-03-22 14:32:31 · 491 阅读 · 0 评论 -
数据结构 - 线索树
当然,我们肯定需要借助结点的指针域来保存直接前驱和直接后继的地址。其实,在上图的普通二叉树中(以中序遍历得到的序列),部分结点(指针域不为空的结点)是可以找到其直接前驱或后继的,比如结点 E 的左孩子 G 就是结点 E 的直接前驱;结点 A 的右孩子 C 就是结点 A 的直接后继。但部分结点(指针域为空)是行不通的,比如结点 G 的直接后继是 E,直接前驱是 B,但在二叉树中却不能得出这样的结论。怎么办呢?原创 2024-02-08 23:43:47 · 2032 阅读 · 0 评论 -
数据结构:大顶堆、小顶堆
堆是一种完全二叉树。完全二叉树的定义:所有节点从上往下,从左往右的依次排列,不能有空位置,是为完全二叉树。根节点(堆顶元素)是所有节点中的最大值(父节点都大于左右子节点)。大顶堆常用于实现优先队列,且可用于构建堆排序算法。小顶堆中的根节点是所有节点中的最小值(父节点都小于左右子节点)。小顶堆常用于问题如:查找流中的前 K 个最小元素。原创 2024-01-30 16:14:32 · 2319 阅读 · 0 评论 -
JPS寻路算法(Jump Point Search)
可以看到 JPS/JPS+ 算法里只有跳点才会被加入openlist里,排除了大量不必要的点,最后找出来的最短路径也是由跳点组成。这也是 JPS/JPS+ 高效的主要原因。JPS绝大部分地图,使用 JPS 算法都会比 A* 算法更快,内存占用也更小(openlist里节点少了很多)。JPS 在跳点判断上,要尽可能避免递归的深度过大(或者期待一下以后出现避免递归的算法),否则在超大型的地图里递归判断跳点可能会造成灾难。JPS 也可以用于动态变化的地图,只是每次地图改变都需要再进行一次 JPS 搜索。原创 2024-01-25 14:35:32 · 2293 阅读 · 0 评论 -
数组区域检索的优化 --- 分块,线段树,树状数组
首先让我们来思考一个问题,给定一个数组,和left与right的值,让你求这个数组中left到right之间元素的和,你会怎么计算?最简单的当然是遍历。如果有人问你这个问题的时候,他决对是会让你优化的,起码时间复杂度一定要小于O(n),那你打算怎么做呢?很明确的一点是,如果要优化时间复杂度,就必须要提高空间复杂度,这是算法的局限,当然也是自然界的能量守恒定律。这是不可避免的,所以接下来你可以思考下,有什么结构可以实现了。原创 2023-11-13 16:46:32 · 813 阅读 · 0 评论 -
Floyd算法基础
如从矩阵D中可以看出节点1到节点5的最短路径长度为12.从矩阵S中发现,节点1到节点5的中间节点是节点4,即节点1→节点4→节点5,再看节点1→节点4中间是节点2,即节点1需要通过节点2到达节点4,即节点1→节点2→节点4;而节点4可以直接到节点5,中间没有节点,因此可以得到节点1到节点5的最短路径是节点1→节点2→节点4→节点5.Floyd算法的思想是将n个节点的网络表示为n行n列的矩阵,而矩阵中的元素( i , j )表示从节点i到节点j的距离d。这里的节点序列矩阵相当于路线表,如下表,S。原创 2023-09-24 12:28:11 · 796 阅读 · 0 评论 -
MD5加密算法
MD5在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3和MD4发展而来。MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个。MD5的典型应用是对一段信息串 (Message)产生所谓的指纹 (fingerprint),以防止被“篡改”。原创 2023-09-20 20:49:53 · 2776 阅读 · 0 评论 -
加密算法总结
是前后端开发都经常需要使用到的技术,应用场景包括了用户登入、交易、信息通讯、oauth 等等,不同的应用场景也会需要使用到不同的签名加密算法,或者需要搭配不一样的 签名加密算法 来达到业务目标。这里简单的给大家介绍几种常见的签名加密算法和一些典型场景下的应用。原创 2023-09-20 19:53:28 · 773 阅读 · 0 评论 -
背包问题 - 动态规划
暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化!01背包问题与完全背包问题实际上是两种极端,而多重背包问题则正是介于这两者之间的一种情况。基于此,我们可以将多重背包问题转化为01背包或完全背包问题来进行求解。可以把某种物品中的k个视为k种不同物品,此时再对所有物品按照01背包问题来进行处理。这样的转化当然是成立的,但是仅在数据范围较小时才适用,一旦每种物品的数量稍大一点,在时间上必然有超时的风险。原创 2023-08-18 21:46:10 · 300 阅读 · 0 评论 -
KMP算法基础
KMP算法是我们数据结构串中最难也是最重要的算法。难是因为KMP算法的代码很优美简洁干练,但里面包含着非常深的思维。真正理解代码的人可以说对KMP算法的了解已经相当深入了。而且这个算法的不少东西的确不容易讲懂,很多正规的书本把概念一摆出直接劝退无数人。这篇文章将尽量以最详细的方式配图介绍KMP算法及其改进。文章的开始我先对KMP算法的三位创始人Knuth,Morris,Pratt致敬,懂得这个算法的流程后你真的不得不佩服他们的聪明才智。原创 2023-06-23 15:44:28 · 323 阅读 · 2 评论 -
数据结构 -- 跳跃链表
跳跃链表是有序链表的一个变种,在一个有序链表中,查找一个链表中的元素需要进行一次遍历,时间复杂度为O(n),为了加快查找的过程,能够跳过某些元素呢?一个思路就是牺牲一定的空间换时间,对有序链表建立类似索引的结构加快查找过程,跳跃链表基本上就是通过维护一个多层次的链表,每一层链表中的元素是前一层链表元素的子集,搜索时,最开始在最稀疏的层次进行搜索,直至需要查找的元素在该层两个相邻元素中间,这时,将跳转到下一个层次,重复刚才的搜索,直到找到需要查找的元素为止。原创 2023-06-04 16:59:45 · 530 阅读 · 0 评论 -
寻路算法基础
广度优先搜索、Dijkstra和A*是图上的三种典型路径规划算法。它们都可用于图搜索,不同之处在于队列和启发式函数两个参数。将边界初始化为包含起始节点的队列。当边界队列不为空时,从队列中“访问”并删除一个“当前”节点,同时将访问节点的每个邻居节点添加到队列,其成本是到达当前节点的成本加上从当前节点访问邻居的成本再加上邻居节点和目标节点的启发式函数值。其中,启发式函数是对两个节点的路径成本的估计。存储访问路径(通常存储在cameFrom图中),以便后续重建路径。原创 2022-04-29 14:15:19 · 1203 阅读 · 0 评论 -
数据结构 - 哈希表(散列表)
数据结构 - 哈希表(散列表)原创 2022-04-23 17:24:35 · 3300 阅读 · 0 评论 -
数据结构 - 树
数据结构 - 树原创 2022-04-23 11:16:12 · 480 阅读 · 0 评论 -
回溯算法基础
回溯算法基础原创 2021-09-13 14:58:28 · 202 阅读 · 0 评论 -
排序算法基础
排序算法基础原创 2021-09-15 10:34:52 · 205 阅读 · 0 评论 -
双指针算法基础
双指针算法基础原创 2021-09-17 11:09:04 · 115 阅读 · 0 评论 -
二分查找算法基础
二分查找算法基础原创 2021-09-18 09:44:06 · 232 阅读 · 0 评论 -
动态规划算法基础
将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解(这部分与分治法相似)。与分治法不同的是,适合于用动态规划求解的问题,经分解得到的子问题往往不是互相独立的。通常可以用一个表来记录所有已解的子问题的答案。动态规划一般分为一维、二维、多维(使用状态压缩),对应形式为 dp(i)dp(i)、dp(i)(j)dp(i)(j)、二进制dp(i)(j)二进制dp(i)(j)。1)最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。原创 2021-09-23 09:21:59 · 355 阅读 · 0 评论 -
贪心算法基础
贪心算法基础原创 2021-09-25 11:23:07 · 286 阅读 · 0 评论 -
滑动窗口算法基础
滑动窗口算法基础原创 2021-11-05 10:03:15 · 220 阅读 · 0 评论 -
数据结构 - 图
数据结构 - 图原创 2021-11-21 14:58:32 · 485 阅读 · 0 评论 -
算法中那些奇奇妙妙的数学方法
为了找到点 q,我们使用函数 orientation(),这个函数有 3 个参数,分别是当前凸包上的点 p,下一个会加到凸包里的点 q,其他点空间内的任何一个点 r。若 a,b 是整数,且 gcd ( a , b ) = d ,那么对于任意的整数 x , y , a x + b y 都一定是d 的倍数,特别地,一定存在整数 x , y 使 a x + b y = d 成立。在拒绝采样中,如果生成的随机数满足要求,那么就返回该随机数,否则会不断生成,直到生成一个满足要求的随机数为止。原创 2022-03-06 15:48:11 · 412 阅读 · 0 评论 -
拓扑排序算法基础
拓扑排序算法基础原创 2022-03-12 10:14:00 · 292 阅读 · 0 评论 -
欧拉图算法基础
欧拉图算法基础原创 2022-03-16 11:09:24 · 3402 阅读 · 0 评论 -
Dijkstra算法基础
Dijkstra算法基础原创 2022-03-18 15:07:14 · 2916 阅读 · 0 评论 -
字典树算法基础
字典树算法基础原创 2022-04-16 13:18:43 · 770 阅读 · 0 评论