有些同学可能对电脑的速度没有概念,但是觉得电脑应该跑的很快,那么leetcode上做算法题为什么会超时呢?计算机在1秒内可以进行多少次操作?我们来讨论一下这个问题。什么是超时?大家在leetcode上练习算法的时候应该都遇到过一种错误,就是“超时”。也就是说,程序的运行时间超过了规定的时间。一般OJ(onlinejudge)的超时时间为1s,即输入用例数据后最多1s内可以得到结果。目前还不清楚leetcode的判断规则。下面为了说明方便,暂定超时时间为1s。如果写一个O(n)的算法,实际上可以估计n很大时算法的执行时间会超过1s。如果n的大小足以使O(n)算法运行1s以上,则应考虑log(n)方案。从硬件配置看电脑的性能电脑的运算速度主要取决于CPU的配置。以2015款MacPro为例,CPU配置:2.7GHzDual-CoreIntelCorei5。那就是2.7GHz奔腾双核,i5处理器,GHz是什么意思,1Hz=1/s,1Hz是CPU的一个脉冲(可以理解为状态的变化,也叫时钟周期),叫赫兹,那么1GHz等于多少赫兹?1GHz(MHz)=1000MHz(MHz)1MHz(MHz)=100万赫兹,所以1GHz=10亿赫兹,也就是说CPU每秒可以脉冲10亿次(有10亿个时钟周期),这里不简单理解一个时钟周期是一个CPU操作。比如1+2=3,CPU需要执行四次才能完成这个操作,第一步:将1放入寄存器,第二步:将2放入寄存器,第三步:做加法,第四步:存3而且,计算机的CPU不仅会运行我们自己写的程序,还会执行计算机的各种进程任务等等,我们的程序只是其中的一个进程。那么我们的程序在计算机上1秒真正能进行多少次操作呢?做一个测试实验。在写测试程序衡量1秒处理多少个数量级的数据时,需要注意三点:CPU执行每条指令实际需要的时间比如CPU执行每条指令的耗时加法和乘法运算实际上是不同的。现在大部分计算机系统的内存管理都有缓存技术,所以频繁访问同一地址的数据和访问不相邻的元素所需要的时间也是不一样的。计算机同时运行多个程序,每个程序中的不同进程线程都在抢夺资源。虽然有很多因素,但您仍然可以对程序的运行时间有一个大概的评估。引用算法4中的一段话:火箭科学家需要大致知道测试火箭是落在海里还是落在城市;医学研究人员需要知道药物测试是否会杀死或治愈受试者;所以任何开发计算机程序员的软件工程师都应该能够估计程序运行需要一秒还是一年。这是最基本的,所以上面的错误没什么大不了的。以下是C++代码示例:测试硬件:2015MacPro,CPU配置:2.7GHzDual-CoreIntelCorei5实现三个功能,时间复杂度为O(n),O(n^2),O(nlogn),使用加法运算来统一测试。//O(n)voidfunction1(longlongn){longlongk=0;for(longlongi=0;i
