曾经看各种知乎,博客,见到有人自称随便写个代码,效率超过库函数,当时的心境是有可能,算法都已经比较成熟,自己写和用库函数区别不大。
后面学习算法,自己实现过几大经典排序,也和C++的标准库算法比较过,基本差不多。
之后又涉猎了一些编译器的应用知识,了解了编译参数,在开 O2 情况,没有任何一种自己实现的算法能打败库函数。
在研究大矩阵乘法的时候,我用暴力循环 + 并发 + 矩阵转置去 PK Eigen库 和 cublas,在不开优化的debug情况,和 Eigen 有一拼,比 cublas 就差很远。
但是开启优化后,我写的东西就被摔倒八条街以外了,Eigen 和 cublas 不相上下,此时我发现,自己并不了解算法,或者说,认为可以随便写个东西就能和经典库函数打一打的想法,是因为自己太无知了。
看到这里,我想说,朋友们,不要拿自己顺手做的东西去和专业认识维护的东西去比较,在秀出你优秀代码的前期,你有多洋洋得意,被别人揭穿底裤后,你就有多羞愧。
我们和专业库作者的差距,如同一道算法题:
三个空汽水瓶可以换一瓶汽水,允许借空汽水瓶,但必须要归还。有n个空汽水瓶,最多可以喝到多少瓶汽水。
如果你的程序超过一行,类似下面这个,说明你不懂算法。我就是。
#include <iostream>
int main()
{
int epbtl = 0;
int cnt = 0;
int shengyu = 0;
while (std::cin >> epbtl)
{
if (epbtl == 0)
{
return 0;
}
for (int i = epbtl; i != 0; i = i / 3)
{
cnt += i / 3;
shengyu += i % 3;
if (shengyu >= 3)
{
cnt++;
shengyu -= 2;
}
}
if (shengyu == 2)
{
++cnt;
}
std::cout << cnt << std::endl;
shengyu = 0;
cnt = 0;
}
return 0;
}
答案是 print( n/2)。
这就是专业的差距。