关闭

编程珠玑第六章

标签: 编程珠玑第六章
276人阅读 评论(0) 收藏 举报
分类:

1.假设现在的计算机比Appeal做实验所用的计算机快1000倍,如果使用相同的总时间(大约一天),对于O(n^2)和O(nlogn)算法,问题规模n个增加到多少?
(1)使用O(nlogn)二叉树算法时,一天可以处理的问题n的规模10 000个。那么可知10000log10000/ ( x*logx)=1/1000;即4*Math.pow(10,7)*Math.log(10)=( x*logx);由此写个算法得到n的近似值

public class t1 {
 public static void main(String []args){
     int i=0;
     double value=4*Math.pow(10,7)*Math.log(10);
     double temp;
     double before;
    while(true){
        i++;
        temp=i*Math.log(i);
        if(temp>value){
            before=(i-1)*Math.log(i-1);
            break;
        }
    }
    System.out.println(i-1);
    System.out.println((i-1)*Math.log(i-1));;
    System.out.println(value);
    System.out.println(temp);
 }
}

运行结果是

5907213
9.21034025786332E7
9.210340371976183E7
9.210341917031801E7

所以速度快1000倍,n的规模由10000变为了5907213,即规模扩大了大概590倍

(2)使用O(n^2)时,因为它比0(nlogn)的算法慢十二倍。所以可以得到下列等式(10^4)^2/( n^2 )=1/12/(1/12*1000)得到的近似解为
316227.7660168379。所以速度快1000倍,n的规模大概只增加了31倍。
3.精度改变对于算法运行速率的影响
下面我写的就是一个三重循环,每次进行加二,减一的运算。但是结果竟然float比double就快了近300毫秒,这才是一个简单的操作并且总运行时间才是3,4分钟,如果是复杂的操作并且需要一天的时间,可以预见精度的改变对于算法运行速度的巨大影响

package chapter6;
public class t3 {
    public static void  testfloat(){
        long current=System.currentTimeMillis();
        float f=0;
        for(int i=0;i<(int)(Math.pow(2, 30));i++){
            for(int j=0;i<(int)(Math.pow(2, 30));i++)
                for(int k=0;i<(int)(Math.pow(2, 30));i++){
                    f+=2;
                    f--;
                }
        }
        System.out.println(System.currentTimeMillis()-current+" 毫秒");
    }
    public static void  testDouble(){
        long current=System.currentTimeMillis();
        double f=0;
        for(int i=0;i<(int)(Math.pow(2, 30));i++){
            for(int j=0;i<(int)(Math.pow(2, 30));i++)
                for(int k=0;i<(int)(Math.pow(2, 30));i++){
                    f+=2;
                    f--;
                }
        }
        System.out.println(System.currentTimeMillis()-current+" 毫秒");
    }
    public static void main(String []args){
        //      System.out.println(Math.pow(2, 500));
        testfloat();
        testDouble();
    }
}

下面是在我机器上运行的结果

275970 毫秒
276267 毫秒
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

《编程珠玑》 学习收获

很早就买了这本书,不过一直没看,听师哥师姐们说,要想进互联网公司(dui)
  • dcj0913
  • dcj0913
  • 2014-09-17 10:41
  • 1019

《编程珠玑》---笔记。浏览此文,一窥此书。

第一章: 磁盘排序:对于一个提出的问题,不要未经思考就直接给出答案。要先深入研究问题,搞清楚这个问题的特点,根据这个特点,可能有更好的解决方案。   比如:文中:最初的需求只是“我如何对磁盘文件排序”...
  • yang_yulei
  • yang_yulei
  • 2014-06-30 23:53
  • 10032

编程珠玑——第一章习题解答

1、如果不缺内存,如何使用一个具有库的
  • shuitawuhen
  • shuitawuhen
  • 2014-10-22 13:07
  • 1497

把《编程珠玑》读薄

目录 开篇 啊哈!算法 数据决定程序结构 编写正确的程序 编程中的次要问题 程序性能分析 粗略估算 算法设计技术 代码调优 节省空间 排序 取样问题 搜索 堆 字符串
  • hk2291976
  • hk2291976
  • 2016-04-28 22:04
  • 1010

编程珠玑第二章习题

1、提供单词和词典,找到该单词的所有变位词,可以事先花时间和空间处理下该词典。 因为要查找变位词,事先遍历词典,得到每个单词签名,并建立签名列表,签名列表的每个项包含了该签名的所有单词。有了这个列表,...
  • chenzujie
  • chenzujie
  • 2013-08-10 11:57
  • 1819

《编程珠玑》高清pdf版

下载地址:网盘下载 作者简介 编辑 Jon Bentley是位于新泽西州Murray Hill的朗讯贝尔实验室计算机科学研究中心的技术委员会委员,Jon自1998...
  • cf406061841
  • cf406061841
  • 2017-05-27 18:57
  • 2311

《编程珠玑》心得

每月一本,老规矩,还是先谈总体感受,这是一本将优化进行到底的书,经典之中的经典,对算法有很强的启迪性,面试大公司的必读书籍之一,总之就是不错。还是分别讲要点吧 第一章:千万级大数据排序问题引出位图算法...
  • songzi1111
  • songzi1111
  • 2015-04-11 01:30
  • 618

编程珠玑第一章课后习题

1、使用库函数来进行排序 这个不同语言有不同的库函数排序c有qsort,java有sort排序,具体就不贴代码了。 2、用位逻辑实现位运算 这个道题的核心就在于想要把某bit置0,将该位直接和0做...
  • chenzujie
  • chenzujie
  • 2013-07-28 12:56
  • 2837

编程珠玑——电话号码排序

编程珠玑第一章,电话号码排序,问题是这样的,给你大约1000万个
  • wdgxwzz008
  • wdgxwzz008
  • 2014-11-12 15:44
  • 394

《编程珠玑》第二章2.1 二分查找不存在的数

《编程珠玑》第二章2.1的三个问题中,有个问题是这样的:          给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数(在文件中至少缺失一个这样的数——为...
  • yz171329935
  • yz171329935
  • 2013-01-10 22:13
  • 399
    个人资料
    • 访问:14904次
    • 积分:392
    • 等级:
    • 排名:千里之外
    • 原创:27篇
    • 转载:2篇
    • 译文:0篇
    • 评论:0条
    GitHub
    https://github.com/codercuixin