1. 语言基础(40小时)
- 语法和基本结构:控制结构(如
if
、for
、while
)、函数、递归、异常处理等。 - 面向对象编程:类与对象、继承、多态、抽象类、接口等概念。
- 标准库:特别是数据处理、文件读写、正则表达式、日期和时间、错误和异常处理、字符串操作等常用库。
- 调试和测试:单元测试、调试工具使用,代码风格检查(如
pylint
、flake8
)。 - 实践:使用一些简单的编程题目(如LeetCode Easy)进行巩固,提升代码编写的流畅性。
2. 基础数据结构(每个10小时)
这里列出的基础数据结构通常都是编程的基础,可以按每个10小时进行学习:
- 数组和字符串:掌握数组的操作(增删改查)、字符串操作(字符数组、拼接、查找、截取)。
- 链表:单链表、双向链表、循环链表。重点在链表的增删查改,反转链表,链表合并等。
- 栈:使用栈进行表达式求值、括号匹配等经典问题。
- 队列和双端队列:包括普通队列和双端队列的操作,以及实际应用,如滑动窗口问题。
- 哈希表:哈希函数、冲突处理,掌握用哈希表解决查找问题,例如求两个数组的交集。
- 树:二叉树,二叉搜索树,基本树的遍历(前序、中序、后序、层序遍历),递归和非递归方式。
- 堆:优先队列、最大堆和最小堆,实现方式及其在排序和快速查找中的应用。
- 图的基础知识:图的表示(邻接矩阵、邻接表),图的遍历(DFS、BFS),简单的路径查找。
3. 基础算法(每个15小时)
基础算法部分主要包括排序、搜索、递归、分治等。可以将20个算法按照以下推荐分配学习:
-
排序算法(4个算法):
- 冒泡排序、选择排序、插入排序、归并排序、快速排序等。
-
查找算法(3个算法):
- 二分查找(适用于有序数组)、哈希查找、深度优先搜索(DFS)、广度优先搜索(BFS)。
-
递归与分治(2个算法):
- 理解递归的思想和分治法的应用,如归并排序和快速排序。
-
贪心算法(2个算法):
- 了解贪心算法的基本思想,例如找零问题、最优子结构的问题。
-
回溯算法(2个算法):
- 理解回溯法的思路,如排列组合问题、N皇后问题、数独问题等。
-
搜索和路径规划(4个算法):
- DFS、BFS、A*算法、Dijkstra算法,适用于路径规划、迷宫问题等。
-
其他基础算法(3个算法):
- 快慢指针(如链表中环的检测)、滑动窗口(适用于字符串匹配和最长子数组问题),双指针(适用于两数和、三数和问题)。
4. 基础竞赛算法(每个20小时)
基础竞赛算法难度较大,通常在解决复杂问题时使用。以下是一些常见的竞赛算法主题:
- 高级搜索算法:如IDA*算法、双向BFS。
- 数论:如质数判断、欧几里得算法(最大公约数)、快速幂、组合数学、阶乘等。
- 动态规划:如背包问题、最长公共子序列、最长递增子序列等。
- 图论算法:如最短路径算法(Dijkstra、Floyd-Warshall)、最小生成树(Prim、Kruskal)。
- 并查集:掌握并查集的结构,特别是路径压缩和按秩合并的实现。
- 高级数据结构:如树状数组、线段树、字典树(Trie)、二叉索引树等。
- 字符串匹配算法:KMP算法、Rabin-Karp算法、AC自动机等。
- 概率和期望值算法:在随机化算法和期望问题中常见,如蒙特卡洛算法等。
- 数学优化:如整数规划、线性规划的简单应用。
5. 动态规划额外训练(100小时)
动态规划是竞赛和工程中非常重要的算法设计思想,通过100小时的专项训练可以帮助你掌握这类算法。以下是动态规划的重点内容:
- 基础动态规划问题:如斐波那契数列、楼梯问题等,理解最优子结构。
- 背包问题:01背包、完全背包、多重背包等。
- 区间型动态规划:如戳气球、回文子序列问题等。
- 子序列型动态规划:如最长上升子序列、最长公共子序列。
- 路径规划型动态规划:如最小路径和、独特路径等。
- 状态压缩动态规划:如旅行商问题。
- 双序列动态规划:如编辑距离、字符串匹配等问题。
- 博弈类问题:如石子游戏等