数据结构

数据结构实验之串一:KMP简单应用

最后都变了- 提交于 2020-02-19 14:57:52
Description 给定两个字符串string1和string2,判断string2是否为string1的子串。 Input 输入包含多组数据,每组测试数据包含两行,第一行代表string1(长度小于1000000),第二行代表string2(长度小于1000000),string1和string2中保证不出现空格。 Output 对于每组输入数据,若string2是string1的子串,则输出string2在string1中的位置,若不是,输出-1。 Sample Input abc a 123456 45 abc ddd Output 1 4 -1 Hint #include <iostream> #include <stdio.h> #include <string.h> using namespace std; char str1[1000001],str2[1000001]; int nex[1000001]; void getNext() { int i=0,j=-1; nex[0]=-1; while(str2[i]!='\0') { if(j==-1||str2[i]==str2[j]) { ++i; ++j; nex[i]=j; } else { j=nex[j]; } } } void kmp() { int len1,len2; len1=strlen

大话数据结构笔记——第七章 图

佐手、 提交于 2020-02-19 13:46:06
1 图的定义 1)各种图定义 2)图的顶点与边间关系 3)连通图相关术语 4)图的定义与术语总结 2 图的抽象数据类型 3 图的存储结构 1)邻接矩阵 时间复杂度O(n)。 2)邻接表 3)十字链表 4)邻接多重表 5)边集数组 4 图的遍历 1)深度优先遍历 2)广度优先遍历 5 图的最小生成树 通过前面的学习,对于含有 n 个顶点的 连通图 来说可能包含有多种 生成树 ,例如 图 1 所示: 普利姆算法(Prim): 先选中一个结点为一个整体,在剩下所有结点与该整体的所有边中选一条最短的边,将这条新出现边的一个顶点归入这个整体中,然后在新合成的整体与剩下的所有结点的所有边中选一条最短的边,将这条新出现边的一个顶点归入这个整体中,以此类推,直到所有结点遍历完。(以结点为目标构建最小生成树,适合边数多的稠密图) 【步骤】 (1)从图中选取一个节点作为 起始节点 (也是树的根节点),标记为已达; 初始化所有未达节点到树的距离为到根节点的距离 ; (2)从剩余未达节点中选取到树距离最短的节点i,标记为已达; 更新未达节点到树的距离 (如果节点到节点i的距离小于现距离,则更新); (3) 重复步骤2 直到所有n个节点均为已达。 克鲁斯卡尔算法(Kruskal): 在带权连通图中,不断地在边集合中找到最小的边,如果该边满足得到最小生成树的条件,就将其构造,直到最后得到一颗最小生成树。

数据结构与算法——作业1

ぃ、小莉子 提交于 2020-02-19 07:16:02
作业: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/two-sum 代码: nums = [ 2 , 7 , 11 , 15 ] target = 9 输入数组和目标值 n = len ( nums ) 取数组长度 for j in range ( n ) : 迭代 for i in range ( j + 1 , n ) : 题目要求不能重复使用相同元素 if ( nums [ i ] + nums [ j ] == target ) : print ( [ i , j ] ) 判断 得到结果: C : \Users\Alicerain\AppData\Local\Programs\Python\Python37\python . exe C : / Users / Alicerain / PycharmProjects / untitled5 /

数据结构--KMP

坚强是说给别人听的谎言 提交于 2020-02-19 07:13:06
KMP是一种处理字符串的方法,它的主要作用是寻找一个模板字符串p,在主字符串s中出现的位置。 在长字符串中找出一个短字符串的子串,这样的算法用暴力搜索当然是可以完成的,而且很容易考虑。但是,暴力的结果一定是极高的时间复杂度,如果长串的长度为n,短串的长度为m的话,那么暴力的时间复杂的应该是O(nm)的。 所以学会KMP还是蛮有用的,但是再学KMP之前,我们也得先用暴力的方法实现字符串的匹配,然后在对暴力算法理解优化的过程中,我们才可以更好的理解KMP算法。 1.暴力求解 就是很简单的双重循环遍历,一个一个字符的比较,若全部匹配成功则弹出,否则从长串的下一个字符处继续遍历。 const int N = 100010 , M = 10010 ; char p [ N ] , s [ M ] ; int n , m ; int main ( ) { cin >> n >> p + 1 >> m >> s + 1 ; for ( int i = 1 ; i <= n ; i ++ ) { bool flag = 1 ; for ( int j = 1 ; j <= n ; j ++ ) { if ( s [ j ] != p [ i + j - 1 ] ) { flag = 0 ; break ; } } } } 就这样的暴力方式,不难看出,每次只往后移动一个字符的遍历效率是非常低的。 2

基数排序--数据结构排序(JAVA)

女生的网名这么多〃 提交于 2020-02-19 04:24:58
基数排序介绍(桶排序)介绍: 1) 基数排序 属于“分配式”排序,又称“桶子法”,顾名思义,它是通过键值的各个位的值,将要排序的 元素分配 至某些“桶”中,达到排序的作用; 2)基数排序法是属于稳定性的排序,基数排序法是效率高的 稳定性排序法 ; 3)基数排序是 桶排序 的拓展; 4)基数排序是1887年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按照每个位数分别比较。 基数排序基本思想:     将所有待比较数值统一为同样的数为长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成了一个有序序列。 基数排序图文说明: 代码实现: import java . util . Arrays ; public class RadixSort { public static void main ( String args [ ] ) { int [ ] arr = { 53 , 3 , 542 , 748 , 14 , 214 } ; radixSort ( arr ) ; } public static void radixSort ( int [ ] arr ) { int max = arr [ 0 ] ; for ( int i = 1 ; i < arr . length ; i ++ )

C数据结构与算法-基础整理-图-06:克鲁斯卡尔算法详解

对着背影说爱祢 提交于 2020-02-19 04:08:47
详解最小生成树中的克鲁斯卡尔算法 0x01.关于克鲁斯卡尔算法 Kruskal算法 是一种用来查找 最小生成树 的算法,由Joseph Kruskal在1956年发表。克鲁斯卡尔算法主要针对边集数组展开。 0x02.基础代码 这个算法主要是针对边集数组,先来看一下边集数组的结构: //边集数组 typedef struct { int begin; int end; int weight; }Edge; 通常用到邻接矩阵,所以还需要由邻接矩阵转化为边集数组。另外这个算法还需要按照边的权值升序排序。 void OperationEdge(Graph G, Edge* edges) { int i, j,k; k = 0; for (i = 0; i < G.numv; i++) { for (j = i+1; j < G.numv; j++)//只需要转化邻接矩阵的一半,无向图 { if (G.edge[i][j] != INTMAX && G.edge[i][j] != 0) { edges[k].begin = i; edges[k].end = j; edges[k].weight = G.edge[i][j]; k++; } } } for (i = 0; i < k-1; i++)//简单交换排序 { for (j = i + 1; j < k; j++) { if

数据结构:霍夫曼树与霍夫曼编码(Huffman Tree)

断了今生、忘了曾经 提交于 2020-02-19 00:50:43
霍夫曼树与霍夫曼编码(Huffman Tree) 在这样的情况下,如果大多数人都是90分以上,那么大多数人需要进行4次判断才能有结果,造成时间的浪费。 【引申:判断的时候要把最常发生、最可能发生的情况放在前面】 —>如何根据节点不同的查找频率构造更有效的搜索树? 霍夫曼树的定义 带权路径长度(WPL) 设二叉树有n个叶子结点,每个叶子结点带有权值 w k w_k w k ​ ,从根节点到每个叶子结点的长度为 I k I_k I k ​ (这个 I k I_k I k ​ 不是边的长度,而是从根节点到这个节点的边长+1,即根节点为1,往下数依次加一(假设边权为1)),则每个叶子结点的带权路径长度之和就是: W P L = ∑ k − 1 n w k I k WPL = \sum\limits_{k-1}^{n}w_kI_k W P L = k − 1 ∑ n ​ w k ​ I k ​ 最优二叉树 或 霍夫曼树 WPL最小的二叉树。 霍夫曼树的构造 核心:每次把权值最小的两颗二叉树合并 合并后,即出现一颗新的树,该树的节点为两个子树的权值的和,把这个 和 去与其他的权值比较,再选出两个最小的合并,以此类推,知道最后只剩下两个节点(子树),将他们合并。 “选取两个最小的”:用** 最小堆 **实现 霍夫曼树的特点 1、没有度为1的节点。构造的时候始终是两两合并。 2

Map源码会问哪些面试题

爷,独闯天下 提交于 2020-02-18 15:20:34
1 Map 整体数据结构类问题 1.1 说一说 HashMap 底层数据结构 答:HashMap 底层是数组 + 链表 + 红黑树的数据结构,数组的主要作用是方便快速查找,时间复杂度是 O(1),默认大小是 16,数组的下标索引是通过 key 的 hashcode 计算出来的,数组元素叫做 Node,当多个 key 的 hashcode 一致,但 key 值不同时,单个 Node 就会转化成链表,链表的查询复杂度是 O(n),当链表的长度大于等于 8 并且数组的大小超过 64 时,链表就会转化成红黑树,红黑树的查询复杂度是 O(log(n)),简单来说,最坏的查询次数相当于红黑树的最大深度。 1.2 HashMap、TreeMap、LinkedHashMap 三者有啥相同点,有啥不同点? 答:相同点: 三者在特定的情况下,都会使用红黑树; 底层的 hash 算法相同; 在迭代的过程中,如果 Map 的数据结构被改动,都会报 ConcurrentModificationException 的错误。 不同点: HashMap 数据结构以数组为主,查询非常快,TreeMap 数据结构以红黑树为主,利用了红黑树左小右大的特点,可以实现 key 的排序,LinkedHashMap 在 HashMap 的基础上增加了链表的结构,实现了插入顺序访问和最少访问删除两种策略; 由于三种 Map

数据结构_数组

99封情书 提交于 2020-02-18 12:39:53
// 数组 let nums = [1,2,3] //字面量 let arr = new Array(0,1,2,3,4,5) //实例Array // 增加 // pusu方法 在数组末尾添加数据 // unshift方法 在数组头部添加数据 nums.push(4) nums.unshift(0) // 删除 // pop方法 在数组末尾删除数据 // shift方法 在数组头部删除数据 arr.pop() arr.shift() // 替换 // splice(start, num, value1, value2)方法 // start:开始的下标 // num:替换(删除)的个数,为0就不替换 // value:可取,没有参数时不发生改变,有值就添加参数 nums.splice(1, 2) arr.splice(1, 2, 'a', 'b') // 截取,返回的是一个新数组 // slice(start, end) // start:开始的下标 // end:结束的下标 let newNums = nums.slice(1, 3) let newArr = arr.slice(1, 3) // join函数 指定的分隔符进行分隔,将数组转换成字符串 newNums.join(',') 来源: https://www.cnblogs.com/JunLan/p/12324910