跳转至

基础算法

!!#ff0000 请注意:学习算法之前请确保自己已经掌握 C/C++ 的基本语法。!!

看到这里,想必读者已经学会了 C 和 C++ 的基础语法,也具备了相当强的自学能力。接下来要学习的基础算法主要通过 C++ 语言实现。

语法掌握以后,我们开始接触算法,算法就是解决问题的方法,众所周知的有二分算法(例如猜数字游戏,每次都选择范围中间的数,是平均速度最快的猜法),这个阶段需要掌握的是用程序语言来实现分析与计算。这个阶段 只需要将题单内简单的题目学会即可

下面罗列了一些大家要学习的基础算法,请自行在网络上搜索相关课程、购买相关书籍进行学习。学习算法时,建议大部分同学量力而行, 不要在一个问题上死磕

观看视频课程的同时也可以尝试阅读一些文本资料,推荐网站:OI-Wiki(较深入)Hello 算法(较基础)

需要学习的基础算法(思想)

下面是初学阶段(备战我校新生赛)需要学习的基础算法,参考资料:能力提升综合题单Part2 基础算法、Hello 算法。

模拟

模拟,顾名思义就是题目要求你做什么你就做什么,这样的题目很考验选手的代码组织能力。

贪心

贪心算法(英语:greedy algorithm),是用计算机来模拟一个「贪心」的人做出决策的过程。这个人十分贪婪,每一步行动总是按某种指标选取最优的操作。而且他目光短浅,总是只看眼前,并不考虑以后可能造成的影响。

排序

排序算法(sorting algorithm)用于对一组数据按照特定顺序进行排列。排序算法有着广泛的应用,因为有序数据通常能够被更高效地查找、分析和处理。

常用的排序算法有:选择排序、冒泡排序、插入排序、快速排序、归并排序等。

递归与递推(重难)

俗话说:人理解递推,神理解递归。递归(Recursion),在数学和计算机科学中是指在函数的定义中使用函数自身的方法,在计算机科学中还额外指一种通过重复将问题分解为同类的子问题而解决问题的方法。

搜索(重难)

搜索算法(searching algorithm)用于在数据结构(例如数组、链表、树或图)中搜索一个或一组满足特定条件的元素。

二分

二分查找(binary search)是一种基于分治策略的高效搜索算法。它利用数据的有序性,每轮缩小一半搜索范围,直至找到目标元素或搜索区间为空为止。

分治

分治(divide and conquer),全称分而治之,是一种非常重要且常见的算法策略。分治通常基于递归实现,包括“分”和“治”两个步骤。

  • 分(划分阶段):递归地将原问题分解为两个或多个子问题,直至到达最小子问题时终止。
  • 治(合并阶段):从已知解的最小子问题开始,从底至顶地将子问题的解进行合并,从而构建出原问题的解。

构造(较难)

构造题是一种形式灵活多样的题型。正是因为这个特点,使得构造题没有一种通用的方法。

高精度

在 C++ 中,long long 都无法表示我们需要的整数时怎么办?那就用高精度吧!

前缀和、差分

前缀和是一种重要的预处理,能大大降低查询的时间复杂度,而差分则是一种和前缀和相对的策略。

动态规划(较难)

动态规划(dynamic programming)是一个重要的算法范式,它将一个问题分解为一系列更小的子问题,并通过存储子问题的解来避免重复计算,从而大幅提升时间效率。

在此阶段只需要学习简单的一阶线性动态规划和背包问题,更加复杂的动态规划问题可以在后续学习。