随笔分类 -  数据结构

摘要:3.1 概述 手写堆而不是STL的堆 STL里的堆就是优先队列priority_queue 如何手写一个堆? STL支持的操作: 插入一个值 求集合中的最小值 删除最小值 STL没办法直接实现,只能间接实现的功能: 删除任意一个元素 修改任意一个元素 3.1.1 什么是堆 堆就是一个二叉树或者说是完 阅读全文
posted @ 2021-03-26 10:18 晓尘 阅读(86) 评论(0) 推荐(0)
摘要:1、概述 1.1 作用 将两个集合合并 询问两个元素是否在一个集合当中 1.2 暴力做法 用一个数组belong[x] = a存储哪个元素属于哪个集合,判断就是if(belong[x] == belong[y]),复杂度O(1) 但是当我们想合并两个集合时,假如集合a有1000个元素,集合b有200 阅读全文
posted @ 2021-03-26 10:14 晓尘 阅读(51) 评论(0) 推荐(0)
摘要:作用:高效地存储和查找字符串集合的数据结构 用到Trie树的题字母类型不会很多,一定都会有限制 如想在Trie中存储如下元素: abcdef,abdef,aced,bcd,bcff,cdaa,bcdc,abc 存储方式如下: 在根节点root后,从头向后遍历,在每个单词的结尾位置做标记,如下图: 那 阅读全文
posted @ 2021-03-26 10:10 晓尘 阅读(56) 评论(0) 推荐(0)
摘要:就是两个串,s[N]是长串,p[M]是短串 习惯上下标从1开始 暴力做法: 就相当于每次都只挪动一个位置去匹配下一位。红色和绿色圆圈说明这个位置不匹配,将红色短线向右移动一个位置重新匹配。 KMP优化: 从上面可以看出一些规律,在前面匹配失败的情况下,我们最多可以往后移动多少位让他继续匹配。 我们要 阅读全文
posted @ 2021-03-25 23:22 晓尘 阅读(188) 评论(0) 推荐(0)
摘要:2、栈与队列 2.1 栈 先进后出 用tt表示栈顶指针,tt--弹出,tt > 0说明非空 stk[++tt]插入,stk[tt]就是栈顶元素 2.1.1 练手题目 2.1.2 练手答案 #include <iostream> using namespace std; const int N = 1 阅读全文
posted @ 2021-03-25 22:59 晓尘 阅读(50) 评论(0) 推荐(0)
摘要:1、链表与邻接表 这里用数组模拟,也可以用结构体和指针实现,不过每次都动态new比较慢,直接new一定数量和数据就比较相似了。 单链表:主要用途 邻接表:存储树和图 双链表:优化某些问题 1.1、单链表 e[N]表示某个点的值,ne[N]表示某个点的next指针是多少 所谓的头节点head初始值一般 阅读全文
posted @ 2021-03-25 15:06 晓尘 阅读(224) 评论(0) 推荐(0)
摘要:C++ 11前的初始化方法 小括号初始化方法 int a = int(5) string s = string("hello") 赋值初始化 int a = 3; string str = "hello"; 大括号初始化(POD聚合) int arr[2] = {0,1}; 构造函数初始化 clas 阅读全文
posted @ 2021-01-19 11:05 晓尘 阅读(661) 评论(0) 推荐(0)
摘要:从前到后遍历和从后到前遍历 使用rbegin()和rend(),反方向输出 vector<int> a = {2,3,4,5,6,7,8,9}; for(auto i = a.rbegin(); i != a.rend(); i++) cout << *i << " "; 在容器内降序排列 vect 阅读全文
posted @ 2020-11-19 23:10 晓尘 阅读(284) 评论(0) 推荐(0)
摘要:归并排序 O(\(n\log_an\)) 主要思想 分治 快排是用一个数来分,让左边都小于等于这个数,右面都大于等于这个数。 归并是以整个数组最中心来分。 具体步骤 确定分界点mid即下标长度中间值,取左右平均值\(\frac{(l+r)}{2}\)即可 递归排序左边left和右边right 归并: 阅读全文
posted @ 2020-11-17 20:02 晓尘 阅读(103) 评论(0) 推荐(0)
摘要:STL标准库查找函数 find函数 二分查找,binary_search函数 目的:查找某元素是否存在于数组,存在返回1,不存在返回0. binary_search(arr[],arr[]+size,target) arr[]:数组首地址 size:数组元素个数 target:查找的元素 lower 阅读全文
posted @ 2020-11-09 20:40 晓尘 阅读(97) 评论(0) 推荐(0)
摘要:约数 算术基本定理 对于任何一个大于1的自然数N,如果N不为质数,那么都可以唯一分解成有限个质数的乘积N = \({P_1}^{\alpha_1} {P_2}^{\alpha_2} ... {P_n}^{\alpha_n}\), 这里$P_1<P_2<...<P_n$且均为质数,其诸指数$a_i$是 阅读全文
posted @ 2020-10-30 22:26 晓尘 阅读(421) 评论(0) 推荐(0)
摘要:质数 在 >1 的整数中,如果只包含1和本身两个约数,这个数就被称为质数/素数。 质数的判定——试除法 暴力枚举 \(O(n)\) bool is_prime(int n) { if(n < 2) return ; for(int i = 2; i < n; i++) if(n % i == 0) 阅读全文
posted @ 2020-10-30 15:34 晓尘 阅读(466) 评论(0) 推荐(1)
摘要:快速排序 主要思想:分治 具体步骤: 确定分界点x 取左边界q[l] 取中间点q[(l+r)/2] 取右边界q[r] 随机一个数 调整区间: 根据分界点x将整个区间划分为2半 使得第一个区间所有数都 <= x 第二个区间所有数都 >= x 这个数和x相等在左右两边都可以 递归处理左右两端区间 左右区 阅读全文
posted @ 2020-10-22 21:49 晓尘 阅读(130) 评论(0) 推荐(0)