数据结构
文章平均质量分 59
xuuyann
国家一级退堂鼓表演艺术家。
知乎:OpenRobotSL
邮箱:neuxuyan@163.com
展开
-
多线程之无锁队列
环形队列转载 2023-02-22 09:41:48 · 15328 阅读 · 0 评论 -
桶排序详解
桶排序入门介绍⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄ 如果已知N个关键字的取值范围是在0到M-1之间,并且M比N小很多,这种情况下就用桶排序,其原理就是为关键字的每个可能取值建立一个“桶”(Bucket),也就是建立M个桶;在扫描N个关键字时,每遇到一个关键字,就把它丢到相应的桶里去,扫描完了按桶的顺序对数据收集一遍就自然有序了。所以桶的排序效率比一般排序算法的效率要高。下面举个...原创 2018-11-29 19:51:39 · 1567 阅读 · 0 评论 -
基数排序详解
基数排序写在前头(〃‘▽’〃)基数排序时桶排序的一种推广(桶排序详解),它所考虑的待排记录包含不止一个关键字。例如对一副牌进行整理,可将每张牌看做一个记录,包含两个关键字:花色、面值。一副理顺的牌是按如下顺序进行排放的:可见一个有序结果是先按花色划分成四大块,每一块中有按面值大小排序。这是“花色”就是一张牌的“最主位关键字”,而“面值”是“最次位关键字”。对于一般有K个关键字的情况,基...原创 2018-11-30 21:29:28 · 4426 阅读 · 1 评论 -
7-1 最大子列和问题
给定KKK个整数组成的序列{ N1N_1N1, N2N_2N2, ..., NKN_KNK },“连续子列”被定义为{ NiN_iNi, Ni+1N_{i+1}Ni+1, ..., NjN_jNj },其中 1≤i≤j≤K1 \le i \le j \le K1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -...原创 2018-12-08 20:53:35 · 270 阅读 · 0 评论 -
7-2 一元多项式的乘法与加法运算
设计函数分别求两个一元多项式的乘积与和。输入格式:输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。输出格式:输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。输入样例:4 3 4 -5 2 6 1 ...原创 2018-12-08 20:56:17 · 199 阅读 · 0 评论 -
7-3 树的同构
给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。图1图2现给定两棵树,请你判断它们是否是同构的。输入格式:输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数NNN (≤10\le 10≤10),...原创 2018-12-08 21:00:01 · 262 阅读 · 0 评论 -
7-4 是否同一棵二叉搜索树
给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。输入格式:输入包含若干组测试数据。每组数据的第1行给出两个正整数NNN (≤10\le 10≤10)和LLL,分别是每个序列...原创 2018-12-08 21:01:47 · 207 阅读 · 0 评论 -
7-5 堆中的路径
将一系列给定数字插入一个初始为空的小顶堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。输入格式:每组测试第1行包含2个正整数NNN和MMM(≤1000\le 1000≤1000),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-10000, 10000]内的NNN个要被插入一个初始为空的小顶堆的整数。最后一行给出MMM个下标。输出格式:对输入中给出的每个下标...原创 2018-12-08 21:03:15 · 399 阅读 · 0 评论 -
7-6 列出连通集
给定一个有NNN个顶点和EEE条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1N-1N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。输入格式:输入第1行给出2个整数NNN(0<N≤100<N\le 100<N≤10)和EEE,分别是图的顶点数和边数。随后EEE行,每行给出一条边的两个端点。每行中的数字之间用1空...原创 2018-12-08 21:04:25 · 115 阅读 · 0 评论 -
7-7 六度空间
“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论。这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人。”如图1所示。图1 六度空间示意图“六度空间”理论虽然得到广泛的认同,并且正在得到越来越多的应用。但是数十年来,试图验证这个理论始终是许多社会学家努力追求的目标。然而由于...原创 2018-12-08 21:05:56 · 242 阅读 · 0 评论 -
7-8 哈利·波特的考试
哈利·波特要考试了,他需要你的帮助。这门课学的是用魔咒将一种动物变成另一种动物的本事。例如将猫变成老鼠的魔咒是haha,将老鼠变成鱼的魔咒是hehe等等。反方向变化的魔咒就是简单地将原来的魔咒倒过来念,例如ahah可以将老鼠变成猫。另外,如果想把猫变成鱼,可以通过念一个直接魔咒lalala,也可以将猫变老鼠、老鼠变鱼的魔咒连起来念:hahahehe。现在哈利·波特的手里有一本教材,里面列出了所有...原创 2018-12-16 22:50:04 · 239 阅读 · 0 评论 -
7-9 旅游规划
有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。输入格式:输入说明:输入数据的第1行给出4个正整数NNN、MMM、SSS、DDD,其中NNN(2≤N≤5002\le N\le 5002≤N≤500)是城市的个数,顺便假设城市的编号...原创 2018-12-16 22:53:27 · 223 阅读 · 0 评论 -
7-10 公路村村通
现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。输入格式:输入数据包括城镇数目正整数NNN(≤1000\le 1000≤1000)和候选道路数目MMM(≤3N\le 3N≤3N);随后的MMM行对应MMM条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到NNN编...原创 2018-12-16 23:02:05 · 174 阅读 · 0 评论 -
7-11 关键活动
假定一个工程项目由一组子任务构成,子任务之间有的可以并行执行,有的必须在完成了其它一些子任务后才能执行。“任务调度”包括一组子任务、以及每个子任务可以执行所依赖的子任务集。比如完成一个专业的所有课程学习和毕业设计可以看成一个本科生要完成的一项工程,各门课程可以看成是子任务。有些课程可以同时开设,比如英语和C程序设计,它们没有必须先修哪门的约束;有些课程则不可以同时开设,因为它们有先后的依赖关系,...原创 2018-12-16 23:04:54 · 179 阅读 · 0 评论 -
7-13 统计工龄
给定公司NNN名员工的工龄,要求按工龄增序输出每个工龄段有多少员工。输入格式:输入首先给出正整数NNN(≤105\le 10^5≤105),即员工总人数;随后给出NNN个整数,即每个员工的工龄,范围在[0, 50]。输出格式:按工龄的递增顺序输出每个工龄的员工个数,格式为:“工龄:人数”。每项占一行。如果人数为0则不输出该项。输入样例:810 2 0 5 7 2 5 2输出...原创 2018-12-16 23:09:54 · 348 阅读 · 0 评论 -
C++ STL 对Map容器进行排序——按key排序与按value排序
map是用来存放&amp;lt;key, value&amp;gt;键值对的数据结构,可以很方便快速的根据key查到相应的value。假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区分),我们用map来进行存储就是个不错的选择。 我们这样定义,map&amp;lt;string, int&amp;gt;,其中学生姓名用string...转载 2018-12-28 14:59:11 · 2190 阅读 · 0 评论 -
7-14 电话聊天狂人
给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人。输入格式:输入首先给出正整数NNN(≤105\le 10^5≤105),为通话记录条数。随后NNN行,每行给出一条通话记录。简单起见,这里只列出拨出方和接收方的11位数字构成的手机号码,其中以空格分隔。输出格式:在一行中给出聊天狂人的手机号码及其通话次数,其间以空格分隔。如果这样的人不唯一,则输出狂人中最小的号码及其通话次数,...原创 2018-12-31 10:35:09 · 1206 阅读 · 0 评论 -
7-15 QQ帐户的申请与登陆(Map)
实现QQ新帐户申请和老帐户登陆的简化版功能。最大挑战是:据说现在的QQ号码已经有10位数了。输入格式:输入首先给出一个正整数NNN(≤105\le 10^5≤105),随后给出NNN行指令。每行指令的格式为:“命令符(空格)QQ号码(空格)密码”。其中命令符为“N”(代表New)时表示要新申请一个QQ号,后面是新帐户的号码和密码;命令符为“L”(代表Login)时表示是老帐户登陆,后面是...原创 2018-12-31 10:48:17 · 407 阅读 · 0 评论 -
还原二叉树(根据先序遍历中序遍历求树高以及还原树\根据后序便利中序遍历求树高以及还原树)
还原二叉树要求1:给定一颗二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度,同时对该二叉树进行层序遍历并输出。1.分析:根据定义,二叉树的先序遍历是先访问根结点,其次,再按先序遍历方式遍历根结点的左子树,最后按先序遍历的方式遍历根结点的右子树。这就是说,在先序遍历序列中,第一个结点一定是二叉树的根结点。同样根据定义,二叉树的中序遍历是先遍历左子树,然后访问根结点,最后再遍历...原创 2018-11-26 15:06:09 · 769 阅读 · 0 评论 -
快速排序学习笔记
快速排序 快速排序一听名字就觉得很高端,在实际应用当中快速排序确实也是表现最好的排序算法。快速排序虽然高端,但其实其思想是来自冒泡排序,冒泡排序是通过相邻元素的比较和交换把最小的冒泡到最顶端,而快速排序是比较和交换小数和大数,这样一来不仅把小数冒泡到上面同时也把大数沉到下面.快速排序原理将未排序元素根据一个作为基准的“主元”(pivot)分为两个子序列,其中一个子序列中的元素均大...原创 2018-11-29 11:22:49 · 235 阅读 · 0 评论 -
二分查找与黄金分割查找
顺序查找效率低。使用哨兵的顺序查找可以少写一个对边界条件进行判断的分支,时间复杂度为O(N)。 二分查找有静态的查找和动态的查找。二分查找效率log(N),但是必须时存储在线性的结构数组中,适合于静态查找;当用二叉判定树的时候,方便数据的插入和删除。 在二分查找中,我们是取mid等于left和right的中间值,即用等分的方法进行查找。 那为什么一定要等分呐?能不能进行“黄金分割...转载 2018-10-08 18:21:11 · 1470 阅读 · 0 评论 -
连续两次递归调用的粗浅分析
本文将从两个简单代码出发,对具有连续两次递归调用的程序进行粗浅分析,试图从堆栈的角度对其进行解释。首先,什么是递归函数?在数学与计算机科学中,递归(Recursion)是指在函数的定义中使用函数自身的方法。实际上,递归,顾名思义,其包含了两个意思:递 和 归,这正是递归思想的精华所在。正如上面所描述的场景,递归就是有去(递去)有回(归来),如下图所示。“有去”是指:递归问题必须可以分...原创 2018-10-10 19:50:17 · 4195 阅读 · 7 评论 -
PTA||02-线性结构1 两个有序链表序列的合并
本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。函数接口定义:List Merge( List L1, List L2 );其中List结构定义如下:typedef struct Node *PtrToNode;struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /*...原创 2018-10-17 18:13:45 · 216 阅读 · 0 评论 -
PTA||02-线性结构2 一元多项式的乘法与加法运算
设计函数分别求两个一元多项式的乘积与和。输入格式:输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。输出格式:输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。输入样例:4 3 4 -5 2 6 1 ...原创 2018-10-20 09:18:44 · 244 阅读 · 0 评论 -
数据结构学习笔记(参考)
这篇学习笔记转载自ranjiewen的博客,内容非常详尽,笔者偷懒直接搬过来了中国大学MOOC-陈越、何钦铭-数据结构-2017春学习地址详细学习内容Github记录地址 欢迎fork和star,有惊喜值得学习!参考学习笔记参考AC代码数据结构和算法学习笔记学习内容第一讲 基本概念 [陈越]1.1 什么是数据结构1.2 什么是算法1.3 应用实例:最大子列和问...转载 2018-10-28 15:27:45 · 767 阅读 · 1 评论 -
PTA || 04-树4 是否同一棵二叉搜索树
给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。输入格式:输入包含若干组测试数据。每组数据的第1行给出两个正整数NNN (≤10\le 10≤10)和LLL,分别是每个序列...原创 2018-10-23 11:10:40 · 255 阅读 · 0 评论 -
PTA || 03-树1 树的同构
给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。图1图2现给定两棵树,请你判断它们是否是同构的。输入格式:输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数NNN (≤10\le 10≤10),...原创 2018-10-23 11:19:48 · 433 阅读 · 2 评论 -
PTA || 03-树2 List Leaves
Given a tree, you are supposed to list all the leaves in the order of top down, and left to right.Input Specification:Each input file contains one test case. For each case, the first line gives a p...原创 2018-10-21 15:54:29 · 277 阅读 · 0 评论 -
PTA || 05-树7 堆中的路径
将一系列给定数字插入一个初始为空的小顶堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。输入格式:每组测试第1行包含2个正整数NNN和MMM(≤1000\le 1000≤1000),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-10000, 10000]内的NNN个要被插入一个初始为空的小顶堆的整数。最后一行给出MMM个下标。输出格式:对输入中给出的每个下标...原创 2018-10-31 15:32:52 · 313 阅读 · 0 评论 -
PTA || 04-树5 Root of AVL Tree
An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing i...原创 2018-10-24 18:20:05 · 778 阅读 · 0 评论 -
PTA || 02-线性结构3 Reversing Linked List
Given a constant KKK and a singly linked list LLL, you are supposed to reverse the links of every KKK elements on LLL. For example, given LLL being 1→2→3→4→5→6, if K=3K = 3K=3, then you must output 3...原创 2018-11-04 20:57:13 · 623 阅读 · 0 评论 -
PTA || 06-图1 列出连通集
给定一个有NNN个顶点和EEE条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1N-1N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。输入格式:输入第1行给出2个整数NNN(0<N≤100<N\le 100<N≤10)和EEE,分别是图的顶点数和边数。随后EEE行,每行给出一条边的两个端点。每行中的数字之间用1空...原创 2018-11-04 21:22:54 · 1121 阅读 · 1 评论 -
Dijkstra算法(有权图单源最短路径)
从一个源点到其他各顶点的最短路径问题称为“单源最短路径问题”。最短路径的最优子结构性质该性质描述为:如果P(i,j)={Vi…Vk…Vs…Vj}是从顶点i到j的最短路径,k和s是这条路径上的一个中间顶点,那么P(k,s)必定是从k到s的最短路径。下面证明该性质的正确性。假设P(i,j)={Vi…Vk…Vs…Vj}是从顶点i到j的最短路径,则有P(i,j)=P(i,k)+P(k...原创 2018-11-07 14:54:53 · 4357 阅读 · 0 评论 -
queue(队列)的用法与循环队列对照(常用方法)
其实啊,我写这篇博客的时候还不知道C++的具体语法(emmmmmm以后肯定会),只是看到人家的程序里能够直接调用queue省时省力,而我只会一遍又一遍的写queue的子函数,太费劲。所以呢,出于偷懒的目的,我总结一下偷懒的常用途径。队列的定义队列是一种容器适配器,专门设计用于在FIFO上下文(先进先出)中操作,其中元素插入容器的一端并从另一端提取。 队列被实现为容器适配器,它是使用特定容...原创 2018-11-05 11:20:06 · 3412 阅读 · 0 评论 -
Flody算法(有权多源最短路径问题)
多源最短路径问题,即为求每一对顶点之间的最短路径问题算法描述算法思想原理:Floyd算法是一个经典的动态规划算法。用通俗的语言来描述的话,首先我们的目标是寻找从点i到点j的最短路径。从动态规划的角度看问题,我们需要为这个目标重新做一个诠释(这个诠释正是动态规划最富创造力的精华所在)从任意节点i到任意节点j的最短路径不外乎2种可能,1是直接从i到j,2是从i经过若干个节点k到...转载 2018-11-08 21:24:15 · 949 阅读 · 0 评论 -
最小生成树 Prim Kruskal算法
最小生成树最小生成树定义是一棵树无回路|V|个顶点一定有|V|-1条边是生成树包含全部顶点|V|-1条边都在图内最小边的权重和最小 总的来说,最小生成树覆盖图中所有顶点以及|V|-1条边。Prim和Kruskal这两种算法均属于贪心算法贪心算法:“贪”:每一步都要最好的“好”:权重最小的边但是在这两种算法中需要有约束...原创 2018-11-15 21:25:35 · 398 阅读 · 0 评论 -
排序算法_1(冒泡、插入、希尔、堆排序、归并排序)
写在文章前头的东西排序函数接口统一:void XSort(ElementType A[], int N);简单起见,程序均为从小到大排序;只讨论基于比较的排序;稳定性:任意相等的两个元素,在排序过程中的相对位置不会发生改变;没有任何一种算法在任何情况下就表现最好;笔者自从发现思维导图有奇效后,哪哪儿都喜欢画画思维导图,因此本文会出现比较多的思维导图,不适应者可避开雷区٩꒰▽ ꒱۶⁼...原创 2018-11-21 10:13:16 · 302 阅读 · 0 评论 -
单向链表的逆转
逆转单向链表的意思就是,给定你一个单向链表,和一个整数N,N为要逆转的结点数,要求你把链表从头结点到第N个结点给逆转过来。意思是这样的,如下图所示:给出一个单向链表,和给定整数N=4,也就是要求把该链表从头结点(Head->Next)开始到第四个结点,把他们逆转过来,像下面逆转后头结点由1变成了4,然后...转载 2018-09-29 15:28:50 · 1229 阅读 · 0 评论