三种情况一次报全
把三种情况一次算完,按「最好/最坏/平均」的顺序拼起来输出(用 / 隔开)。 (本题用 g++ -std=c++17 -O0 编译。)
一份复杂度分析该包含什么
第 1 步:每一对只比一次 第 2 步:i=0:只和后面的比 第 3 步:i=1:只和后面的比 第 4 步:i=2:只和后面的比 第 5 步:i=3:只和后面的比 第 6 步:右上三角:比一半的对 j0 j1 j2 j3 j4 i0 i1
只说这段代码很快的问题
分析里只写一句「这段代码很快」,问题是【0】。
两两比较跑了多少次
运行下面这段程序: #include <iostream> #include <string> #include <vector> using namespace std; int main() {
第一步:数出操作次数
最终作品第一步:补全 count_pairs,数出「每两个元素比一次」要比多少次。算 n = 5 的情况。 (本题用 g++ -std=c++17 -O0 编译。)
第二步:判出量级
上一题的次数是 n(n-1)/2。数据量翻倍时它变成几倍?补全 grow,算 n 从 100 到 200 的倍数(整除)——这个数说明它属于哪个量级。 (本题用 g++ -std=c++17 -O0 编译。)
第三步:把空间也算上
补全 space:返回「复制一份的额外格子数/原地做的额外格子数」(用 / 隔开)。分析里最常被漏掉的就是空间这一半。 (本题用 g++ -std=c++17 -O0 编译。)
第四步:据此选一个
补全 pick:给出数据规模,返回该用「暴力」还是「前缀和」。规则:暴力操作数(n × m)不超过一百万就用暴力,超过才用前缀和。这次问 n=1000、m=1000——算出来正好是一百万。「正好等于」算不算「超过」? (本题用 g++ -s
交付:一份完整的复杂度分析
这是这条路线的最终作品。前四步的函数已经合在一起,还差两处关键逻辑:pick 的边界判断、three_cases 的平均情况。补全后一次验完五条:「两两比较」n=5 时 10 次;翻倍后 4 倍;空间 5/0;n=m=1000 选「暴力」;
n 为三千时立方要跑多久
按「1 秒约 1e8 次」估算,n = 3000 时一个 O(n³) 的程序大约要跑【0】。