根据时间复杂度估算算法运行时间-示例及“对数Lg (x)"的灵活应用
1、在数学分析中,以e为底对数很常见。另一方面,以10为底对数在十进制表示法中,手工计算很容易:
所以log10x表示正整数x的位数:数字的十进制位数是严格大于log10x的最小的整数。例如 log10 1430 ≈ 3.15 ,下一个整数是4,即1430的位数。
2、以2为底的对数常用于计算机科学,因为计算机中二进制很普及。
下表列出了这些底数的常用的对数符号以及他们所使用的领域。许多学科都写log(x)来代替logb(x),根据前后文可以确定,记号blog(x)也出现过。ISO表示法”(ISO 31-11)一列指定了ISO推荐的表示方法。
3、计算机算法效率
为求解相同问题而设计的不同算法在效率方面常常具有显著的差别,这些差别可能比由于硬件和软件造成的差别要重要的多。
作为一个例子,下面介绍两个用于排序的算法。第一个称为插入排序,为了排序n个项,该算法所花时间大致等于c1 n2,其中c1是一个不依赖于n的常数。也就是说,该算法所花时间大致与n2成正比。第二个称为归并排序,为了排序n个项,该算法所花时间大致等于c2nlgn,其中lgn代表log2n,且c2是另一个不依赖于n的常数。与归并排序相比,插入排序通常具有一个较小的常数因子,所以c1<c2,我们将看到就运行时间来说,常数因子可能远没有对输入规模n的依赖性重要。把插入排序的运行时间写成c1•n•n并把归并排序的运行时间写成c2n•lgn。这时就运行时间来说。插入排序有一个因子n的地方归并排序有一个因子lgn,后者要小的多。(例如,当n=1000是,lgn大致为10,当n=100万时,lgn大致仅为20。)虽然对于小的输入规模,插入排序通常比归并排序要快,但是一旦输入规模n变得足够大,归并排序lgn对n的优点将足以补偿常数因子的差别,不管比c1小c2多少,总会存在一个交叉点,超出这个点,归并排序更快。
作为一个具体的例子,我们让运行插入排序的一台较快的计算机(计算机A)与运行归并排序的一台较慢的计算机(计算机B)竞争。每台计算机必须排序一个具有1000万个数的数组。(虽然1000万个数似乎很多,但是,如果这些数是8字节的证整数,那么输入将占用大致80MB内存,即使一个便宜的便携式计算机的存储器也能多次装入这么多数。)假设计算机A每秒执行百亿条指令(快于目前任何单台串行计算机),而计算机B每秒仅执行1000万条指令,结果计算机A就纯计算能力来说比计算机B快1000倍。为使差别更具有戏剧性,假设世上最巧妙的程序员为计算机A用机器语言编写插入排序,并且为了排序n个数,结果代码需要执行2n2条指令。进一步假设仅由一位水平一般的程序员使用某种带有一个低效编译器的高级语言来实现归并排序,结果需要50nlgn条指令。为了排序1000万数,
计算机A需要:
而计算机B需要:
通过使用一个运行时间较长较慢的算法,即使采用一个较差的编译器,计算机B比计算机A还快17倍!当我们排序1亿个数时,归并排序的优势甚至更加明显,:这时插入排序需要23天多,而归并排序不超过4小时。一般来说,随着问题规模的增大,归并排序的相对优势也会增大。
注: 如何检测
参考:《算法导论第三版》