算法通关笔记 启航!

前言

经过半年多的算法学习,大大小小也输出了二十几篇算法博客,但发现博客零零散散没有形成完整的知识体系,于是这几天我将往期的算法博客排序好收录在了算法通关笔记专栏里。

指路👉算法通关笔记

下面我来详细介绍一下这个专栏。
在这里插入图片描述

专栏内容

本着面向小白的态度,我先来解释一下什么是算法。

算法通俗点讲就是解决问题的方法。
应用到计算机这个情景里面就是 计算机程序解决一道题目用到的方法。

但由于题目要求需要在有限的时间内解决这一问题。
所以一些学者就针对某一问题的解决方法不断优化。
最终形成了解决某一问题的特定方法。
而这就是我们要学习的算法。

良好的算法能力是计算机专业的大学生需要具备的最基本的能力,也是最重要的能力。
在面试过程中,面试官如何在短时间内了解你的编程能力?
答案就是考察你的算法能力如何。

所以算法的重要程度可见一斑。

本专栏是以Acwing 算法基础课和算法提高课的内容为导向的算法知识讲解,站在算法小白的角度对算法的本质进行剖析,带你早日拿下算法这做大山!

前置知识

本专栏所使用语言均为C++,这也是众多竞赛选手的选择。
这得益于C++的语法简洁,其内置的STL模板库,功能强大,编译速度也非常高效。
所以C++无疑是最适合写算法题的高级语言。

如果不熟悉 C++ 的朋友可以看我下面这篇博客,带你快速入门刷题会用到C++的基础知识 。

给自己挖个坑 马上就写

前文当中提到的 “题目要求需要在有限的时间内解决”。

一般的题目对 C++语言 的要求是在 1s 之内解决。

在这种情况下,C++代码中的操作次数控制在 107∼108 的数量级 为最佳。

这时我们需要引入一个时间复杂度的概念。

即 程序基本操作执行的次数。

例如:

下面这个段程序的时间复杂度 就是 O(n)

因为一个语句循环了 n 次,所以是 O(n)

   for(int i=0; i<n; i++){;
    printf("算法通关笔记");
    }

这个段程序的时间复杂度 就是 O(2n)

因为两个语句循环了 n 次,所以是 O(2n)

   for(int i=0; i<n; i++){;
    printf("算法通关笔记");
    printf("启航");
    }

而这个段程序的时间复杂度 是 O (logn) (以 2 为底)

因为 i 是以 2的次幂 来指数增长的 所以 这个语句执行的次数为 logn(以 2 为底)

   for(int i=1; i <= n; i*=2){;
    printf("算法通关笔记");
    }

做题技巧

每一种算法都有自己的时间复杂度,根据算法的时间复杂度与题目给定的数据范围,我们可以就推算出 所写程序当中 代码中的操作次数。
如果代码的操作次数大于 107∼108 ,那么此程序就不能在 1s 之内输出答案,这就意味着 程序是超时的。所选用的算法不是最优解,需要寻找时间复杂度更低的算法。
在这里插入图片描述例如上面的背包问题 数据范围 是 1000

如果用 时间复杂度 是 O(n3)的算法的话,C++ 的操作次数的数量级就是 10003 = 109 ,已经超出 C++ 1 秒内可执行操作次数 107∼10^8这个范围了。所以我们需要选择 时间复杂度 是 O(n2)的算法更加合适。

所以 我们需要根据题目的数据范围来选择算法,不盲目的碰运气写题。

下面 分享一下 y总 整理的 由数据范围反推算法复杂度以及算法内容。
希望对大家有帮助。

下面涉及到的算法讲解,会在我学习之后收录到此专栏里。

n≤30
适用算法:指数级别, dfs+剪枝,状态压缩dp。

n≤100
时间复杂度:O(n3)
适用算法:floyd,dp,高斯消元。

n≤1000
时间复杂度: O(n2),O(n2logn)
适用算法:dp,二分,朴素版Dijkstra、朴素版Prim、Bellman-Ford。

n≤10000
时间复杂度: O(n∗ n \sqrt{n} n
适用算法:块状链表、分块、莫队。

n≤105
时间复杂度: O(nlogn)
适用算法: 各种sort,线段树、树状数组、set/map、heap、拓扑排序、dijkstra+heap、prim+heap、Kruskal、spfa、求凸包、求半平面交、二分、CDQ分治、整体二分、后缀数组、树链剖分、动态树。

n≤106
时间复杂度: O(n), 以及常数较小的 O(nlogn) 算法
适用算法: 单调队列、 hash、双指针扫描、并查集,kmp、AC自动机。
常数比较小的 O(nlogn)的做法:sort、树状数组、heap、dijkstra、spfa。

n≤107
时间复杂度: O(n)
适用算法: 双指针扫描、kmp、AC自动机、线性筛素数。

n≤109
时间复杂度:O( n \sqrt{n} n )
适用算法:判断质数。

n≤1018
时间复杂度:O(logn)
适用算法:最大公约数(gcd),快速幂,数位DP。

n≤101000
时间复杂度:O((logn)2)
适用算法:高精度加减乘除。

n≤10100000
时间复杂度:O(logk×loglogk),k表示位数。
适用算法:高精度加减、FFT/NTT。

完结散花

ok以上就是对 算法通关笔记 序章的全部内容啦,很感谢你能看到这儿。如果有遗漏、错误或者有更加通俗易懂的讲解,欢迎小伙伴私信我,我后期再补充完善。

参考文献

https://blog.csdn.net/m0_66139206
https://www.acwing.com/blog/content/32/

  • 17
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沈七QWQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值