编程珠玑中 “位矢量法”的应用
来源:互联网 发布:上虞司法淘宝拍卖 编辑:程序博客网 时间:2024/05/12 19:04
位图法是《编程珠玑》第一章中出现的磁盘排序算法。
题目:一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7,且所有正整数都不重复。求如何将这n个正整数升序排列。
约束:最多有1MB的内存空间可用,有充足的磁盘存储空间。
分析:这个题目的最大亮点是只有1MB的内存空间,我们可以通过计算得出,内存只有1MB可以储存的int(4byte)有10^3*10^3/4=250 000个号码。而包含正整数的文件约为10^7个int大小。这意味着无法将所有文件中的正整数一次读取进入到内存空间中去进行排序算法。
思路:
用位图法解决问题本题。
0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0
我们可以使用具有10^7位的字符串来表示这个文件。其中,当且仅当整数i在文件中存在时候,第i位为1
本例中 自己尝试用 int数组 (很多人用 字符串存储,还不知道 具体的优势在哪块,希望高手指点)存储相应的映射位,最后通过检查相应位 来完成排序。
题目:一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7,且所有正整数都不重复。求如何将这n个正整数升序排列。
约束:最多有1MB的内存空间可用,有充足的磁盘存储空间。
分析:这个题目的最大亮点是只有1MB的内存空间,我们可以通过计算得出,内存只有1MB可以储存的int(4byte)有10^3*10^3/4=250 000个号码。而包含正整数的文件约为10^7个int大小。这意味着无法将所有文件中的正整数一次读取进入到内存空间中去进行排序算法。
思路:
用位图法解决问题本题。
我们想使用hash映射,将对应的正整数映射到位图集合中。即将正整数映射到bit集合中,每一个bit代表其映射的正整数是否存在。
比如{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
我们可以使用具有10^7位的字符串来表示这个文件。其中,当且仅当整数i在文件中存在时候,第i位为1
本例中 自己尝试用 int数组 (很多人用 字符串存储,还不知道 具体的优势在哪块,希望高手指点)存储相应的映射位,最后通过检查相应位 来完成排序。
具体实现如下:
#include <stdio.h>#include <stdlib.h>#define MASK 0x0001#define NUMBER 10000 //读取的整数个数#define ARRAY_LEN (NUMBER/32+1)//本测试机 int 为 32位int b[ARRAY_LEN];int main(){int n, m, i, k;int temp;FILE *fp;fp = fopen("text.txt","r");if(!fp){printf("open error!");exit(1);}while (fscanf(fp, "%d", &temp) == 1)//读取数据,存在的数据 将对应的bit位置1,例如 11 存在则 bit[11] = 1{n = temp / 32;m = temp % 32;b[n] = b[n] | (MASK<<m);// printf("n = %d, m = %d, b[%d] = %x\n", n, m , n, b[n]);}fclose(fp);for (i = 0; i < ARRAY_LEN; i++)//进行输出{for(k = 0; k < 32; k++){if (b[i] & (MASK<<k)){printf("%d ",i*32+k);}}}return 0;}
另可以做封装函数
void set(int i){b[i>>SHIFT] |= (1<<(i&0x1f));}void clr(int i){b[i>>SHIFT] &= ~(1<<(i&0x1f));}int test(int i){return b[i>>SHIFT] & (1<<(i&0x1f));}
test.txt 中数据格式 :324 334 12 23 45 55....
- 编程珠玑中 “位矢量法”的应用
- 学习《编程珠玑》-位向量/位图的定义和应用
- 《编程珠玑》——学习历程之一(利用位图(位矢量)的思想实现神奇排序)
- 编程珠玑-位存储
- 记录《编程珠玑》中通过位开关来实现排序的方法
- 【编程珠玑】实现位数组
- [珠玑之椟]位向量/位图的定义和应用
- 编程珠玑位逻辑运算实现位向量
- 编程珠玑中问题
- 《编程珠玑》第二章三个问题A---查找40亿个32位整数中缺失的某个整数
- 编程珠玑 第三部分 应用
- 优先队列 (堆的应用)- 编程珠玑
- 【编程珠玑】第二章 二分查找的巧妙应用
- 【编程珠玑】第二章 二分查找的巧妙应用
- 编程珠玑的二分法
- 查找一段文字中最长的重复字串 - 编程珠玑(排过序的后缀数组的应用)
- 查找一段文字中最长的重复字串 - 编程珠玑(排过序的后缀数组的应用)
- 转载:查找一段文字中最长的重复字串 - 编程珠玑(排过序的后缀数组的应用)
- 淘宝店铺一天内收藏人气暴增,一直没有人气的你为何不试试呢?
- 栈应用之二行编辑
- MPI中的函数及关键结构
- c++中far,near区别
- MyBatis的配置文件解析
- 编程珠玑中 “位矢量法”的应用
- storyboard 中获取一个interface builder中得一个视图如何获取?
- 桶排序
- 栈应用之三递归(之一n的阶剰)
- adb uninstall卸载apk文件说明
- IIS7 传大于30M的视频时,出现找不到文件或目录错误的解决办法
- 补丁(patch)的制作与应用
- service unavailable解决方法
- icinga 1.9 添加host