[算法]代码运行时间增长数量级对比 线性级别N vs 线性对数级别 NlgN

来源:互联网 发布:什么叫做js事件event 编辑:程序博客网 时间:2024/05/16 15:39

本文摘要

三段代码对比了以线性级别增长的代码(a,b)和以线性对数级别增长的代码(c)的区别;

代码结构

// 输入条件 Nfor(; ;)    for(; ;)        sum ++;

两层for( ; ; )循环,@param sum记录语句执行次数,不同输入条件N,屏幕打印执行次数;

完整源码

// Java Codepublic class TestRunningTimes{    public static void RunTimes(int N){    /* 增长数量级为 线性级别 2N-1 */        int suma = 0;        for(int n=N;n>0;n/=2)            for(int i=0;i<n;i++)                suma++;    /* 增长数量级为 线性级别 N-1 */        int sumb = 0;        for(int i=1;i<N;i*=2)            for(int j=0;j<i;j++)                sumb++;    /* 增长数量级为 线性级别 NlgN(以2为底的对数) */         int sumc = 0;        for(int i=1;i<N;i*=2)            for(int j=0;j<N;j++)                sumc++;    /* 屏幕打印语句执行次数 输出排版 */                   int lgN = (int)(Math.log((double)N)/Math.log((double)2));        int nlgn = lgN*N;        System.out.printf("%10d %10d %10d %10d %10d %10d\n",N,suma,sumb,lgN,nlgn,sumc);    }    /* 测试用例 : 不同的输条件 N  */    public static void main(String args[]){        System.out.println("        N       a        b        lgN        NlgN         c");        for(int N=1;N<1000000;N*=2)            RunTimes(N);    }}

编译运行

>javac TestRunningTimes.java>java TestRunningTimes        N       a        b        lgN        NlgN         c         1          1          0          0          0          0         2          3          1          1          2          2         4          7          3          2          8          8         8         15          7          3         24         24        16         31         15          4         64         64        32         63         31          5        160        160        64        127         63          6        384        384       128        255        127          7        896        896       256        511        255          8       2048       2048       512       1023        511          9       4608       4608      1024       2047       1023         10      10240      10240      2048       4095       2047         11      22528      22528      4096       8191       4095         12      49152      49152      8192      16383       8191         13     106496     106496     16384      32767      16383         14     229376     229376     32768      65535      32767         15     491520     491520     65536     131071      65535         16    1048576    1048576    131072     262143     131071         17    2228224    2228224    262144     524287     262143         18    4718592    4718592    524288    1048575     524287         19    9961472    9961472

结果分析

运行结果符合预期:
a 代码段执行次数为 2N-1;
b 代码段执行次数为 N -1;
c 代码段执行次数为 NlgN(以2为底的对数);

代码心得

手感回春www

0 0
原创粉丝点击