免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1450 | 回复: 0
打印 上一主题 下一主题

每个开发者都必须知道的 14 个数字 [复制链接]

论坛徽章:
49
15-16赛季CBA联赛之福建
日期:2016-06-22 16:22:002015年亚洲杯之中国
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36双鱼座
日期:2015-01-02 22:04:33午马
日期:2014-11-25 09:58:35辰龙
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龙
日期:2014-08-21 10:47:58
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-31 14:44 |只看该作者 |倒序浏览
  
   
        
            
            
            
下面的表格显示了不同复杂度算法条件下,在几秒钟内它们可以达到的极限,n是输入量大小。我已经为每个复杂的类型增加了一些算法和数据结构的例子。
            
               
                    
                        n最大值
                        复杂度
                        算法
                        数据结构
                    
                    
                        1,000,000,000 and higher
                        log n, sqrt n
                        对分查找,三元查找, 快速指数,欧几里得算法
                        
                    
                    
                        10,000,000
                        n, n log log n, n log* n
                        集合相交, Eratosthenes筛选法,基数排序, KMP算法,拓扑排序,欧拉路径, 强连通分量, 2sat图
                        不相交的集, tries树, 哈希映射, 滚动散列双端队列
                    
                    
                        1,000,000
                        n log n
                        排序, 分治法, 扫描线算法, Kruskal算法, Dijkstra算法
                        段树, 范围树, 堆, 二叉排序树, 树状数组, 后缀数组
                    
                    
                        100,000
                        n log2 n
                        分治法
                        2d范围树
                    
                    
                        50,000
                        n1.585, n sqrt n
                        Karatsuba乘法算法, 平方根技巧
                        两层树
                    
                    
                        1000 - 10,000
                        n2
                        最大空矩形, Dijkstra算法, 普里姆算法 (密集图)
                        
                    
                    
                        300-500
                        n3
                        所有对最短路径, 最大和子阵,原生矩阵乘法, 矩阵链乘积, 高斯消元法, 网络流
                        
                    
                    
                        30-50
                        n4, n5, n6
                        
                        
                    
                    
                        25 - 40
                        3n/2, 2n/2
                        
                        
中途相遇
                        
                        哈希表 (交叉集)
                    
                    
                        15 - 24
                        2n
                        子集枚举, 暴力破解, 动态规划与指数状态
                        
                    
                    
                        15 - 20
                        n2 2n
                        动态规划与指数状态
                        位集合, 哈希映射
                    
                    
                        13-17
                        3n
                        动态规划与指数状态
                        哈希映射 (保存状态)
                    
                    
                        11
                        n!
                        暴力破解,回溯法, next_permutation全排列
                        
                    
                    
                        8
                        nn
                        暴力破解, 笛卡尔积
                        
                    
               
            
            
            
            
这些数字不是非常精确,它们假设了内存操作以及一些变化的常数因子,但对于找到与你的问题和数据量大小相适应的解决方案研究方面,它们确实给出了一个很好的起点。
            
            
        
   
   
        
            
            
            
让我们通过一个实例来继续讲解。
            
假设你为一家GPS公司工作,你的项目是改善他们的导航功能。在学校,你学会使用Dijkstra's 算法,在图上计算两点之间的最短距离。了解这些数字,你就会明白,他将耗费几秒钟以计算具有上百万条边的图形,Dijkstra's 算法实现这些,有

的时间复杂度(m代表边数,n表示节点数)。
            
现在你面临一个新的问题:
            
你期望你的代码能执行多块?几秒钟?数百毫秒?
            
如果它在网络上的响应时间少于500毫秒,就觉得快。因此我们选半秒。
            
图有多大?你想解决问题是一个城市,一个国家还是一片大陆?
            
            
        
   
   
        
            
            
            
每一个大于其他大小的,将通过不同的方法解决。
            
比方说,我们要解决整个欧洲的问题。
            
下面是一些输入集的大小:
            
               
                    
                        input
                        Europe
                        USA/CAN
                        USA (Tiger)
                    
                    
                        #nodes
                        18 029 721
                        18 741 705
                        24 278 285
                    
                    
                        #directed edges
                        42 199 587
                        47 244 849
                        58 213 192
                    
                    
                        #road categories
                        13
                        13
                        4
                    
               
            
            
            
            
即使我们选择半秒时间作为我们的执行时间,我们选的问题大小大约是4千万条边数,从我们提供的表里哼清楚地看到, m log n 太慢了。因此纯Dijkstra 算法解决不了我们的问题。我们需要卡看别的算法,如A星搜索算法或者基于 对于这个问题的高速公路层次式的表现。
            
            
        
   
英文原文:
14 numbers every developer should know
                       
                               
                    
                               
                       
                       
                       
                                时间:2013-03-31 09:02来源:开源中国社区 作者:zhangkai责任编辑:zhangkai

本文来自ChinaUnix新闻频道,如果查看原文请点:http://news.chinaunix.net/opensource/2013/0331/2700433.shtml
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP