先看规模,再选写法
这一课只练一件事:先用 判断程序能不能跑完。把 记成大约 n 次,把 记成大约 n×n 次,再主动准备 。完成四个小任务:选出估法,数一遍 n=3,再对照 。这里不会在浏览器里运行 C++。
任务 1:先数循环大概跑几次
程序能不能跑完,先看 ,不要只看代码长短。一层循环常常接近 ,两层循环常常接近 。点不认识的词可看基础解释。
必会:能比较两段循环的大致规模。这里不会在浏览器里运行 C++,只练习选择和数次数。
n 很大时,该怎么判断程序能不能跑完?操作次数 · 必会
两层循环套在一起,大约做几次?O(n²) · 必会
任务 2:用 n=3 数两种写法
最小示例:单层 for (int i = 0; i < n; i++) 大约 n 次;双层里面再套一层,大约 n * n 次。按顺序点三步,把 n=3 的次数数清楚。这里不会在浏览器里运行 C++。
必会:能比较两段循环的大致规模。边界:n=3 时双层是 9 次,不是 3 次;n 变大后差得更多。
- int mx = a[0];
- for (int i = 1; i < n; i++) if (a[i] > mx) mx = a[i];
- for (int i = 0; i < n; i++)
- for (int j = 0; j < n; j++) { /* 大约 n * n 次 */ }
三步对照数完了,现在亲手把这个次数算式敲出来。两层循环套在一起,外层转一圈,内层都要整圈走完,所以是 :大约 n 个 n 相加。下面是只读脚手架,只留一空给你敲键盘。
- int n = 1000;
- for (int i = 0; i < n; i++)
- for (int j = 0; j < n; j++) { /* 内层每圈都整圈走完 */ }
- int doubleLoopOps = ; // 用 n 写出这个次数
- // n = 3 时这里是 9,n = 1000 时是 1000000
int doubleLoopOps = n * n; // 外层 n 次,内层每次再 n 次,所以大约 n × n
任务 3:大 n 选写法,还要自己造测试
建议掌握:n=100000 时,双层大约 n×n 次,通常过不了 1 秒,应改用接近 的单层。必会还包括准备 :普通数据、最小和 。
必会 / 建议掌握 / 拓展:必会是比较规模、按 n 选可行写法、设计最小/最大测试。把 O(n) / O(n²) 当成次数外号是建议掌握。严格大 O 证明、主定理和摊还分析是拓展,现在不用当硬门槛。规模:n 大约 10^5 时,单层大约十万次通常能过;双层大约 10^10 次通常过不了。
- int mx = a[0];
- for (int i = 1; i < n; i++) if (a[i] > mx) mx = a[i];
- // 自己至少测 n=1、一组普通 n、以及题目允许的最大 n
- for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) { /* n * n */ }
先选出 n 很大时该用哪种写法:
再选出自己该准备哪些测试点:
任务 4:随机小测,看看你是否真的懂了
每次从本课题库抽出三道不同的选择题。题目与解析已通过校验,答完后看解析,不要只看分数;拿不准就回到对应任务再看一遍。