首页 > 编程语言 >算法总结

算法总结

时间:2023-09-30 09:15:01浏览次数:27  
标签:总结 int ed mid while 算法 alls else

排序

Quick_Sort

void Quick_Sort(int q[], int l, int r) {
    if (l >= r) return;

    int i = l - 1, j = r + 1, x = q[(l + r) >> 1];
    while (i < j) {
        do i ++ ; while (q[i] < x);
        do j -- ; while (q[j] > x);
        if (i < j) swap(q[i], q[j]);
    }
    quick_sort(q, l, j), quick_sort(q, j + 1, r);
}

Merge_Sort

void Merge_Sort(int q[], int l, int r) {
	if (l >= r) return ;
	int mid = l + r >> 1;
	merge_sort(q, l, mid);
	merge_sort(q, mid + 1, r);
	int k = 1, i = l, j = mid + 1;
	while (i <= mid && j <= r) {
		if (q[i] <= q[j]) tmp[k++] = q[i++];
		else tmp[k++] = q[j++];
	}
	while (i <= mid) tmp[k++] = q[i++];
	while (j <= r) tmp[k++] = q[j++];
	for (int i = l, j = 1; i <= r; i++, j++) q[i] = tmp[j];
}

二分查找

int search(int a[], int l, int r, int x) { // 查找大于等于x的第一个数字
	int ret = 0;
	while (l <= r) {
		int mid = (l + r) >> 1;
		if (a[mid] >= x) ret = mid, r = mid - ;
		else l = mid + 1;
	}
	return ret;
}

二分答案

// 记录答案写法
while (l <= r) {
	int mid = (l + r) >> 1;
	if (check(mid)) ans = mid, l = mid + 1;
	else r = mid - 1;
}
// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用
while (l < r) {
	int mid = (l + r + 1) >> 1;
	if (check(mid)) l = mid;
	else r = mid - 1;
}
// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用
while (l < r) {
	int mid = (l + r) >> 1;
	if (check(mid)) l = mid;
	else r = mid - 1;
}

浮点数二分

double search(double l, double r)
{
    const double eps = 1e-6; // eps 表示精度,取决于题目对精度的要求
    while (r - l > eps)
    {
        double mid = (l + r) >> 1;
        if (check(mid)) r = mid;
        else l = mid;
    }
    return l;
}

三分

while (r - l > eps) {
  	mid = (lmid + rmid) / 2;
  	lmid = mid - eps;
  	rmid = mid + eps;
  	if (f(lmid) < f(rmid))
  	  r = mid;
 	else
  	  l = mid;
}

前缀和

一维前缀和

s[i] = a[1] + ... + a[i] = s[i-1] + a[i];
a[l] + ... + a[r] = s[r] - s[l-1];

二维前缀和

s[i][j] += s[i-1][j] + s[i][j-1] - s[i-1][j-1];
(x1, y1) + ... + (x2, y2) = s[x2][y2] - s[x1-1][y2] - s[x2][y1-1] + s[x1-1][y1-1];

差分

一维差分

(l - r) + x -> a[l] += x; a[r+1] -= x;

二维差分

(x1, y1 - x2, y2) + x -> s[x1][y1] += x; s[x2+1][y1] -= x; s[x1][y2+1] -= x; s[x2+1][y2+1] += x;

双指针

for (int i = 0, j = 0; i < n; i ++ )
{
    while (j < i && check(i, j)) j ++ ;
    // 具体问题的逻辑
}
//常见问题分类:
//   (1) 对于一个序列,用两个指针维护一段区间
//   (2) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作

位运算

n >> k & 1 // 求n的第k位数字
lowbit(n) = n & -n = n & (~n + 1)// 返回n的最后一位1

离散化

特点 : 值域跨度大, 但稀疏

vector<int> alls; // 存储所有待离散化的值
sort(alls.begin(), alls.end()); // 将所有值排序
alls.erase(unique(alls.begin(), alls.end()), alls.end()); // 去掉重复元素

// 二分求出x对应的离散化的值
int find(int x) { // 找到第一个大于等于x的位置
    int l = 0, r = alls.size() - 1;
    while (l < r)
    {
        int mid = (l + r) >> 1;
        if (alls[mid] >= x) r = mid;
        else l = mid + 1;
    }
    return r + 1; // 映射到[1, 2, ...n]
}

快速幂

int ksm(int x, int r) {
	int ret = 1;
	while (r) {
		if (r & 1) ret *= x;
		x *= x;
		r >> 1;
	}
	return ret;
}

矩阵快速幂

void add(LL &a, const &b) { // 取模
	a += b;
	a >= mid ? a -= mid : false;
}

void mul(LL A[N][N], LL B[N][N], LL C[N][N], int n, int s, int m) { // C = A * B;
	for (int i = 0; i < n; i++) 
		for (int j = 0; j <= m; j++) {
			C[i][j] = 0;
			for (int k = 0; k < s; k++)
				add(C[i][j], 1LL * A[i][k] * B[k][j] % mod);
		}
}

while (k) { // ans = a ^ k;
	if (k & 1LL) {
		mul(ans, a, tmp, n, n, n);
		memcpy(ans, tmp, sizeof(ans));
	}
	mul(a, a, tmp, n, n, n);
	memcpy(a, tmp, sizeof(a));
	k >> 1;
}

区间合并

// 将所有存在交集的区间合并
void merge(vector<PII> &segs) {
    vector<PII> res;
    sort(segs.begin(), segs.end());
    int st = -2e9, ed = -2e9;
    for (auto seg : segs)
        if (ed < seg.first) {
            if (st != -2e9) res.push_back({st, ed});
            st = seg.first, ed = seg.second;
        }
        else ed = max(ed, seg.second);
    if (st != -2e9) res.push_back({st, ed});
    segs = res;
}

快读

inline int read() {
	int s = 0, w = 1; char ch = getchar();
	while (ch < '0' || ch >'9') {if (ch == '-') w = -1; ch = getchar();}
	while (ch >= '0' && ch <= '9') {s = (s << 3) + (s << 1) + ch - '0'; ch = getchar();}
	return s * w;
}

标签:总结,int,ed,mid,while,算法,alls,else
From: https://www.cnblogs.com/Gmor-cerr-blog/p/algorithm.html

相关文章

  • 每日总结9月21日
    今天体育课跑50米差点没给我肠子跑出来,浑身疼,太缺乏锻炼了,从明天开始多锻炼吧,我的父亲来石家庄开会,中午就没有留在学校,下午的数据结构的栈有些难度,不太好懂,离散就更别提了,跟上个学期学的内容像两门课......
  • 每日总结9月22日
    早上历经早八的英语课还考了单词后,人已经麻了,好在今天就没有其他的课了,我爸也是开完会下午的票就要回去了,我就带着他在省博物馆绕了很长时间还在那边的促销书摊上全款提了一套三体,在送我爸进火车站的时候,幸运的抢到了返程的高铁票,真的是完美的一天。......
  • 80道高频算法题Python版
    80道高频算法题来源于牛客网,这些答案都经过了我验证,可以复制粘贴后提交通过:掌握这80道题,99%的测试岗位算法考试都能通过。建议收藏后反复练习。本文为Python版本答案,对于Java版本答案,请在电子书《算法挑战》目录中查看。1、NC1大数加法:中等#计算两个数之和#@paramsstrin......
  • 2023.9.29——每日总结
    学习所花时间(包括上课):0h代码量(行):0行博客量(篇):1篇今天,上午陪同学去医院,下午休息;我了解到的知识点:休息明日计划:休息......
  • 进化算法中的遗传算法(Genetic Algorithms)
    进化算法中的遗传算法(GeneticAlgorithms)引言进化算法是一类基于自然进化原理的优化算法,通过模拟生物进化过程中的选择、交叉和变异等操作,来求解复杂问题。遗传算法(GeneticAlgorithms)是进化算法中最为经典和常用的一种方法。本文将介绍遗传算法的基本原理、核心操作和应用领域,以及......
  • 9.28每日总结
     将《软件构造》的作业进行了完善和更改,总算是改到了自己相对满意的程度;又学习了有关于Hive的相关知识;C#的页面设计又弄了弄;背单词!!!解决了之前一直困惑的问题; ......
  • 2023-2024 20231329 《计算机基础与程序设计》第1周学习总结
    作业信息  这个作业属于哪个课程<https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP>这个作业要求在哪里<https://www.cnblogs.com/rocedu/p/9577842.html#WEEK01>这个作业的目标<快速浏览一遍教材计算机科学概论,课本每章提出至少一个自己不懂的或最想解决的问题并在......
  • 9. seqtk seqkit gtftk 总结
    1.背景  在前面小节我们使用了这些软件,因为混合使用比较让人混乱,这里总结理清楚一下.2.seqtk  功能总览如下图所示.2.1seq  这个功能主要是对\(.fasta\)和\(.fastq\)格式的文件进行格式化.\(-l\)  主要是让序列每行显示多少个碱基#每行显示60个氨基酸se......
  • python简写语法总结
    Lambdadefadd(a,b):returna+bprint(add(1,2))简写成add=lambdaa,b:a+bprint(add(1,2))[]推导式正常写法:s_list=[]foriinrange(5):s_list.append(i)print(s_list)简写:s_list=[iforiinrange(5)]print(s_list)判断正常写法:a=......
  • 2023-2024-1 20231416《计算机基础与程序设计》第一周学习总结
    第一次接触电脑就是安装虚拟机有一种拔剑四顾心茫然的无措之感但好在网上的虚拟机安装基础和同学们的帮助无疑是我的救命稻草virtualbxVMwareBIOS这都是我前所未闻的这一次作业我学到了很多还希望以后能更进一步1.在20世纪80年代末 并行体系结构出现 所有处理器共享同......