
算法与数据结构
文章平均质量分 93
路漫漫其修远兮,吾将上下而求索
theSerein
路漫漫其修远兮,吾将上下而求索。
展开
-
【算法与数据结构】—— 回文问题
对于一个给定的字符串,如果它的正序和倒序是相同的,则称这样的字符串为 `回文`。例如,对于字符串 “aabaa”,它的倒序也为 “aabaa”,因此它是一个回文;对于字符串 “abba”,它的倒序也为 “abba”,因此它也是一个回文;对于字符串 “abbc”,它的倒序为 “cbba”,因此它不是一个回文。从回文的定义可以看出,回文总是 关于中心对称 的。原创 2025-01-11 20:49:08 · 1098 阅读 · 0 评论 -
【洛谷】P1242 新汉诺塔
汉诺塔问题是理解分治算法最经典的一道题。根据分治算法的思想,第一步我们必须对原问题进行分解。在此之前,对大家进行一个提问:把大象装进冰箱需要几步?答案是:三步。打开冰箱门、把大象装进去、关闭冰箱门。现在我要告诉你,求解汉诺塔问题也是三步。根据汉诺塔游戏的机制我们知道,必须先将第n个盘子移动到C杆上。但如果直接将第n个盘子移动到目标位置又是不行的,因为在这第n个盘子前还有n-1个盘子。此时,我们可以假设有一个函数function(),它可以帮我们将前面n-1个盘子移动到除目标位置以及起始位置外的那个杆子原创 2022-06-29 18:08:54 · 1561 阅读 · 3 评论 -
【算法与数据结构】—— 大数运算
我们知道,在数学中,数值的大小是没有上限的,但是在计算机中,由于字长的限制,计算机所能表示的范围是有限的,当我们对比较小的数进行运算时,如:1234 + 5678,这样的数值并没有超出计算机的表示范围,所以可以运算。但是当我们在实际的应用中进行大量的数据处理时,会发现参与运算的数往往超过计算机的基本数据类型的表示范围,比如说,在天文学上,如果一个星球距离我们为 100 万光年,那么我们将其化简为公里,或者是米的时候,我们会发现这是一个很大的数。这样计算机将无法对其进行直接计算。可能我们认为实际应用中的大数原创 2022-01-15 17:39:55 · 3138 阅读 · 4 评论 -
【算法与数据结构】—— 最小生成树(Prim算法、Kruskal算法)
生成树是一个连通图G的一个极小连通子图。 包含G的所有n个顶点,但只有n-1条边,并且是连通的。 生成树可由遍历过程中所经过的边组成(有多个)。一个带权连通无向图的生成树中,边的权值之和最小的那棵树叫做此图的最小生成树(唯一)。原创 2020-05-05 23:58:41 · 11317 阅读 · 11 评论 -
【算法与数据结构】—— 后缀数组
后缀数组是处理字符串的有力工具。后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现,能够实现后缀树的很多功能且时间复杂度也并不逊色,而且它比后缀树所占用的内存空间小很多。可以说,在信息学竞赛中后缀数组比后缀树要更为实用。原创 2020-04-27 20:33:03 · 2223 阅读 · 6 评论 -
【算法与数据结构】—— 基数排序(后缀数组基础)
基数排序(Radix Sort)是桶排序的扩展,它的基本思想是:将整数按位切割成不同的数字,然后按每个位数分别比较(位操作)。具体做法是:将待排序序列中的所有数字统一为同一数位长度,数位较短的数前面补零(比如对于序列{1,23,456}而言,需要将这序列格式化为{001,023,456})。然后从最低位开始,依次排序,直到最高位排序完成以后, 数列就变成一个有序序列。原创 2020-04-23 21:02:59 · 1406 阅读 · 1 评论 -
【算法与数据结构】—— 并查集
并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题(即所谓的并、查)。比如说,我们可以用并查集来判断一个森林中有几棵树、某个节点是否属于某棵树等。并查集主要由一个整型数组pre[ ]和两个函数find( )、join( )构成。数组 pre[ ] 记录了每个点的前驱节点是谁,函数 find(x) 用于查找指定节点 x 属于哪个集合,函数 join(x,y) 用于合并两个节点 x 和 y 。原创 2020-03-26 20:29:47 · 194728 阅读 · 490 评论 -
【算法与数据结构】—— 动态规划之背包问题
背包问题分为多种,其中最常见的主要是三类:01背包、完全背包、多重背包。这里面最经典的是01背包问题,它基本上已经成为了事实上的动态规划入门级必学算法。下面,我们将对上述的三类背包问题逐个分析。原创 2020-03-15 20:28:50 · 27057 阅读 · 21 评论 -
【算法与数据结构】—— 动态规划之走格子问题
有一个由数字组成的规格为 n×m 的矩阵,初始在左上角,要求每次只能向下或向右移动,问该数字矩阵从最左上角到最右下角的最小路径和是多少?(路径和就是将某路径中的所有权值全部加起来的总和)原创 2020-03-07 16:45:27 · 8633 阅读 · 7 评论 -
【算法与数据结构】—— 动态规划之斐波那契问题
在数学上,斐波纳契数列以如下递归方式被定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N+)根据定义,其前十项为1, 1, 2, 3, 5, 8, 13, 21, 34, 55假设现在给出一个编程问题:输入一个自然数n,要求输出斐波那契数列的第n项(0≤n≤1000000)如果我们根据定义来求解本题,那么...原创 2020-03-04 23:22:12 · 3571 阅读 · 0 评论 -
【算法与数据结构】—— 前缀和与差分
高中时曾学过数列的前n项和Sn,即若存在一组数列{ a~1~,a~2~,a~3~,…,a~n~ },则Sn = a~1~+a~2~+a~3~+…+a~n~,在计算机领域,我们把Sn称为“前缀和”。我们知道,对于m(m原创 2020-02-26 21:32:58 · 1129 阅读 · 3 评论 -
【算法与数据结构】—— 树状数组
树状数组是一个查询和修改复杂度都为log(n)的数据结构,主要用于数组的单点修改以及区间求和。比如说对于某个数组a[0],a[1],a[2],……,a[n],若现在要求动态地对区间[x1,x2]进行求和,我们每次在给出了x1和x2的值后都将执行:for(int i=x1;i原创 2020-02-20 16:03:32 · 948 阅读 · 0 评论 -
【算法与数据结构】—— 博弈论(高阶篇之SG博弈)
博弈论之SG博弈SG博弈的命名源于SG函数和SG定理,而SG函数的出现则来自于一个简单的取石子游戏:有1堆n个的石子,每次只能取{1,3,4}个石子,先取完石子者胜利,判断对于不同的n,先手能否取胜?分析:这个游戏和巴什博弈的不同在于:SG博弈中取东西是无规则不连续的,而巴什博弈中取东西则是连续的因此在讨论SG博弈时要复杂很多,在解答SG博弈类题目时我们需要用到SG函数SG函数:首...原创 2020-02-18 19:42:17 · 940 阅读 · 0 评论 -
【算法与数据结构】—— 博弈论(高阶篇之反尼姆博弈)
博弈论之反尼姆博弈反尼姆博弈:有任意堆物品,每堆物品的个数是任意的,双方轮流从中取物品,每一次只能从一堆物品中取部分或全部物品,最少取一件,取到最后一件物品的人失败。下面直接给出反尼姆博弈中判断必胜局的条件,满足其中任意一点都能取胜:1.各堆物品数目异或结果不等于0,且存在有石子数目大于1的物品堆2.各堆物品数目异或结果等于0,且所有物品堆数目全部为1---经典题型---问题...原创 2020-02-18 12:32:04 · 712 阅读 · 0 评论 -
【算法与数据结构】—— 博弈论(高阶篇之尼姆博弈)
博弈论之尼姆博弈尼姆博弈(Nimm Game):有任意堆物品,每堆物品的个数是任意的,双方轮流从中取物品,每一次只能从一堆物品中取部分或全部物品,最少取一件,取到最后一件物品的人获胜。分析:我们先来看假设有三堆物品时的情况这种情况最有意思,它与二进制有密切关系,我们用(a,b,c)表示某种局势,则前几种奇异局势如下:第一种是(0,0,0),此时无论是谁面对该局势,都必败第二种是(0,...原创 2020-02-17 17:08:57 · 2801 阅读 · 0 评论 -
【算法与数据结构】—— 博弈论(进阶篇之威佐夫博弈)
博弈论之威佐夫博弈威佐夫博弈(Wythoff’s game):有两堆各若干个物品,两个人轮流从任一堆取至少一个或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。这种情况下是颇为复杂的。我们用(a[k],b[k])(a[k] ≤ b[k] ,k=0,1,2,…,n)表示两堆物品的数量并称其为局势,如果甲面对(0,0),那么甲已经输了,这种局势我们称为奇异局势。前几个奇...原创 2020-02-16 16:29:00 · 2461 阅读 · 2 评论 -
【算法与数据结构】—— 博弈论(初级篇之巴什博弈)
博弈论之巴什博弈巴士博弈:有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个(m<n)。最后取光者得胜。显然,如果n=m+1,那么由于一次最多只能取m个物品,所以无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,故后者必然取胜。根据这样的规律,我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,0≤s≤m),那么先取者首先拿走s个...原创 2020-02-14 15:24:06 · 7305 阅读 · 5 评论 -
【算法与数据结构】——图的遍历(二、广度优先搜索BFS)
图的遍历(二、广度优先搜索BFS)宽度优先搜索(BFS, Breadth First Search)是一个针对图和树的遍历算法。发明于上世纪50年代末60年代初,最初用于解决迷宫最短路径和网络路由等问题。对于下面的树而言,BFS方法首先从根节点1开始,其搜索节点顺序是1,2,3,4,5,6,7,8。BFS使用队列(queue)来实施算法过程,队列(queue)有着先进先出FIFO(Firs...转载 2019-09-01 16:57:18 · 550 阅读 · 0 评论 -
【算法与数据结构】——图的遍历(三、深度优先搜索DFS)
图的遍历(三、深度优先搜索DFS)深度优先搜索(DFS, Depth First Search)是一个针对图和树的遍历算法。早在19世纪就被用于解决迷宫问题。对于下面的树而言,DFS方法首先从根节点1开始,其搜索节点顺序是1,2,3,4,5,6,7,8(假定左分枝和右分枝中优先选择左分枝)。DFS的实现方式相比于BFS应该说大同小异,只是把queue换成了stack而已,stack具有后...转载 2019-09-01 17:12:20 · 504 阅读 · 0 评论 -
【算法与数据结构】——最经典的走迷宫最短路径算法(广度优先搜索BFS的典型实例)
迷宫的最短路径问题描述给定一个大小为N×M的迷宫。迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四个的通道移动。请求出从起点到终点所需的最小步数。请注意,本题假定从起点一定可以移动到终点。(N,M≤100)(’#’, ‘.’ , ‘S’, 'G’分别表示墙壁、通道、起点和终点)样例输入:10 10#S######.#…#…#.#.##.##.#.#…##.##.####…#...原创 2019-09-13 17:35:17 · 6798 阅读 · 3 评论 -
【算法与数据结构】——图的遍历(一、概论)
图的遍历(一、概论)图建构好后,针对具体的问题,我们常常需要通盘的读取图中的信息,包括顶点(vertex)和边(edge),以及它们之间的关系。这种读取图中所有信息的方法就是图的遍历(traversal),也称为搜索(search),就是从图中某个顶点出发,沿着一些边访问图中所有的顶点,且使每个顶点仅被访问一次。遍历是很多图论算法的基础。遍历需要决定从哪里开始读,依照什么顺序读,要读到哪里为...转载 2019-09-01 16:32:35 · 632 阅读 · 0 评论