数据结构
栈、队列、链表、并查集等
饮闲
写作是门孤独的手艺,意义却在于分享
展开
-
对vector容器中的基本元素及结构元素,使用sort进行排序; 对set等有序结构使用cmp重载排序函数
1.对于正常的数组,使用如下方法进行排序:sort(nums, num + n);2.而对于vector数组num,需要使用:sort(nums.begin(), nums.end());进行排序。3.对自定义结构num使用cmp进行排序:bool cmp(const num &a, const num &b){ return a.val < b.val;}// 调用方式sort(nums, nums + n, cmp);4.同样,这种比较大小的运算符的原创 2021-08-17 09:21:36 · 465 阅读 · 0 评论 -
背包问题你们见过吧。但是超大背包问题怎么搞呢?
题目n个物品,重量w[i],对应的价值为v[i],从这些物品中挑选重量不超过W的物品,求价值总和最高的方案。1 <= n <= 401 <= w,v <= 10^151 <= W <= 10^15解析背包问题用动态规划求解,复杂度O(nW),但是这里W的范围太大了,搞不了。不过这里面的n范围比较小,可以考虑从n下手。n的大小为40,2^40超出限制,考虑利用折半查询的方式,先折半前一部分的所有可能性,然后排序,剪枝掉一定不会选择的组合,即重量大,价值小原创 2021-08-05 12:00:38 · 723 阅读 · 0 评论 -
阿里巴巴校园招聘 —— 灵犀游戏开发测试岗笔试题目总结(菜鸡版解析)涉及知识点——十字链表、线程与堆栈、FTP、Telnet、红黑树、哈夫曼树、平衡二叉树、乐观锁、悲观锁、HTTP、NIM游戏
内容感觉内容无非是那几个:数据结构与算法 + 计算机网络 + 操作系统 + C++基础语法知识简单的送分题我就不说了,我说几个还有点迷惑性的点来整理一下:1. 十字链表在Linux内核中应用十分广泛的一种数据结构——十字链表,可以用来表示稀疏矩阵。2. 线程与堆、栈的关系栈——线程可以独立拥有,保存其运行状态和局部自动变量。每个线程的栈相互独立。堆,一个进程中的所有线程是共享堆的内存空间。3. FTP两种连接方式:命令连接(类似于建立连接的过程) 21端口数据连接 20端口数原创 2021-08-03 22:22:13 · 627 阅读 · 2 评论 -
集合的整数表示——二进制表示法
使用情况只有当集合中的元素比较少的时候,才能用这种方法来表示。原理f(S) = sum(2^i),其中,i为属于集合的元素的所有下标。用法空集 —— 0只含第i个元素的集合 —— 1<<i含有从0到n-1这n个元素的集合 —— (1<<n) - 1判断第i个元素是否属于集合S —— if (S >> i & 1)向集合中加入第i个元素 —— S | 1 << i从集合中去除第i个元素 —— S & ~(1 <<原创 2021-08-03 06:00:11 · 519 阅读 · 0 评论 -
POJ 2029 二维树状数组
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int max_N=500+1;int bit[max_N][max_N];int n,m;int lowbit(int x){ return x&(-x);}void update(int x,int y,int val){ for(int i=x;i<原创 2020-10-28 19:13:52 · 195 阅读 · 0 评论 -
2020ICPC·小米 网络选拔赛第一场 J题
题目链接链接:https://ac.nowcoder.com/acm/contest/7501/J来源:牛客网题目:Matrix Subtraction分析:中等难度题,可以用差分来解决、也可以直接套二维树状数组的模板,也可以利用dp来解决注意,从头减到尾,注意矩形越界时的处理即可。AC代码:#include <cstdio>#include <iostream>using namespace std;const int N = 1001;inline原创 2020-10-28 15:13:57 · 278 阅读 · 0 评论 -
扩散-并查集-二分
n1#include <iostream>#include <cstdio>#include <cmath>using namespace std;/*432 1921 1444 248 13*/int n;struct node{ int x,y;}a[55];int d[55][55];int fa[55];int juli(int i,int j){ return abs(a[i].x-a[j].x)原创 2020-09-02 19:24:42 · 234 阅读 · 0 评论 -
kmp的实现——简单算法
#include <iostream>#include <cstdio>#include <iostream>#include <cstring>#include <string>using namespace std;const int inf = 0x3f3f3f3f;const int maxn = 2005;#define eps 1e-8#define INIT(x) memset(x,0,sizeof(x))ty原创 2020-09-02 15:08:01 · 211 阅读 · 0 评论 -
邻接矩阵的简易实现 C语言
主函数#include <stdio.h>#include <stdlib.h>#include "AdjMatrix.h"//!int main(){ /* if (freopen("D:\\y.txt","r",stdin)==NULL) printf("打开文件失败!\n"); */ if(freopen("data.txt","r",stdin)==NULL) { printf("File open原创 2020-09-02 14:58:48 · 535 阅读 · 0 评论 -
最长公共子序列的简单实现 模板
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 5 using namespace std; 6 7 const int max_n = 1000+10; 8 9 int n,m;10 char s[max_n],t[max_n];11 in...原创 2020-02-03 20:58:00 · 195 阅读 · 0 评论 -
STL-vector的简单利用
1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 5 using namespace std; 6 7 // 注意:vector在尾部添加或移动元素非常快,在中间操作非常耗时,因为它需要移动元素 8 9 10 int main(...原创 2020-01-28 17:35:00 · 175 阅读 · 0 评论 -
STL-string的基本用法介绍
1 #include <string> 2 #include <iostream> 3 #include <cstring> 4 #include <algorithm> 5 6 using namespace std; 7 8 int to_lower(int c) 9 { 10 if ...原创 2020-01-28 11:53:00 · 212 阅读 · 0 评论 -
STL-stack栈的简单应用
1 #include <iostream> 2 #include <stack> 3 4 using namespace std; 5 6 int main() 7 { 8 // 栈比较简单 9 // push,pop,size,top10 // 基本操作很少,很容易实现和使用11 // 一般可以写数组模...原创 2020-01-28 20:53:00 · 233 阅读 · 0 评论 -
STL-queue 队列的简单实现
1 #include <iostream> 2 #include <queue> 3 4 using namespace std; 5 6 int main() 7 { 8 // queue也很简单 9 // push,pop,size,front10 queue<int> q1;11 q1....原创 2020-01-28 20:59:00 · 247 阅读 · 0 评论 -
STL-list 链表的简单实现
1 #include <iostream> 2 #include <list> 3 4 using namespace std; 5 6 int main() 7 { 8 // list可以在头部和尾部插入和删除元素 9 // 不能随机访问元素,迭代器只能++,不能一次性跳转10 list<int> L...原创 2020-01-28 21:11:00 · 176 阅读 · 0 评论 -
用链表模拟求解一元多项式
链表的应用,输入多项式,并求解,简易测试数据,减下方注释的文件。#include <stdlib.h>typedef struct Polynode{ int coef; int exp; struct Polynode* next;}Polynode,*Polylist;Polylist PolyCreate(){ Polynode *head,*rear,*s; int c,e; head=(Polynode *)malloc(原创 2020-08-27 21:19:21 · 269 阅读 · 1 评论 -
链表之Reverselist
#include <stdlib.h>void ReverseList(LinkList L){ // 使p指向链表的头节点,若为空链表,p=NULL; p=L->next; // 将链表的下一个节点置为空,在空链表时,重复赋值,无错,在非空链表时,看如下步骤,在新的步骤中,可将第一个节点的后一节点设为空指针 // 实现了对头节点的后继节点的设置 L->next=NULL; while(p!=NULL) {原创 2020-08-27 21:17:06 · 761 阅读 · 0 评论 -
简简单单的循环链表C++
数据结构练习循环链表代码C++首先,给出一遍链表的代码。链表#include <stdio.h>#include <malloc.h>//using namespace std;c语言中不能使用;#define bool short#define true 1#define false 0//! 元素为char类型typedef char ElemType;typedef struct Node{ ElemType data; stru原创 2020-08-27 21:13:44 · 356 阅读 · 0 评论 -
树形dp HDU6867 Tree
题目链接多校,怎么越来越难了,是我变菜了吗。不多说,这是一道树形dp的题目,AC代码如下。AC代码#include <cstdio>using namespace std;const int max_n=500000;int n,tot;long long ans;int v[max_n+1],nxt[max_n+1],h[max_n+1],dep[max_n+1],siz[max_n+1];// 其实我一般不写快读,这里参考一下,留一个模板。// 万一哪次原创 2020-08-18 21:45:38 · 250 阅读 · 0 评论 -
Hopcroft-Karp算法 poj-1469 COURSES
Hopcroft-karp算法该算法由John.E.Hopcroft和Richard M.Karp于1973提出,故称Hopcroft-Karp算法。使用情形给定一个二分图,求其最大匹配。原理简述在增广匹配集时,每次寻找多条增广路径,以进一步减少时间复杂度。步骤及示例演示dx【】、dy【】分别表示二分图左右不顶点的距离标号mx【】、my【】分别表示二分图左右部顶点的距离标号1、我们每次从所有未匹配的左部节点开始BFS,进行距离标号。2、对于每一个队列中的左部节点X,考虑与它相邻的所有原创 2020-08-16 17:17:12 · 562 阅读 · 0 评论 -
Tarjan算法 POJ2186
题目链接 点击这里Tarjan算法适用情形有向图,求强连通分量。此题中,以Tarjan算法为基础,求解并标记了相应的连通分量,并通过各连通分量出度的分析,找到相应的缩点,并根据缩点的个数,做出相应的处理。原理简述Tarjan算法基于对图的深度优先搜索算法,每个强连通分量,都是搜索树中的一颗子树,并在回溯时,判断是否为强连通分量。算法的实现过程,类似于基于后续的深度优先搜索与并查集的组合。步骤dfn【i】:记录节点i在深度优先搜索中的访问次序low【i】:记录节点i可以到达的访问时间最早的祖原创 2020-08-15 16:07:20 · 240 阅读 · 0 评论 -
STL list ALDS1_3_C: Doubly Linked List
使用STL中的list来重写了这道题STL中的链表数据结构,实际上是list,一般有人喜欢用vector来表示不定长的链表,实际上vector只是动态数组而已,长度在不够用是系统自动重新分配空间,并转移元素,以此来实现不定长的链表的效果。由于vector不能高效前插元素(效率低),所以我们这里用list来实现。#include <iostream>#include <cstdio>#include <list>#include <cstring>原创 2020-08-09 21:32:22 · 224 阅读 · 0 评论 -
STL-queue ALDS1_3_B
我们用STL的queue重写这道题#include <iostream>#include <cstdio>#include <queue>using namespace std;struct node{ char s[11]; int t;};int main(){ int n,q,t; scanf("%d %d",&n,&q); queue<node> Q; node d原创 2020-08-07 09:45:21 · 242 阅读 · 0 评论 -
STL stack 三个简单的操作(够用了)
只有三个操作,简单的一批。#include <iostream>#include <stack>#include <cstdio>using namespace std;int main(){ // 三个函数,三个操作 stack<int> S; // 1 S.push(3); S.push(6); S.push(2); // 2 S.pop(); // 3 c原创 2020-08-07 08:58:14 · 200 阅读 · 0 评论 -
双向链表 ALDS1_3_C
题目链接点击这里Doubly Linked ListTime Limit : 1 sec, Memory Limit : 131072 KBEnglish / JapaneseDoubly Linked ListYour task is to implement a double linked list.Write a program which performs the following operations:insert x: insert an element with key x i原创 2020-08-05 21:22:40 · 253 阅读 · 0 评论 -
(循环)队列 ALDS1_3_B
循环队列,其实是一种很简单的数据结构,这里用AIZU题目的代码直接带过。注意:取余的下标可能为负,当时我不知道,以为是在0-man_n-1的区间,其实不然,导致出现了错误。注意:函数内使用cout的endl不当,程序可能会报错。(‘\n’来代替,就可以避免这个问题,这个endl不只是一个换行而已)#include <cstdio>#include <iostream>#include <cstring>using namespace std;const原创 2020-08-03 18:29:39 · 228 阅读 · 0 评论 -
栈 ALDS1_3_A
很简单是数据结构题,调库其实也很好用#include <iostream>#include <cstdio>#include <stack>using namespace std;stack<int> S;int main(){ char c; while(true) { c=getchar(); if(c=='+') { int a=S.to原创 2020-08-03 08:16:14 · 220 阅读 · 0 评论