挖坑,以后再来填


该填下坑了,事情是这样的,就是说,因为一些不可抗力,我们来探讨一下下面两种写法对代码运行时间的影响。(假设两种情况都不会导致数组越界)。

int vis[10005][10005];
for(int i=1;i<=1000;i++)memset(vis,0,sizeof(vis));
bool vis[5005][5005];
for(int i=1;i<=1000;i++)memset(vis,0,sizeof(vis));

测试

下面是测试结果(未加任何优化):

SB int

可以看到第二种的优势十分明显,显然是在 memset 上面出了问题。

但这是为什么?

原理

众所周知, memset 的原理是擦字节,时间复杂度为 $O(n)$ , $n$ 为要擦的字节数量。

1个 int 4字节,但1个 bool 1字节。

再算上数组的大小,刚好是16倍。

这个故事告诉我们,如果不知道什么原因T了,好好检查一下你的 memset

附录

其实还可以根据上面的数据算出 memset 1秒可以擦多少字节。

略去计算过程,易得, memset 1秒可以擦约 $10^{10}$ 个字节,约 $2\times 10^9$ 个 int

memset实现详解