求教:计算代码复杂度的算法是什么? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
karlxu
V2EX    程序员

求教:计算代码复杂度的算法是什么?

  •  
  •   karlxu 2014-05-29 15:23:27 +08:00 8524 次点击
    这是一个创建于 4227 天前的主题,其中的信息可能已经有所发展或是发生改变。
    30 条回复    2014-06-02 02:18:13 +08:00
    yangff
        1
    yangff  
       2014-05-29 16:38:05 +08:00   2
    不存在。
    misaka
        2
    misaka  
       2014-05-29 16:53:20 +08:00   1
    目测算法。。。
    zhoulujue
        3
    zhoulujue  
       2014-05-29 17:24:23 +08:00
    静态分析工具,多的是。
    imxz
        5
    imxz  
       2014-05-29 17:40:06 +08:00
    是想问 大O 吗 ?
    Mutoo
        6
    Mutoo  
       2014-05-29 17:48:37 +08:00
    大O表示法,在 Mark Allen Weiss 的《数据结构与算法分析》里面有专门一章节介绍,而且有好几章节的案例分析。
    karlxu
        7
    karlxu  
    OP
       2014-05-29 19:41:23 +08:00
    @imxz 我想问的是圈复杂度计算,网上都是说数有多少if,while,for。。。。但感觉不是很严谨
    karlxu
        8
    karlxu  
    OP
       2014-05-29 19:41:34 +08:00
    @Mutoo 我想问的是圈复杂度计算,网上都是说数有多少if,while,for。。。。但感觉不是很严谨
    karlxu
        9
    karlxu  
    OP
       2014-05-29 19:41:43 +08:00
    @binux 我想问的是圈复杂度计算,网上都是说数有多少if,while,for。。。。但感觉不是很严谨
    jiang42
        10
    jiang42  
       2014-05-29 20:13:09 +08:00   1
    @karlxu 难道你想分析到机器码级别的?
    算法分析个大概就好
    然后放到实际环境中跑跑看看
    creamiced
        11
    creamiced  
       2014-05-29 20:16:07 +08:00
    @karlxu 圈复杂度当然是数这些啊,当然还要考虑嵌套。
    还以为你说时间复杂度
    akfish
        12
    akfish  
       2014-05-29 20:24:08 +08:00
    akfish
        13
    akfish  
       2014-05-29 20:25:25 +08:00   1
    Mathematically, the cyclomatic complexity of a structured program[a] is defined with reference to the control flow graph of the program, a directed graph containing the basic blocks of the program, with an edge between two basic blocks if control may pass from the first to the second. The complexity M is then defined as[2]
    M = E N + 2P,
    where
    E = the number of edges of the graph.
    N = the number of nodes of the graph.
    P = the number of connected components (exit nodes).

    够严谨了吧。
    keniusahdu
        14
    keniusahdu  
       2014-05-29 20:27:45 +08:00   1
    Sonar 有计算复杂度的。但是没有什么算法,都是针对循环,判断之类的识别。以及空引用高危判断。
    ps:我说的是java ,其他不知道
    fzss
        15
    fzss  
       2014-05-29 21:19:59 +08:00
    ORDER OF GROWTH
    dorentus
        16
    dorentus  
       2014-05-29 21:32:54 +08:00   1
    https://zh.wikipedia.org/wiki/循度
    这个?
    按定义数呗
    本来就不是啥严禁的
    soundbbg
        17
    soundbbg  
       2014-05-29 21:42:13 +08:00   1
    一开始不需要过度优化,后面针对具体的瓶颈优化就好了。

    拿循环做复杂度其实也挺逗的,谁知道函数嵌套了多少个函数,更不要说大部分不间断的程序都是死循环,你没看到只是因为别人都封装好了。

    代码里不推荐多个嵌套循环这是必然的,但纯拿循环来说性能就和拿代码行数算KPI一个道理,况且计算机就是一个大循环。
    ruandao
        18
    ruandao  
       2014-05-29 23:21:14 +08:00
    时间复杂度?
    空间复杂度?
    还是逻辑复杂度?
    lijinma
        19
    lijinma  
       2014-05-29 23:29:18 +08:00
    @soundbbg 拿循环说性能挺逗?大哥,那你觉得纯研究算法的是靠什么来做标准?还不是靠循环,你这是藐视算法分析;

    一个算法在数据很小的时候没多大作用,但是在数据很大的时候,n^2 和 n 那得有多大差距啊;

    敢问兄弟,不靠循环,你靠什么来评判一个算法的时间复杂度?
    soundbbg
        20
    soundbbg  
       2014-05-30 00:56:11 +08:00 via iPhone
    @lijinma 你理解错了,我没有藐视算法。
    66450146
        21
    66450146  
       2014-05-30 02:17:43 +08:00 via Android
    @lijinma 算法的时间复杂度跟代码本身没有任何关系,也不是由循环数量决定的。。。简单的可以数循环,复杂的就数不出来了
    karlxu
        22
    karlxu  
    OP
       2014-05-30 09:51:27 +08:00
    @akfish 我们要用python做个统计代码复杂度的工具,难道就数if,while,for,try,catch,switch?会不会太简单了?
    karlxu
        23
    karlxu  
    OP
       2014-05-30 09:51:54 +08:00
    @soundbbg 我们要用python做个统计代码复杂度的工具,难道就数if,while,for,try,catch,switch?会不会太简单了?
    akfish
        24
    akfish  
       2014-05-30 10:23:29 +08:00
    @karlxu 正经的方法是把编译器前端部分做出来,解析源代码生成AST(抽象语法树),剩下的事情就是一堆图算法去撸而已。
    这部分的研究很成熟了,各种IDE高上洋的代码自动完成、重构、分析工具都是这样实现的。
    karlxu
        25
    karlxu  
    OP
       2014-05-30 11:19:16 +08:00
    @akfish 好像挺难的。。。多谢你的建议。
    akfish
        26
    akfish  
       2014-05-30 11:28:15 +08:00   1
    @karlxu Parser有现成的可用,不用自己写
    https://docs.python.org/2/library/ast.html
    wecing
        27
    wecing  
       2014-06-01 04:04:22 +08:00
    我只知道停机问题。
    lijinma
        28
    lijinma  
       2014-06-01 23:32:50 +08:00
    @66450146 无语,我倒要问问你了,你写代码的时候,还写过估算不出时间复杂度的代码?

    如果你真估算不出来,我还是建议你不要写这样的代码为好。
    66450146
        29
    66450146  
       2014-06-02 00:36:01 +08:00 via Android
    @lijinma 我不会先写代码再从代码来计算时间复杂度,我相信你也是的。。。比如说最优化问题,复杂度就要从这个问题的信息量和筛选(剪枝)的效率或者是DP的规模来推断,从这个角度上来说代码的循环数量和复杂度都是同一个原因的结果,而不能说代码是复杂度的原因,就算代码一行都没写,复杂度也丝毫不会受到影响,不知道这样说清楚不清楚。。。

    如果只是简单的深搜广搜或者裸 DP,那当然是数数就好了。。。
    lijinma
        30
    lijinma  
       2014-06-02 02:18:13 +08:00
    @66450146 恩,看来我们的观点是不矛盾的;

    (1)我们自己写代码,肯定是先由算法,有时间复杂度,然后才有代码;

    (2)但我们去看别人的代码,我们可以参考(我说的是参考,不一定完全依赖)别人代码中的循环等来估算别人的代码复杂度;

    -。- 所以,我们说的是两个问题,不过你同意(2)的内容吗?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2953 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 12:54 PVG 20:54 LAX 04:54 JFK 07:54
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86