《编程珠玑》看书笔记

临睡前翻看了下《编程珠玑(续)》这本书,看到第一章就被吸引了,性能监视工具这节从计算素数入手。题目是:
打印所有小于1000的素数
简单直白的方法就是,针对每个小于1000的数字n,从2开始到n-1,如果能被任意一个数整除,那它就不是素数。代码如下:

    int prime(int n)
    {
        int i;
        for(i = 2; i < n; i++)
        {
            if(n % i == 0)
                return 0;
        }
        return 1;
    }
    int main()
    {
        int i, n ;
        n = 1000;
        for(i = 2; n <= n; i++)
        {
            if(prime(i))
                printf("%d\n", i);
        }
    }

这里存在可优化的地方,优化的地方就是根本不需要计算到n-1这个大小。因为根据数论的理论,只要求得至多不大于 N 的整型数即可得出这个数是否为素数:
如下为理论证明:
第一,对于一个自然数N,只要能被一个非1非自身的数整除,它就肯定不是素数,所以不
必再用其他的数去除。
第二,对于N来说,只需用小于N的素数去除就可以了。例如,如果N能被15整除,实际
上就能被3和5整除,如果N不能被3和5整除,那么N也决不会被15整除。
第三,对于N来说,不必用从2到N一1的所有素数去除,只需用小于等于√N(根号N)的所有素数去除就可以了。这一点可以用反证法来证明:
如果N是合数,则一定存在大于1小于N的整数d1和d2,使得N=d1×d2。
如果d1和d2均大于√N,则有:N=d1×d2>√N×√N=N。
而这是不可能的,所以,d1和d2中必有一个小于或等于√N。
因此可以只求得 N 之内的数即可判断该数是不是素数:

    int root(int n)
    { return (int) sqrt((float) n);}
    int prime(int n)
    {
        int i, bound;
        bound = root(n);
        for(i = 2; i <= bound; i++)
        {
            if(n % i == 0)
                return 0;
        }
        return 1;
    }
    int main()
    {
        int i, n ;
        n = 1000;
        for(i = 2; n <= n; i++)
        {
            if(prime(i))
                printf("%d\n", i);
        }
    }

可是这个方法还不是特别好,因为求平方根的操作比较耗费时间,因此如果能把这个时间省略就更好了,因此想到了如下办法:

    int root(int n)
    { return (int) sqrt((float) n);}
    int prime(int n)
    {
        int i, bound;
        bound = root(n);
        for(i = 2; i * i <= n; i++)
        {
            if(n % i == 0)
                return 0;
        }
        return 1;
    }
    int main()
    {
        int i, n ;
        n = 1000;
        for(i = 2; n <= n; i++)
        {
            if(prime(i))
                printf("%d\n", i);
        }
    }

是不是很惊喜啊,这样运算速度又快了一步,不过还不是最优的,试想将一个数先判断是否能被2,3,5整除,那么这个数肯定不是素数,这样一下子剔除了好多数,然后只考虑奇数的因子,这样时间上又优化了很多


    int prime(int n)
    {
        int i;
        if(n % 2 == 0)
            return (n==2); //一定要排除2本身这个素数,下同
        if(n % 3 == 0)
            return (n == 3);
        if (n % 5 == 0 )
            return (n == 5);
        for(i = 7; i * i<= n; i += 2)
        {
            if(n % i == 0)
                return 0;
        }
        return 1;
    }
    int main()
    {
        int i, n ;
        n = 1000;
        for(i = 2; n <= n; i++)
        {
            if(prime(i))
                printf("%d\n", i);
        }
    }

这样又优化了很多啊,这本书讲的真实厉害!后面还有的优化就是厄拉多塞筛法
简单介绍一下厄拉多塞筛法。厄拉多塞是一位古希腊数学家,他在寻找素数时,采用了一种与众不同的方法:先将2-N的各数放入表中,然后在2的上面画一个圆圈,然后划去2的其他倍数;第一个既未画圈又没有被划去的数是3,将它画圈,再划去3的其他倍数;现在既未画圈又没有被划去的第一个数 是5,将它画圈,并划去5的其他倍数……依次类推,一直到所有小于或等于N的各数都画了圈或划去为止。这时,表中画了圈的以及未划去的那些数正好就是小于 N的素数。
可以用一个数组保存每个元素,数组下标对应元素,此时对这个数组进行标记,如果为某个数的倍数,就将其标记为0,之后,没有被标记的元素就是素数。


    int num[N]; 
    for (int i = 0; i < N; i++)  
        {  
            num[i] = i;  
        }  

       for (int j = 2; j < N; j++)  
       {  
           if(0 != num[j])  
           {  
               for (int k = 2; k*j < N; k++)  
               {  
                   num[k*j] = 0;  
               }  
           }  
       }  

       for (int n = 0; n < N; n++)  
       {  
           if(0 != num[n])  
           {  
               cout<<" "<<num[n];  
           }  
       }  

其实这还可以继续优化,因为用数组表示每个数,当数组范围较大时,占用内存较多,可以采用位图法降低空间消耗。

通达信行情API是金融数据提供商通达信(TongDaXin)为开发者和金融机构提供的接口服务,用于获取实时及历史的股票、期货、期权等金融市场数据。这个API允许用户在自己的应用程序中集成通达信的数据服务,实现个性化数据分析、交易策略开发等功能。 1. **API基本概念** - **API**:Application Programming Interface,应用程序编程接口,是软件之间交互的一种方式,提供预定义的函数和方法,使得其他软件能够调用特定功能。 - **通达信**:国内知名的金融终端软件提供商,提供股票、期货、基金等市场数据,以及交易服务。 2. **通达信API的功能** - **实时行情**:获取股票、期货、期权等市场的实时报价信息,包括最新价、涨跌额、涨跌幅、成交量等。 - **历史数据**:获取历史交易日的K线数据、分时数据、交易量等信息,支持自定义时间段查询。 - **深度数据**:获取买卖盘口的五档报价和成交量,有助于分析市场买卖意愿。 - **资讯信息**:获取公告、研报、新闻等市场资讯。 - **交易委托**:通过API进行交易下单、撤单等操作,实现自动化交易。 3. **TdxHqApi** - **TdxHqApi** 是通达信行情API的具体实现,它包含了调用通达信数据服务的各种函数和类,如获取股票列表、获取实时行情、获取历史数据等。 - 开发者需要按照API文档的指示,导入TdxHqApi库,然后通过调用相应的函数来获取所需数据。 4. **使用步骤** - **安装**:下载并安装通达信API的SDK,通常包括头文件和动态链接库。 - **初始化**:在代码中实例化API对象,进行连接设置,如服务器地址、端口号等。 - **连接**:连接到通达信服务器,进行身份验证。 - **数据请求**:调用对应的API函数,例如`GetS
内容概要:本文档是一份关于大数据开发的笔试题目集合,涵盖了多个计算机科学领域的知识点。主要内容包括:数组排序算法的应用,如给出了一段不完整的冒泡排序代码示例;二叉树的基本操作,包括普通二叉树的遍历方式(先序遍历),以及针对大规模数据(如一亿个节点)时避免服务器崩溃的优化策略——采用分布式计算思想将单棵大树拆分为多棵小树并行处理;人力资源系统的数据库设计方案,涉及到了员工信息存储所需的字段(如ID、姓名、工资、上级ID、层级)、展示公司内部架构的SQL语句(利用CTE公共表达式或者PL/SQL中的特定语法来构建递归查询),还有统计某个管理者所辖人数的方法论。 适合人群:正在准备大数据相关岗位面试的技术人员,尤其是那些希望加深对数据结构、算法以及数据库设计等方面理解的人群。 使用场景及目标:①帮助求职者熟悉常见的编程技巧与理论知识,提高解决实际问题的能力;②为从事企业级应用开发工作的程序员提供参考案例,以便更好地理解和实施复杂的数据管理和业务逻辑建模任务。 阅读建议:由于文档中包含了多种类型的题目,建议读者按照自己的薄弱环节选择重点复习的内容。对于排序算法部分,应该注意理解各种经典算法的工作机制及其优缺点;对于二叉树的问题,则要掌握不同遍历顺序的特点,并思考如何应对海量数据带来的挑战;最后,在研究HR系统相关的数据库设计时,除了要学会正确地创建表格外,还应学会运用适当的SQL语句来进行高效的数据检索和分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值