《编程珠玑》(第二版)第一章习题2(用位运算实现位向量)

原创 2016年05月30日 13:56:55

《编程珠玑》第一章提出了一个排序问题,可以用位图或位向量来表示。如可用一个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

代表集合中数字的位都置为1,其他所有的位都置为0。

若给定表示文件中整数集合的位图数据结构,则可以分三个自然阶段来编写程序。第一阶段将所有的位都置为0,从而将结合初始化为空。第二阶段读入文件中的每个整数来建立结合,将每个对应的位都置为1。第三个阶段检验每一位,如果该位为1,就输出对应的整数。伪代码如下:

/*phase 1: initialize set to empty*/
for i=[0,n)
    bit[i]=0
/*phase 2: insert present elements into the set*/
for each i in the input file
     bit[i]=1
/*phase 3: write sorted output*/
for i=[0,n)
     if bit[i]==1
       write i on the output dile
一个字符占一个字节,也就是4个位,但是我们只需要一个位来表示,这样还是会造成浪费。可以用整数数组来模拟位数组。下面是习题2的参考答案,使用位逻辑运算来实现位向量图。

// bitmap.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<iostream>

#define BITSPERWORD 32 //表示一个整型含有32位
#define SHIFT 5
#define MASK 0x1F  //0000000000000000 0000000000011111
#define N 10000000  //表示1000万个整数

using namespace std;

int a[1 + N / BITSPERWORD];//使用整型数组模拟1000万个位的数组

void set(int i){
	//i>>SHIFT相当于i/32,表示该数由第几个整数表示,i&MASK相当于i%32,表示该数在整数中的第几个位
	//1<<(i&MASK)就将该位设为1
	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));
}

int _tmain(int argc, _TCHAR* argv[])
{
	
	int i;
	for (i = 0; i < N; ++i)
		clr(i);
	cout << "输入数据:" << endl;
	while (cin >> i)
		set(i);
	cout << "输出结果:" << endl;
	for (i = 0; i < N; ++i)
	{
		if (test(i))
			cout << i <<" " ;
	}
	cout << endl;
	return 0;
}

实验结果如下:




后记:

输入数据限制在相对较小的范围内,数据没有重复的情况下,可以考虑使用位图来存储数据实现排序。


参考:

http://blog.chinaunix.net/uid-26548237-id-3759520.html

编程珠玑:第二章 啊哈,算法三个问题

一. 三个问题 A:给出一个顺序文件,它最多包含40亿个随机排列的32位整数。        问题:找出一个不在文件中的32位整数。        注意:题目中没有说,这40亿个数是否是含有重复的数据...
  • tangli555
  • tangli555
  • 2016年09月10日 21:55
  • 163

《编程珠玑》(第二版)第一章习题2(用位运算实现位向量)

《编程珠玑》第一章提出了一个排序问题,可以用位图或位向量来表示。如可用一个20位长的字符串来表示一个所有元素都小于20的简单非负整数集合,如集合{1,2,3,5,8,13}可以表示为: 0 1 1 ...
  • yudan_jiangnan
  • yudan_jiangnan
  • 2016年05月30日 13:56
  • 458

编程珠玑——第一章习题解答

1、如果不缺内存,如何使用一个具有库的
  • shuitawuhen
  • shuitawuhen
  • 2014年10月22日 13:07
  • 1546

编程珠玑第二章习题答案

转载自 1、提供单词和词典,找到该单词的所有变位词,可以事先花时间和空间处理下该词典。 因为要查找变位词,事先遍历词典,得到每个单词签名,并建立签名列表,签名列表的每个项包含了该签名的所有...
  • wordwarwordwar
  • wordwarwordwar
  • 2014年10月28日 22:31
  • 591

经典算法题一览

http://www.cnblogs.com/wei-li/p/3318929.html 0. 零基础入门 Coding interview exposed (...
  • poem_of_sunshine
  • poem_of_sunshine
  • 2015年04月04日 21:15
  • 1186

编程珠玑(开篇)--第一章习题

第一题       如果不缺内存,如何使用一个具有库的语言来实现一种排序算法以表示和排序集合? 解答:使用库函数sort,或者使用TreeSet,TreeMap 第二题     如何使...
  • kangaroo835127729
  • kangaroo835127729
  • 2015年04月26日 00:11
  • 1093

编程珠玑第二章习题

1、提供单词和词典,找到该单词的所有变位词,可以事先花时间和空间处理下该词典。 因为要查找变位词,事先遍历词典,得到每个单词签名,并建立签名列表,签名列表的每个项包含了该签名的所有单词。有了这个列表,...
  • chenzujie
  • chenzujie
  • 2013年08月10日 11:57
  • 1855

编程珠玑之第一章:开篇(习题)泛览

习题1.如果不缺内存,如何使用一个具有库的语言来实现一种排序算法以表示排序和集合。 实现1:C++的vector容器sort函数(当然也可以是list, sort): 1 2 3 4 5 ...
  • JohnnyHu90
  • JohnnyHu90
  • 2013年09月14日 16:20
  • 2224

从一个算法题学到的

《编程珠玑》 A题:给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数。      1、在文件中至少存在这样一个数?      2、如果有足够的内存,如何...
  • u013061236
  • u013061236
  • 2016年03月18日 11:05
  • 185

编程珠玑_第二章_啊哈 算法

三个问题: 一、给出一个顺序文件,它最多包含40亿个随机排列的32位整数。        问题:找出一个不在文件中的32位整数。        注意:题目中没有说,这40亿个数是否是含有重复的数...
  • insistGoGo
  • insistGoGo
  • 2012年07月15日 22:20
  • 3044
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《编程珠玑》(第二版)第一章习题2(用位运算实现位向量)
举报原因:
原因补充:

(最多只允许输入30个字)