![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
海天一树
信息学奥赛研究。
展开
-
KMP算法
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特—莫里斯—普拉特算法。KMP算法主要分为两个步骤:字符串的自我匹配,目标串和模式串之间的匹配。 (1)字符串的自我匹配 所谓字符串的自我匹配,就是看字符串中左右侧相等的最长子串的字符个数。以字符串“12121”为例,左侧的子串为“1”、“12”、“12原创 2013-02-26 14:24:24 · 14743 阅读 · 7 评论 -
图的深度优先搜索
深度优先搜索是一种在开发爬虫早期使用较多的方法。它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件)。在一个HTML文件中,当一个超链被选择后,被链接的HTML文件将执行深度优先搜索,即在搜索其余的超链结果之前必须先完整地搜索单独的一条链。深度优先搜索沿着HTML文件上的超链走到不能再深入为止,然后返回到某一个HTML文件,再继续选择该HTML文件中的其他超链。当不再有其他超链可原创 2017-09-02 00:06:58 · 394 阅读 · 0 评论 -
图的广度优先搜索
广度优先搜索算法是最简便的图的搜索算法之一,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。广度优先搜索,又称宽度优先搜索。其英文全称为Breadth First Search,简称BFS。(一)基本思想1 首先访问起始顶点v 2 接着由v出发,依次访问v的各个未访问过的邻接顶点w1,w2,…,wi;原创 2017-09-03 09:21:23 · 534 阅读 · 0 评论 -
二叉树的深度优先搜索
(一)基本思想分析:使用两个栈来存放节点元素,栈1用来存放未遍历过的节点,栈2用来存放遍历的节点。具体步骤:(1)把第一个节点压进栈1。见图(a)(2)把栈1中的栈顶节点弹出,压进栈2;若栈1为空,且被弹出节点有子节点,则把被弹出节点的子节点按从右到左的顺序压进栈1。见图(b)(3)重复步骤2,直至栈1为空。见图(c)~图(h)(4)至此,遍历过程结束。遍历顺序就是栈2中节点的入栈顺序。(二原创 2017-09-03 09:22:37 · 588 阅读 · 0 评论 -
二叉树的广度优先搜索
(一)基本思想使用两个队列存放节点元素,队列1用来存放未遍历过的节点,队列2用来存放遍历的节点。具体步骤: 步骤: (1)把根结点,放到队列1中。见图(a)(2)弹出队列1的中的队首元素,被弹出的元素放到队列2中。若该队首元素有子节点,按从到右的顺序加入到队列1中。见图(b)(3)重复步骤2),见图(c)~图(h)(4)整个过程结束。队列2中的元素顺序就是使用广度优先搜索方法所遍历的顺序。原创 2017-09-03 09:23:18 · 697 阅读 · 0 评论 -
Codeforces Round 472-2A题解报告
Overlooking the captivating blend of myriads of vernal hues, Arkady the painter lays out a long, long canvas.Arkady has a sufficiently large amount of paint of three colours: cyan, magenta, and yell...原创 2018-03-26 19:23:42 · 265 阅读 · 0 评论 -
AtCoder入门练习题B--题解报告
一、题目https://practice.contest.atcoder.jp/tasks/practice_2二、分析这里有三组测试用例。第一组N = 26, Q = 1000。因为N * N < Q,所以可用冒泡排序法。具体代码参考官方给的Sample Code。第二组N = 26, Q = 100,由于询问次数只有100次,可用插入排序法处理。每插入一个数据前,...原创 2018-04-09 19:10:05 · 348 阅读 · 0 评论 -
用递归法把二叉树的叶子结点按从左到右的顺序连成一个单链表
一、例子上图中的二叉树的叶子结点,按从左到右的顺序连成的单链表如下图所示:二、定义数据结构typedef struct tree{ int data; struct tree *left; struct tree *right;}node, *pnode;pnode firstLeaf; // 记录叶子链表的第一个叶子结点pnod...原创 2018-04-18 12:43:02 · 8940 阅读 · 0 评论 -
USACO算法平台介绍
一、平台简介usaco是美国中学生的官方竞赛网站,美国著名在线题库,专门为信息学竞赛选手准备,但必须在注册后才能进入题库1,虽然说是面对美国中学生的网站,但是里面的题目对于新手来说并不简单。二、注册1 首先我们进入train.usaco.org 2 在登录栏上面有“Register here for a username/password”这一行,点击进去 3 按照要求输入名字...原创 2018-04-13 15:26:10 · 2468 阅读 · 0 评论 -
Bloom Filter布隆过滤器
一、简介Bloom Filter是1970年由Bloom提出的,最初广泛用于拼写检查和数据库系统中。近年来,随着计算机和互联网技术的发展,数据集的不断扩张使得 Bloom filter获得了新生,各种新的应用和变种不断涌现。Bloom filter是一个空间效率很高的数据结构,它由一个位数组和一组hash映射函数组成。Bloom filter可以用于检索一个元素是否在一个集合中,它的优点是空间...原创 2018-04-20 18:48:28 · 259 阅读 · 0 评论 -
二叉树的建立和遍历
一、基本概念二叉树:每个结点的子结点个数不大于2的树,叫做二叉树。 根结点:最顶部的那个结点叫做根结点,根结点是所有子结点的共同祖先。比如上图中的“7”结点就是根结点。 子结点:除了根结点外的结点,都叫子结点。 叶子结点:没有子结点的结点,叫做叶子结点。比如上图中的“1”结点、“5”结点和“11”结点。二叉树的遍历,有三种: (1)前序遍历:先遍历根结点,再遍历左子树,最后遍历...原创 2018-04-25 12:20:02 · 263 阅读 · 0 评论 -
数据结构--栈
栈是一种先入后出的数据结构。 如下图所示,入栈的顺序为1、2、3;出栈的顺序则反过来:3、2、1。可以想象往一个箱子里放书,先放进去的书必然在箱子的底部,最后放进去的书在箱子的顶部。拿书的时候则要先拿顶部(后放进去)的书,最先放进去的书最后才能拿出来。栈可以用链表来实现:#include<iostream>using namespace std;struct...原创 2018-04-25 13:15:37 · 212 阅读 · 0 评论 -
小朋友学数据结构(1):约瑟夫环的链表解法、数组解法和数学公式解法
约瑟夫环(Josephus)问题是由古罗马的史学家约瑟夫(Josephus)提出的,他参加并记录了公元66—70年犹太人反抗罗马的起义。约瑟夫作为一个将军,设法守住了裘达伯特城达47天之久,在城市沦陷之后,他和40名死硬的将士在附近的一个洞穴中避难。在那里,这些叛乱者表决说“要投降毋宁死”。于是,约瑟夫建议每个人轮流杀死他旁边的人,而这个顺序是由抽签决定的。约瑟夫有预谋地抓到了最后一签,并且,作为...原创 2018-04-21 17:36:12 · 2266 阅读 · 19 评论 -
查找算法(一):顺序查找
查找-是最常见的数据操作之一,数据结构核心运算之一,其重要性不言而喻。顺序查找是人们最熟悉的查找策略,对于小规模的数据,顺序查找是个不错的选择。(一)基本思想从数据的第一个元素开始,依次比较,直到找到目标数据或查找失败。 1 从表中的第一个元素开始,依次与关键字比较。 2 若某个元素匹配关键字,则查找成功。 3 若查找到最后一个元素还未匹配关键字,则查找失败。(二)时间复杂度顺序查找平均关键字原创 2017-08-31 13:26:27 · 365 阅读 · 0 评论 -
字符串匹配:BF算法
(1)算法原理 BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符;若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果。 BF算法是一种蛮力算法。 举例说明: S: ababcababa原创 2013-02-26 14:23:18 · 14663 阅读 · 0 评论 -
算法1:判断链表中是否有环
#include typedefstruct list { int data; struct list *next;} LIST;/* Method 1: check the occurrence of p->next from head to p */int check_circle_1(LIST *head) { LIST *p = head, *q= NULL; if (p == NULL) return0; while (p->next){原创 2011-05-20 21:25:00 · 10715 阅读 · 0 评论 -
程序员必须掌握的8大排序算法
分类: 1)插入排序(直接插入排序、希尔排序) 2)交换排序(冒泡排序、快速排序) 3)选择排序(直接选择排序、堆排序) 4)归并排序 5)分配排序(基数排序)一、直接插入排序(一)基本思想在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。...原创 2017-08-28 19:42:10 · 2170 阅读 · 0 评论 -
艾洛积分系统(Elo Rating System)
一、基本公式A、B 两个待比较、评价的对象,分别打分为RARAR_A,RBRBR_B,则各自获胜的期望值为: ⎧⎩⎨⎪⎪⎪⎪⎪⎪EA=11+10(RB−RA)/400EB=11+10(RA−RB)/400{EA=11+10(RB−RA)/400EB=11+10(RA−RB)/400\left\{\begin{split}E_A=\frac1{1+10^{(R_B-R_A)/400}}\...原创 2018-05-28 11:43:55 · 4554 阅读 · 0 评论