编程珠玑学习笔记(1):简单磁盘文件数据排序
来源:互联网 发布:温庭筠入骨相思知不知 编辑:程序博客网 时间:2024/05/22 04:46
问题描述:
输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=10**7。如果在输入文件中有任何整数重复出现就是致命错误。没有其他数据与该整数相关联。
输出:按升序排列的输入整数的列表。
约束:最多有(大约)1MB的内存空间可用,用充足的磁盘存储空间可用。运行时间最多几分钟,运行时间为10秒就不需要优化了。
算法思想: 用位图或者位向量表示集合。
例如可以用一个20位长的字符串来表示一个所有元素都小于20的简单非负整数集合。可以用如下字符串表示集合{1,2,3,5,8,13};
0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0
在上述问题中,7位十进制整数表示一个小于1000万的整数,可以使用一个具有1000万个位的字符串来表示这个文件,其中,当且仅当整数i在文件中存在时,第i位为1.
位图法
//伪代码
//初始化集合
for i = [0,n)
bit[i] =0
//将出现的元素插入到集合中
for each i in the input file
//输入排序了的元素
for i = [0,n)
if bit[i] == 1
write i on the out put file
位向量法
#define BITSPEWORD 32
#define SHIFT 5
#define MASK 0x1F
#define N 10000000
int a[1+(N-1)/BITSPEWORD]
//书中为a[1+N/BITSPEWORD] 当N能被BITSPEWORD整除时,会浪费1个int的空间
//不被整除时,最多是最后一个int的空间没有被完全利用而已
void set (int i)
{
// i >> SHIFT 将 i 定位到哪一个 int 中去 实际上等于 i / 32
// i & MASK 只保留了i 的 0 至 4 位,相当于 i % 32 ,然后把 1 左移这么多位,定位到相应的 int 中所对应的那一位
a[ i >> SHIFT ] |= (1<<( i & MASK) ) ;//位设置
}
void clr(int i)
{
a[ i >> SHIFT ] &= ~ (1<<( i & MASK) ) ;//清零
}
int test (int i)
{
return a[ i >> SHIFT ] & (1<<( i & MASK) ) ;//同1做与,结果为0则原位为0,不为0则原位为1
}
- 编程珠玑学习笔记(1):简单磁盘文件数据排序
- 编程珠玑开篇--磁盘文件排序问题
- 编程珠玑开篇--磁盘文件排序问题
- 编程珠玑开篇--磁盘文件排序问题
- "编程珠玑" 第一章 磁盘文件排序问题
- 磁盘排序(编程珠玑第一章)
- 编程珠玑开篇2--磁盘文件排序问题再讨论
- 位图排序概要 编程珠玑(第一章)-----学习笔记
- 编程珠玑学习笔记1
- 编程珠玑笔记--排序
- 编程珠玑——磁盘排序算法1
- 编程珠玑学习笔记
- 编程珠玑学习笔记
- 编程珠玑_磁盘中无重复大量整数数据排序限制内存借助位图
- 【编程珠玑】学习笔记4——排序
- 位图排序——《编程珠玑》学习笔记
- 编程珠玑-如何给10^7个数据量的磁盘文件排序
- 编程珠玑-如何给10^7个数据量的磁盘文件排序
- hdu - 2095 - find your present (2)(异或)
- erlang lists:keyfind的一个小坑
- 执着女股民:20年炒一只股票 翻几十倍很轻松
- iOS NSNotification的使用 (又学一遍,还有n遍)
- WCF开发实战(一)---创建服务器类
- 编程珠玑学习笔记(1):简单磁盘文件数据排序
- ios设备版本更新
- 关于单片机串口原理
- iOS开发new与alloc/init的区别
- 关于si4438以往犯的一些错误
- iOS-UITableviewCell的重用机制
- u-boot移植启动流程详细分析(2)
- 2014东北农大校赛--A. Paint it! (预处理)
- hdu 2119 Matrix 行列匹配