当前位置:主页 > 论文百科 > 英文数据库 >

coding小世界

发布时间:2017-04-04 16:04

  本文关键词:编程珠玑,由笔耕文化传播整理发布。


本文首发于个人博客之编程珠玑,之后会陆续将博客转移至个人博客,期待与各位的交流

这不是一本具体算法的讲解或者代码编写的教程,但是从书中的字里行间,我们可以学到的是更多的软知识:对编程新的认识、更加发散的思维方式、更严格的代码要求、堪比瑞士军刀的小技巧…… 编程也许入门并不难,但是要想真正成为一名优秀的软件工程师,还是需要很多锤炼。内外兼修,方成大器。

基础篇
  • 第一章 开篇

    首先作者提出一个实际问题:

    如何给磁盘的某个文件排序,更具体来说就是是对一个最多包含1千万条记录,每条记录都是7位整数的文件,而且只有1MB的内存可以使用

    从实际问题中提炼出更明确的数学定义:

    输入:一个最多包含n个整数的文件,每个数都小于n,,其中n=10^7。可以保证输入文件中不存在重复整数
    输出:按升序排列的输入整数的列表
    约束:1MB左右的内存空间,充足的磁盘存储空间。运行时间最多几分钟,控制在10秒内不再需要进一步优化

    考虑一般的解法,直接读入所有的整数,然后进行快排堆排之类的排序,时间复杂度很明显是O(nlogn),但空间复杂度是O(n),即如果n=10^7时,用4个字节的int型存储每个整数,那么需要的空间是(4*107)/210210=38MB,很显然超出了内存限制,而考虑实际n的大小限制和每个整数只会出现一次的限制,而所谓的排序也只是把从文件中的整数按在1-n内出现的顺序输出而已,因此只要对n之内出现的整数做一下标记最后输出标记过的整数就可以了,考虑到这,位向量(也叫位图)就成了比较合适的数据结构的选择,每个位的0、1值表示一个数字是否出现过,实现的时间复杂度为O(n),空间复杂度为O(n),考虑n取最大值10^7时,需要的空间为107/8/210/210=1.2MB,代码实现如下:

    ; void intSort(){ bitset<N> numBits; ifstream = testFile("/Users/smy/temp/data.txt"); string s; int count = 0; while(testFile >> s){ numBits[atoi(s.c_str())-1] = 1; ++count; } testFile.close(); for(int i=0;i<N;++i){ if(numBits[i] == 1){ cout<

      本文关键词:编程珠玑,由笔耕文化传播整理发布。



    本文编号:285794

  • 资料下载
    论文发表

    本文链接:https://www.wllwen.com/wenshubaike/mishujinen/285794.html


    Copyright(c)文论论文网All Rights Reserved | 网站地图 |

    版权申明:资料由用户b2cef***提供,本站仅收录摘要或目录,作者需要删除请E-mail邮箱bigeng88@qq.com