数据结构
Mr.琛
钻石要琢磨
展开
-
C++ STL容器(五)之map
map是C++ STL中的一种有序关联映射容器,map容器中的元素的数据组成为键值和其对应的数据(称键值对),通过pair封装成结构对象。map的数据组织方式同set一样,也是通过红黑树(Red-Black Tree)实现。使用时需使用宏语句:#include<map>一.几种创建map的方式: 1.用默认的less<T>函数对象(即元素键值按照从小到大的顺...原创 2020-01-17 00:25:36 · 161 阅读 · 0 评论 -
C++ STL容器(四)之multiset
multiset是一个可容纳重复元素键值的有序多重集合容器,与set组织数据元素的方式类似,都是采用红黑树,它们的区别主要在于set不允许重复元素键值,而multiset允许重复的元素键值。使用时需使用宏语句(其标准头文件也是set)#include<set>一.几种创建multiset的方式: 1.按默认比较函数创建空的multiset; multiset<i...原创 2020-01-15 10:42:46 · 1727 阅读 · 0 评论 -
C++ STL容器(二)之deque
C++ STL中的deque是一个双端队列容器,可在容器首尾以O(1)的时间复杂度添加/删除元素。deque中的数据元素是采用分块的线性结构进行存储,deque分成若干线性存储块(deque块)。使用时需要宏语句:#include<deque>一.几种创建deque的方式: 1.创建一个空的deque; deque<int>d1; 2.创建一个具...原创 2020-01-13 11:07:07 · 184 阅读 · 0 评论 -
C++ STL容器(一)之vector
C++的STL中的vector容器是数组的一个泛化推广,不仅可以随机访问元素,还可以较便捷的插入和删除元素。使用时要用宏语句:#include<vector>一.几种创建vector的方式: 1.创建一个空的vector; vector<int>v1; 2.指定长度的vector; vector<int>v2(10); 3.指定...原创 2020-01-12 19:50:45 · 251 阅读 · 0 评论 -
快速排序算法学习整理
快速排序被认为是所有同数量级排序(O(n*logn))的排序方法中平均性能最好的,同时它也是C++sort函数的底层实现(下面简述快排)。个人理解快排是分治思想的排序,每次找一个中心点,将比其小的丢到它左边,比其大的丢到它右边(以排成递增序列为例),下次就对其左边和右边的两个子区间进行这样的操作。思路:每次选出一个中心点(最传统的选法是直接选区间第一个元素)先存到一个辅助空间上,再设两个指针...原创 2019-11-21 23:08:01 · 214 阅读 · 0 评论 -
插入排序算法整理(直接插入,折半插入,希尔)
1.直接插入排序每次将一个数据插入到已排序好的有序表中,从而每次得到一个新的,记录数增1的有序表,最后形成整个表有序,时间复杂度为O(n^2)。//直接插入排序; void Direct_Insert_Sort(int *my_list){ int i,j; for(i=2;i<=length;i++) { if(my_list[i]<my_list[i-1])//若...原创 2019-11-18 21:26:29 · 187 阅读 · 0 评论 -
拓扑排序算法总结
拓扑排序算法复习总结:拓扑排序是图论中较为简单的一个算法,思路较为直接。简单而言,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。(贴自百度百科)拓扑排序思路:(1)找入度为0的结点存入答案序列;(2)将与该结点相关的出边删除(相应的结点入度减1);重复上述过程至不存在入度为0的结点。拓扑排序一般用法:(1)拓扑排序通常涉及图中结点的优先级关系,要由一系列结点...原创 2019-10-26 15:43:46 · 1507 阅读 · 0 评论 -
最小生成树算法总结(Prim和Kruskal算法)
今天刚好上课讲到最小生成树,来复习一下最小生成树算法。最小生成树实质上就是贪心思想在图论上的一个应用,无论是prim还是kruskal算法,都离不开选择边权时的贪心策略,即总是找当前结点相关的最小边权加入完成的集合中,直到达到最优解。...原创 2019-10-23 08:09:55 · 787 阅读 · 0 评论 -
牛客--最优屏障(栈+前缀后缀模拟)
思路:由于屏障作用后使得隔离两侧的哨兵彼此不能看到另一侧,即只能在同一侧内观察,故要试图找出出每个隔离位置前面及后面的防御力,由于屏障的隔离性,选择用一个类似前缀数组,一个类似后缀数组来分别存从1-i每个位置往前看和往后看的防御力值,由于上述式子的限定,其实对于每一个位置,在看的一座较高山后面的较矮山都看不到了,由于从头到目标的前一个位置都要求一个高度递减的单调性,故采用栈结构来存每座山,遍历时...原创 2019-09-17 20:31:46 · 367 阅读 · 0 评论 -
顺序线性表的插入,删除及遍历(C语言实现)
#include<stdio.h>#include<stdlib.h>#define List_Init_Size 100//空间初始分配量; #define Listcreate 10//空间分配的增量;#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status;typedef in...原创 2019-09-03 22:15:46 · 1864 阅读 · 0 评论 -
HDU1512--Monkey King(并查集+左偏树)
题意:一堆猴子刚开始都不认识彼此,要打完架才认识…每次他们会找自己认识的最厉害的猴子打架,打完这个猴子的厉害值减半(向下取整),询问打完后认识的猴子中的最厉害的值(若已经认识输出-1)。思路:用并查集判断是否认识,用左偏树去维护大根堆,实现快速合并。注意:每次删完根节点要把它子节点和距离置空,不时合并时会MLE…#include<cstdio>#include<cstri...原创 2019-08-26 11:04:19 · 106 阅读 · 0 评论 -
数据结构之循环队列及其相关操作(c语言实现)
循环队列是队列的顺序存储结构,将顺序队列臆造为一个环状空间,可较好的利用有限的空间,但是空间为静态;同时,由于环状的特殊,判满和判空的条件需要区分,故在空间中额外留出一个位置个尾指针,尾指针为最后一个元素的下一个空间,这样当(rear==front)时即为空队列,当(rear+1)%max_size == front时即为队满(想象环形空间有助于理解…),最后,由于循环的队列的周期性,时刻要注意空...原创 2019-08-17 10:03:04 · 471 阅读 · 0 评论 -
POJ3614 Sunscreen (贪心+优先队列)
POJ 3614,求最多满足情况的牛的数量。贪心:将牛的最小值从小到大排,防晒值也从小到大排,在最小值小于防晒值的牛中,优先选择最大值小的,因为这样其他最大值大的有更多选择空间,对于最大值的比较用优先队列实现。代码如下:(含注解)#include<cstdio>#include<cstring>#include<algorithm>#include...原创 2019-07-31 19:26:09 · 186 阅读 · 0 评论 -
HDU1237——简单计算器(栈)
思路:对数字运算进行模拟,若遇到’ + ‘或’ - ‘,先将相应的数字push入栈(若为’ - ‘则push数字的相反数),若遇到优先级大的’ * ’ 或 ’ / '先将相应数字与栈顶元素进行运算后将结果push进入;最后将栈中所有元素相加。#include <cstdio>#include <cstring>#include <algorithm>#i...原创 2019-08-07 09:59:54 · 234 阅读 · 0 评论 -
HDU6438--Buy and Resell(2018ccpc网络赛)贪心+优先队列
题意:每到一个位置可以买一个东西或卖一个东西或什么也不做;问最大利润及最大利润情况下使用的最短时间;思路:贪心,用一个优先队列结构去存之前准备买的东西(但还没买),遇到比堆中最小值大的值时,就把堆顶元素pop掉(这里开始才算完成交易),同时把当前值入队两次,为什么是两次?由于当前值的选择不一定是最优的选择,后面可能有更好的选择,故第一次是用来作为中间位置存入以便进行进一步更大利润的交易。第二...原创 2019-08-19 19:59:50 · 152 阅读 · 0 评论 -
数据结构:链队列及其相关操作(c语言实现)
队列就是一个先进先出的限制性结构,用c语言的链表去实现,用两个指针(一个头指针,一个尾指针)实现,队列概念比较简单,实现的链队列的关键是理解其中的指针。(必要时画图可更好理解)代码如下:(链队列初始化,元素入队,出队,清空队列,返回队首元素,队列长度,判断队列是否为空)#include<stdio.h>#include<string.h>#include<st...原创 2019-08-15 10:33:16 · 313 阅读 · 0 评论 -
洛谷p1801黑匣子(双堆)
题意:对于一个数字序列,每次询问回答第a[i]个元素插入后的元素中的第j大值。思路:由于询问是有序的,先将询问离线下来,开一个大根堆和一个小根堆,其中大根堆是严格保持k-1个元素的容器,每次元素数量==k时就把多出来的元素转移到小根堆中保存,这样保证每次回答都是小根堆的堆顶。(因为会进入小根堆是因为大根堆已经刚好满了,进入小根堆后又会在堆中重新堆排序,堆顶就是小根堆中最小值,即第k大值)代码如...原创 2019-08-25 11:04:34 · 180 阅读 · 0 评论 -
洛谷P3377--(数据结构--左偏树)
题意:合并堆及删除堆中最小元素。思路:采用一般的二叉堆可以实现删除操作,但是要合并的话就会爆,因此引进了左偏树这个数据结构,可在logn时间内实现合并操作。左偏树的性质:1.堆的性质2.左子节点的距离大于右子节点的距离正是利用这些性质实现堆的快速合并。代码如下:(其中并查集的路径压缩会破坏掉树的结构,因此在路径压缩后要将所有相邻节点的父节点都置为当前的根节点)#include<...原创 2019-08-25 16:15:14 · 130 阅读 · 0 评论 -
poj1733--Parity game(带权并查集解决区间问题+离散化)
题意:有一个长度为n的01串,每次给出m个范围,判断第一次出现矛盾的位置。思路:由于01串长度为1e9远大于数组所能容纳的范围,而m只有5000组,故离散化预处理一下,由于区间权值非奇即偶,又是一个循环圈的问题,且只有两个元素,故模2,取1为奇,0为偶(因为奇+奇==偶((1+1)%2=0),偶+偶= =偶((0+0)%2=0)),权值动态转移时用向量加减法即可。注意点:由于所给的是闭区间,故...原创 2019-08-21 10:57:58 · 173 阅读 · 0 评论 -
数据结构之链栈及其相关操作(c语言实现)
栈是一种后进先出的限制性数据结构,结构理解较为简单,而链栈通过栈顶,栈底指针(栈底其实可以不用)来实现数据的修改及查询。链栈实现的关键是理解结构中指针的指向及其作用。代码如下:(初始化栈,出栈,入栈,清空栈,获得栈顶元素,栈长,判断栈是否为空,遍历栈)#include <stdio.h>#include <stdlib.h>#include <malloc.h...原创 2019-08-16 09:38:07 · 171 阅读 · 0 评论 -
链表学习:单向链表,双向链表,双向循环链表的构建及插入和删除节点操作(C/C++)
漫漫学习数据结构之路(1.链表)博客代码根据《数据结构》教材思路我(新手上路)觉得链表的理解和掌握借助画图会很好很高效!多动手多观察链表各元素之间的连接关系。1.单向链表单向链表结构体的构建核心为一个数据域和一个指针域(指向下一个节点)。我比较习惯有头指针head。首先是链表的构建:#include<stdio.h>#include<stdlib.h>#i...原创 2019-03-25 21:25:31 · 1033 阅读 · 0 评论