《编程珠玑》习题练习In Python——第一章 开篇

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

这里写图片描述

问题:如何给磁盘文件排序

输入:一个包含最多n个正整数的文件,每个数都小于n,其中n=10^7。如果在输入文件中有任何整数重复出现就是致命错误。没有其他数据与该数据相关联。
输出:按升序排列的输入整数的列表。
约束:最多有(大约)1MB内存空间可用,有充足的磁盘存储空间可用。运行时间最多几分钟,运行时间为10秒就不需要进一步优化了。

这个问题描述认真看其实是有问题的,正整数小于n最多是只有n-1个而不是n个的。方便起见我们可以把输入要求变为非负数。

在我写的程序中,a数组代表输入,b数组代表输出。文件的读写的代码就没有写了,因为每次从a,b数组读入数据其实等同于对文件的输入输出。另外python本来运行速度较慢,所以输入的数据规模缩小到了10^6。这些关系不大,主要的精力应该放在算法上面。

习题1

使用具有库的语言来实现一种排序算法以表示和排序集合。

使用python build-in 函数:sorted()

a = [3,4,5,2,6,7,5,6,7,89,4,5,6]
a = sorted(a)

习题2

使用位运算来实现位图数据结构。

位图数据结构的一般方法是使用一个数组。当需要置第i位时,判断该位属于数组中的哪个数,以及该数的哪一位

Python中的位运算有:
与 &
或 |
异或 ^
非 ~
左移 <<
右移 >>

Python中数组是不能定义数据类型的,可以使用numpy实现。我使用uint32作为数组中的元素,该类型有32比特位。对于一个需要置位的数 i,将i写成二进制形式,有
xxxx xxxx xxxx
末尾红色的五位,有32种取值,可以用一个uint32的32位表示。前端剩余的位,则表示为位图数组的下标。

BITS_PER_WORD = 32
MASK = 0x1f
SHIFT = 5
def set(i, bitMap):
    bitMap[i >> SHIFT] |= 1 << (i & MASK)
def clr(i, bitMap):
    bitMap[i >> SHIFT] &= ~(1 << (i & MASK))
def test(i, bitMap):
    return (bitMap[i >> SHIFT] & (1 << (i & MASK))) != 0
def create_bitmap(numberSize):
    return  np.zeros(math.ceil(numberSize/BITS_PER_WORD),dtype=np.uint32)
def test_2
编程珠玑习题练习In Python——第三章 数据决定程序结构 本章的主旨是:数据视图决定了程序结构。简单的数据表示可以使用简单高效的程序来处理。好的数据表示是好的程序的前提。正如好的食物原料是做出美味食物的前提。 本章中的编程思路总结: 1、尽量使用数组处理重复数据。 2、定义简单的表示语言和一个语言的解释器来表示复杂的数据结构。 阅读详情

相关推荐

用ICode训练场给孩子做编程启蒙?我用这20个Python例子总结了高效陪玩指南

本文介绍了如何利用ICode训练场通过20个趣味Python编程挑战,帮助孩子进行编程启蒙。从基础操作到双角色协同,再到自主设计关卡,这些互动练习不仅能让孩子掌握编程概念,还能增进亲子关系。ICode平台的游戏化学习方式让编程变得生动有趣。

weixin_30443813的博客 346

编程珠玑课后习题答案 第一章

另一种做法是采用两趟算法,首先使用 5000 000 / 8 = 625 000 个字的存储空间来排序 0 ~ 4 999 999 之间的整数,然后在第二趟排序 5 000 000 ~ 9 999 999 的整数。电话号码的最后两位数字非常接近于随机,因此是非常理想的散列函数,而最前面的两位数字则很不理想——为什么?利用习题 5 的答案,我们可以使用 10 000 000 / 2 个字节在 1 趟内完成对整个文件的排序,或使用 10 000 000 / 2k 个字节在 k 趟内完成对整个文件的排序。

雾隐雾现的至渝博客 878

编程珠玑习题集锦

书的内容围绕程序设计人员面对的一系列实际问题展开。作者Jon Bentley 以其独有的洞察力和创造力,引导读者理解这些问题并学会解决方法,而这些正是程序员实际编程生涯中至关重要的。《编程珠玑(第2)》是计算机科学方面的经典名著。

编程珠玑课后习题答案 第五章 编程小事

我发现建立脚手架的时候使用短名字比较方便,在类似 4.3 节的数学证明中使用短名字也是很必要的。数学上也有类似的法则:对数学不熟悉的人可能希望听到“直角三角形斜边的平方等于两条直角边的平方和”,而处理该问题的人通常会说“a。对于 8.3 节中高度调优过的二分搜索,有序搜索能够在 125 纳秒内搜索包含 n=1000 个元素的表,而随机搜索则需要 266 纳秒的时间,减速因子超过 2。我通常将一系列的相关实验和它们的性能图表存储在同一页电子表格上,并在该页说明为什么做这些实验以及从中能学到什么。

雾隐雾现的至渝博客 532

好玩的珠玑妙算-加作弊带概率空间+日志存储240705mindMaster

珠玑妙算masterMind带计算概率空间 带日志

aw344的专栏 265

编程珠玑课后习题答案 第三章

anc1an−1c2an−2ckan−kck1an​c1​an−1​c2​an−2​...ck​an−k​ck1​斐波那契数列。

雾隐雾现的至渝博客 676

编程珠玑第一章习题9

对于十分稀疏的数组,按照数组下标值存入和读取数组元素。当读取数组元素时,如何不需要初始化就能判断该值是存入的还是脏数据,就需要用到下面的方法,用空间换时间。 如果不用这个方法,必须对数组初始化,然后判断读取的值跟初始化值的区别,来确定该值是否是存入值。但当数据十分稀疏时,初始化过程会浪费大量的时间。 一个自然的想法就是能不能用一个数组记录下已经初始化的位置,这就是to【N】数组的作用。按照初始

dawn_cx的专栏 757

编程珠玑习题练习In Python——第二章 啊哈!算法

programming pearls!

vincent_hbl的博客 1024

编程珠玑 | 提升编程技巧与解题思维的经典之作

例如,在Java开发中,使用Java自带的JDK编译器是最常见的选择,它能够将Java代码编译成字节码,并能通过JVM实现跨平台的运行。作为经典的编程书籍之一,编程珠玑的价值在于其不仅讲解了常见的编程题目,还揭示了许多程序员在实际开发中可能遇到的难题。书中的每个章节都以高质量的算法题为主线,通过深入的分析与细致的讲解,帮助读者更好地理解背后的编程原理和思想。每一道题目不仅考察读者的编程能力,更考察其思维的深度和广度。通过它,你可以更加深入地理解编程的精髓,掌握更为高效的编程技巧,并在编程的道路上走得更远。

fhnqzg_972的博客 306

编程珠玑之第三章习题3-4

如果使用我编写的时间模块计算得到的答案和python自带的时间模块得到的答案相同,那么说明我编写的代码没有问题。4.编写处理如下日期的函数:给定两个日期,计算两者之间的天数;Calendar用于处理日期与日期之间关系,并对日期做出更为复杂的处理。我们从年份的角度入手,上图可以划分为三块:d1所在年份,中间年份,d2所在年份。弄清楚这一点后,创建数组时,添加额外的元素,直到月初第一天排序到正确的下标,表示正确的星期几即可。计算天数的时候,需要将闰年因素考虑进去,也就是对最终计算结果增加。

qq_62835094的博客 1062

Programming pearls 编程珠玑的题目

Programming pearls 编程珠玑的题目 这段时间有空都在看编程珠玑,很经典的一本书,一边看一边用 python 做上面的题目,我做的都放到 github 上了 https://github.com/fengyc/programming-pearls-2nd-python编程珠玑这书有段历史了,上面有些概念估计现在的学生听都没有听过,像磁带排序、3n+1问题等估计有些人听都没有听过...

weixin_30666943的博客 132

编程珠玑》笔记一

编程珠玑笔记 第一章开篇 友好的对话 在别人不会问问题时,引导他去问问题也是一个很大的学问,Jon与一个程序员问的问题而展开。 问题:如何将1千万条记录排序?(都是七位的电话号码)最好是将时间控制在十秒钟左右,如果不行,几分钟也可以,但是不能超过十分钟,同时不可超过一兆的内存。 Jon先生要求我思考一分钟,并给他一个答案。我的答案有两个,一是使用链表的方式,运用插入排序的方法,二是使...

张念磊的博客 589

编程珠玑 第二章 习题 2 给定一个包含4300000000个32位证书的顺序文件,求出一个至少包含两次的整数

解:

lqsohu的专栏 806

珠玑妙算游戏

珠玑妙算游戏(the game of master mind)的玩法如下。 计算机有4个槽,每个槽放一个球,颜色可能是红色(R)、黄色(Y)、绿色(G)或蓝色(B)。例如,计算机可能有RGGB 4种(槽1为红色,槽2、3为绿色,槽4为蓝色)。作为用户,你试图猜出颜色组合。打个比方,你可能会猜YRGB。要是猜对某个槽的颜色,则算一次“猜中”;要是只猜对颜色但槽位猜错了,则算一次“伪猜中”。注意,“猜中”不能算入“伪猜中”。 给定一种颜色组合solution和一个猜测guess,编写一个方法,返回猜中和伪猜

IT之一小佬的博客 676

编程珠玑》和《梦断代码》(部分) 读书笔记

这周我阅读了《编程珠玑》和一部分《梦断代码》,将感想和收获记录于下。 《编程珠玑》是一本小而精巧的书,它讲了很多与编程、沟通、软件工程相关的知识,对我大有启发。书一开始讲了一个程序员求助的故事。那个程序员要做一些和排序相关的业务,于是向高手求助,但花了整整30分钟才把问题描述清楚。他之前以为这个问题需要写很多代码,需要花整整一个周去维护,但当他把问题描述清楚后,高手给出了一个...

weixin_30876945的博客 154

编程珠玑 第一章 位图排序算法python实现

编程珠玑 第一章 位图排序算法python实现 # 有一组数字,从1到n(此例子假设n=10),乱序且不存在重复的数字。例如:[8,9,2,3,6,1,4,5,7,10]。从中任意删除了3个数,顺序也再次被打乱,将这些剩余数字放在一个n-3的数组里,请找出丢失的数字,要求算法比较快 def bitmap(): n = 10000000 oldArr = [1, 2] for...

如果少年的博客 438

编程珠玑(第2第一章课后习题答案

第一章 开篇1.#include &lt;iostream&gt;#include &lt;set&gt; // 输入相同元素在集合内只保留一个using namespace std;int main(){        set&lt;int&gt; S;        int i;        set&lt;int&gt;::iterator j;        while( cin &gt;...

weixin_33834137的博客 121

编程珠玑》读书笔记(一)

编程珠玑》(第二)第一部分主要是讲基础 第一章 开篇: 本章主要解决的问题是“在内存不足的情况下,如何对数据进行排序”,提出了两种解决方法:归并排序和位图排序。 归并排序:     思想是每次将两个有序表合成一个长的有序表,程序一般用递归来实现,时间复杂度是O(nlogn),需要O(n)的空间复杂度,稳定。 位图排序

qianqiang1989的专栏 191
上一篇: 《代码大全2》读书笔记——变量篇
下一篇: Linux 我的常用命令总结
行_之_
博客等级 码龄10年 50粉丝 27原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值