算法
觅你风川间!!!
热爱编程,努力学习
展开
-
线性查找与二叉排序树
文章目录线性表上的查找分块查找树表的查找二叉排序树二叉排序的查找二叉排序的插入二叉排序的生成二叉排序的删除线性表上的查找顺序查找. 折半查找. 分块查找分块查找将表分成若干块块间有序,块内无序(或者有序)树表的查找表结构在查找过程中动态生成二叉排序树, 平衡二叉树 , B- 树, B+ 树,键树二叉排序树若左子树非空, 则左子树所有结点的值均小于根结点的值若右子树非空,则右子树所有结点的值均大于根结点的值左右子树本身又是一棵二叉排序树二叉排序的查找key原创 2021-10-29 20:41:50 · 141 阅读 · 0 评论 -
哈夫曼树与哈夫曼编码
哈夫曼树与哈夫曼编码基本概念路径:树中一个结点到另一个结点之间分支构成的这俩个结点之间的路径结点的路径长度:俩结点间路径上的分支数树的路径长度:从树根到每一个结点的路径长度之和权:将树中的结点赋值一个有着某种含义的值结点的带权路径长度:根结点到该结点的路径长度乘该结点结点的权(路径长度*权)树的带权路径长度:树中所有叶子结点的带权路径长度之和哈夫曼树:带权路径长度最短的二叉树(最优二叉树)哈夫曼树的构造算法(贪心思想)根据给定的权值构成n棵二叉树的森林 F = {T1 , T2 ,原创 2021-10-05 19:10:52 · 121 阅读 · 0 评论 -
二叉树存储与基本算法
文章目录树与二叉树树的定义树的基本术语二叉树的定义二叉树的性质满二叉树:深度为k且有2^ - 1 个结点的二叉树特点完全二叉树特点:性质顺序存储链式存储二叉链表的结点形式三叉链表遍历二叉树递归前序遍历非递归前序遍历递归实现中序遍历非递归实现中序遍历递归实现后序遍历非递归后序遍历二叉树二叉树的层次遍历建立二叉树前序递归建立二叉树的复制树的深度的计算树的结点数的计算计算叶子结点数树与二叉树树的定义树是n个结点的有限集合若n等于0,称为空树若n>0,满足一下条件有且仅有一个根(root)其原创 2021-09-18 21:20:40 · 282 阅读 · 0 评论 -
朴素匹配与KMP
串的匹配方式串的朴素匹配方式#include<stdio.h>#include<string.h>int index (char * s , char * t ){ int i ,j ; for (i = 0 ; i < strlen(s) ; i ++) { if (s[i] == t[0]){ for (j = 0 ; j < strlen(t); j ++ , i ++)原创 2021-07-21 16:27:42 · 107 阅读 · 0 评论 -
2017HBCPC
#2017HBCPCL奇异王国里有很多奇怪的事物.比如奇怪的人(每个人都拥有一个智慧值),奇怪的商店… 这不,奇异糖果屋今天开业了,老板在门口拉上了“糖果送送送”的横幅来吸引顾客. 糖果的具体赠送方案为对于一个智慧值为x的人来说,他所能获得的糖果数量f(x)满足如下条件:f(0) = 0,f(2x) = f(x),f(2x+1) = f(2x) + 1, 整天搞怪的小A带着朋友们闻讯而来,他想出了一个游戏,游戏的规则是这样的:每个人根据自己的智慧值拿到糖果后互相比较开心值,开心值最大的人即为胜者原创 2021-05-28 07:52:47 · 212 阅读 · 1 评论 -
搜索与图论
#搜索与图论首先花费了好长时间才弄明白,邻接表的储存原理。这个笔记上有。第二就树的重心这个题,也是花费将近一个小时才弄明白。还有就是链表的范围至少是数据范围的俩倍,否则就会越界。产生错误答案,这题就遇到了。#include<bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int h[N] , e[N] , ne[N] ,idx ,ans = N ,n;bool st[N];//用于记录状态void a原创 2021-05-09 20:05:39 · 69 阅读 · 0 评论 -
试除法求约数
##试除法求约数#include<bits/stdc++.h>using namespace std;vector<int> get_divisor(int x){ vector<int>ans; for (int i = 1 ; i <= x / i ; i ++) { if (x % i == 0) { ans.push_back(i); if (i原创 2021-04-21 15:57:17 · 71 阅读 · 0 评论 -
试除法判断质数
##试除法判断质数#include<bits/stdc++.h>using namespace std;int a[110];bool prime(int x)//一个数的因子,必然是一个大于x^0.5 和一个小于x^0.5,所以说我只需要判断小于的那部分{ if (x < 2) return false; for (int i = 2 ; i <= x / i ; i ++) //这里用 i <= x / i 而不是 i*i <= x 是因为i原创 2021-04-20 16:42:26 · 113 阅读 · 0 评论 -
筛法
##筛法//埃筛#include<bits/stdc++.h>using namespace std;const int N = 1e6;int cnt;bool st[N];int prime(int n){ for (int i = 2 ; i <= n ; i ++) { if (!st[i]) { cnt ++; for (int j = i + i ; j <原创 2021-04-20 16:41:47 · 59 阅读 · 0 评论 -
哈希表
##哈希表哈希表的拉链储存#include<bits/stdc++.h>using namespace std;const int N = 1e5 + 3;int h[N] , idx , e[N] , ne[N];//h[N]用于储存每一个的头结点//idx 是一个下标的索引void insert_(int x){ int k = (x % N + N) % N; e[idx] = x; ne[idx] = h[k]; h[k] = idx ++原创 2021-04-18 19:48:28 · 73 阅读 · 0 评论 -
单调队列
##单调队列给定一个大小为 n≤106 的数组。有一个大小为 k 的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口中看到 k 个数字。每次滑动窗口向右移动一个位置。以下是一个例子:该数组为 [1 3 -1 -3 5 3 6 7],k 为 3。窗口位置 最小值 最大值[1 3 -1] -3 5 3 6 7 -1 31 [3 -1 -3] 5 3 6 7 -3 31 3 [-1 -3 5] 3 6 7 -3 51 3 -1 [-3 5 3] 6 7 -3 51 3 -1原创 2021-04-17 19:04:25 · 42 阅读 · 0 评论 -
tire树储存数字并且求最大异或值
###tire树储存数字并且求最大异或值在给定的 N 个整数 A1,A2……AN 中选出两个进行 xor(异或)运算,得到的结果最大是多少?输入格式第一行输入一个整数 N。第二行输入 N 个整数 A1~AN。输出格式输出一个整数表示答案。数据范围1≤N≤105,0≤Ai<231 首先我们来进行这道题目的分析,首先呢,来分析一下数据范围。每个数字转化为2进制占31位,那么一个数字占31位,那么最坏的情况就是每个数字都占31位,当然这种情况不可能达到,所以说我们开的数据范围为3原创 2021-04-15 15:26:12 · 122 阅读 · 0 评论 -
堆的初始化,以及排序
##堆的初始化,以及排序//无映射关系的堆#include<bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int a[N];int cnt ;void down(int x){ int t = x; if ((2*x) <= cnt && a[2*x] < a[t]) t = 2 * x; if ((2 * x + 1) <= cnt &&原创 2021-04-13 22:45:11 · 189 阅读 · 0 评论 -
Tire树
##Tire树#include<bits/stdc++.h>using namespace std;const int N = 1e5 + 10;char str[N];int a[N][26] ,cnt[N] ,idx;//cnt[N]是一个字符串结尾标记有几个字符串,idx是标记下一个字符应该去哪儿找。a[N][26]用于储存字符串树void insert1(char str[]){ int p = 0; for (int i = 0 ; str[i] ; i原创 2021-04-13 22:44:36 · 65 阅读 · 0 评论 -
离散化
###离散化首先呢,何谓离散化,在一个无限长的数轴上,有一些不连续的点,开这么大连续空间的数组,太浪费资源,因此需要将这些离散的数据映射到一个连续的数组中。就是所谓的离散化。1 离散化的第一步把不连续的元素的位置储存到一个新的容器中,如vectoralls ,并且把位置和值储存到vector add ,(PII 是pair 类型) 中 。2 把 alls中重复中重复位置去掉,去掉重复的位置可以使用c++的stl库函数sort(alls.begin(),alls.end());//先进行排序al原创 2021-04-10 18:55:03 · 75 阅读 · 0 评论 -
对一个容器中的元素进行去重
##对一个容器中的元素进行去重#include<bits/stdc++.h>using namespace std;int main(){ int a[n] sort(a, a+n); //首先对a数组进行排序 int j = 0; for (int i = 0 ; i < n ; i ++) { if (!i || a[i] != a[j-1]) a[j ++] = a[i];//此时就达到了除去重复元素的效果。 }}...原创 2021-04-10 16:26:46 · 122 阅读 · 0 评论 -
位运算
###位运算首先介绍一种位运算的操作 lowbit () , llowbit 的作用返回 数字2进制中 最后一个1和1后面的0.实现的原理int lowbit(int x){ return x & (-x)}这里呢 , 在计算机 负数是以反码的形式储存的。忘了就去复习一下。以10 为例二进制位1010 ,那么-10 的二进制就位 0110 进行与运算 得到的就是 二进制的10, 给定一个长度为 nn 的数列,请你求出数列中每个数的二进制表示中 11 的个数。输入格原创 2021-04-10 10:29:03 · 48 阅读 · 0 评论 -
双指针算法
#双指针算法首先给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。输入格式 第一行包含整数 n。第二行包含 n 个整数(均在 0∼105 范围内),表示整数序列。输出格式共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。首先呢我们通过这个题来分析一下双指针算法 , 首先看到这个题,我最开始应该想到的是最简单的朴素做法。for (int i = 0 ; i < n ; i ++){ for (int j = 0 ; j <= i原创 2021-04-10 08:31:16 · 65 阅读 · 0 评论 -
差分数组
###差分数组差分数组其实是前缀和数组的逆运算一维差分#include<bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int a[N] , b[N];//a[N]是b[N]的前缀和 ,b[N]是a[N]的差分数组//差分数组,可以用于在他的前缀和组中增加一个数c //比如在[l , r]数组中增加 c 那么只需在 吧b[l] += c 而 b[r+1] -= c就可以int main(){ int n原创 2021-04-08 19:09:16 · 68 阅读 · 0 评论 -
前缀和
###前缀和前缀和数组的目的是为了查询某些区间时进行O(1)的时间,不是重新遍历。一维前缀和#include<bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int a[N] , s[N];int main(){ int n,m; cin>>n>>m; for (int i = 1 ; i <= n ; i ++) cin>>a[i]; fo原创 2021-04-08 17:06:01 · 50 阅读 · 0 评论 -
高精度的除法
###高精度的除法#include<bits/stdc++.h>using namespace std;vector<int>A;vector<int> div(vector<int>&A , int b , int &r){ vector<int> c; for (int i = A.size() - 1 ; i >= 0 ; i --)//这里因为储存时逆序的所以计算时也是逆序的,因为我们人计算时原创 2021-04-08 14:47:55 · 62 阅读 · 0 评论 -
高精度乘法
###高精度乘法#include<iostream>#include<vector>using namespace std;vector<int>A,B;vector<int> mul(vector<int>&A , int B){ vector<int>c; int t = 0; for (int i = 0 ; i < A.size() ; i ++) {原创 2021-04-08 08:06:56 · 66 阅读 · 0 评论 -
高精度减法
###高精度减法#include<iostream>#include<vector>using namespace std;vector<int> A,B;bool cmp (vector<int>&A , vector<int>&B)//比较 A ,B俩个数的大小 { if (A.size() != B.size()) return A.size() > B.size();//先比较长度 els原创 2021-04-07 21:33:51 · 47 阅读 · 0 评论 -
浮点数二分
###浮点数二分#include<bits/stdc++.h>using namespace std;double n;bool check (double mid){ if (mid*mid*mid >= n) return true; else return false;}int main(){ cin>>n; double l = -10000 , r = 10000; while (r - l > 1e-10原创 2021-04-07 15:18:45 · 85 阅读 · 0 评论 -
归并排序的深入理解与逆序数的计算
###归并排序的深入理解与逆序数的计算int temp[N];//临时数组储存数据void merge_sort(int a[] , int l , int r){ if (l >= r) return ; //递归的出口 int mid = l + r >> 1; //分为一个单元 merge_sort(a,l,mid); merge_sort(a,mid + 1,r); int k = 0 , i = l , j = mid + 1原创 2021-04-07 14:03:10 · 69 阅读 · 0 评论 -
归并排序模板
###归并排序模板#include<bits/stdc++.h>using namespace std;const int N = 1e6 + 10;int a[N];int temp[N];//临时数组储存数据void merge_sort(int a[] , int l , int r){ if (l >= r) return ; //递归的出口 int mid = l + r >> 1; //分为一个单元 merge_sort原创 2021-04-07 10:11:26 · 41 阅读 · 0 评论 -
高精度加法
###高精度加法//#include<bits/stdc++.h>#include<iostream>#include<vector>using namespace std;vector<int> a,b;vector<int> add(vector<int>&a,vector<int>&b){ vector<int>c; int t = 0 ; for (i原创 2021-04-07 07:48:06 · 48 阅读 · 0 评论 -
快排模板
##快排模板#include<bits/stdc++.h>using namespace std;int n;const int N = 1e6 + 10;int a[N];void quick_sort(int q[] , int l , int r){ if (l >= r) return ; int x = q[l + r >> 1] , i = l - 1 , j = r + 1; while (i < j) {原创 2021-04-05 19:58:51 · 52 阅读 · 0 评论 -
单调栈
###单调栈所谓单调栈就栈中的元素都是单调的,就是单调性是一致的。不会出现波折。比如说在给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。这道题中如果用暴力做法时间复杂度会非常高如果说使用单调栈时间复杂度会降到线性的复杂度首先单调栈用到了双指针的思想 , 我们从前往后读取数字 , 那么假如说 第3个数字x3 >x5,那么在读取下一个找左边最近的小于的数字一定不会找到x3,所以说就没有用,x3就可以删掉。还有一种情况就是 如果读入的x小于 栈顶元素原创 2021-04-04 16:03:46 · 49 阅读 · 0 评论 -
静态链表的基本操作
###数据实现单链表#include<bits/stdc++.h>using namespace std;int m , head , idx;//head为头指针 idx 为插入的结点索引const int N = 100010;int ne[N] , v[N];//ne[]为指针域 v[]为数据域//单链表的初始化void _init(){ idx = 0; head = -1;}//向头结点后插入纸void add_head(int x){原创 2021-04-04 09:30:17 · 91 阅读 · 0 评论 -
二分法模板
二分法模板整数型二分{ while (l < r) { int mid = l + r + 1 >> 1; if (check(mid)) l = mid; else r = mid - 1; } return l;}int bsearch_1(int l, int r){ while (l < r) { int mid = l + r >> 1;原创 2021-04-02 19:13:00 · 136 阅读 · 0 评论 -
深搜
深搜思路1 画递归搜索树搜索顺序恢复现场bool 除去不能搜索的范围2 除去对角线的技巧y = x +b b = y - x;y = -x + b b = y +x;通过截距相同来控制每一条对角线。副对角线相减会出现负值,注意调整一下#include<bits/stdc++.h>using namespace std;int n;int path[15];bool col[15] , dg[30] ,udg[30] ;int ans = 0;void dfs原创 2021-03-27 23:10:06 · 79 阅读 · 0 评论 -
双指针的优化
###双指针的优化#include<bits/stdc++.h>using namespace std;int n,m;const int N = 10010;int arr[N];int main(){ cin>>n>>m; int p = 0 ; for(int i = 0 ; i < n ; i ++) { int x; cin>>x; if (x &原创 2021-03-26 20:01:12 · 166 阅读 · 0 评论 -
自定义排序结构体数组
自定义排序结构体数组#include<bits/stdc++.h>using namespace std;struct w{ int si; int k1; int k2; int k3; int sum;}st[310];bool cmp (const w &x , const w &y){ if ( x.sum != y.sum ) return x.sum > y.sum; else if (原创 2021-03-25 22:34:07 · 139 阅读 · 0 评论 -
用bool类型来解决区间重叠的问题
用bool类型来解决区间重叠的问题#include<bits/stdc++.h>using namespace std;const int N = 10010;bool L[N];int a[110][2];int main(){ int n,m; for(int i = 0 ; i <= n ; i ++) L[i] = true; for( int i = 0 ; i < m ; i ++) { cin>&原创 2021-03-25 11:33:04 · 74 阅读 · 0 评论 -
约数个数定理
###约数个数定理首先将整数分解例如:将378000 分解质因数378000=24×33×53×71由约数个数定理可知378000共有正约数(4+1)×(3+1)×(3+1)×(1+1)=160个。#include <stdio.h>#define ll long long int main(void){ ll n; while(scanf("%lld", &n)&&n) { int a[4]=原创 2021-03-24 22:27:26 · 119 阅读 · 0 评论 -
区间合并算法
![img](file:///C:\Users\左泽平\AppData\Roaming\Tencent\Users\2231420982\QQ\WinTemp\RichOle\BNC[OIZ85TF8NRC)@OEW3.png)#include<bits/stdc++.h>using namespace std;//首先对每一个区间的左边界排序int m,n;struct kk{ int a; int b;}c[110];bool cmp ( const kk &原创 2021-03-24 22:26:44 · 111 阅读 · 0 评论 -
sort函数对结构体数组排序
sort函数对结构体数组排序#include<iostream>#include<algorithm>using namespace std;struct st{ int a1; int b1;}arr[100];//首先 &是取地址运算符 在cmp中 把结构体的地址赋值给了 x ,y ;//x对应sort函数的第一个参数,y 对应sort函数的第二个参数 // x.b1 与 y.b1 就确定了 排序的元素和大小顺序bool cmp(con原创 2021-03-24 19:19:31 · 1040 阅读 · 0 评论