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

本文通过Python解决《编程珠玑》第一章的排序问题,涉及位图数据结构、排序算法和内存限制。讨论了如何在内存有限的情况下,使用位图对大量整数进行排序,并探讨了处理重复数、多个数据区段和输入合法性检查的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述

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

输入:一个包含最多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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值