位图排序示例

第0行

第1行(32-63),依次类推。

C++代码如下:

/** @file          Bitmap

*  @copyright     personal

*  @brief         接口头文件

*  @version       v1.0.0

*  @author        fangyuan

*  @date          2015/10/20

*  @note          测试版本

*/

#include "iostream"

#include <math.h>

#include "vector"

#define INT_BYTES sizeof(int)                                    //int型所占字节

#define INT_BITS (8*INT_BYTES)                                   //int型所占位数

#define MAXNUM (1024*1024*1024)                                  //最大数

#define SHIFT_BIT (int)(log(double(INT_BITS))/log(double(2)))    //最大移位数,左移一位等价于*2,即最大^SHIFT_BIT

#define MASK (INT_BITS-1)                                       //根据int类型变化,一般为31

using namespace std;

//int bitmap[MAXNUM/INT_BITS];        //超出数组范围定义

vector<int> bitmap(MAXNUM/INT_BITS);  //自动初始化为,若非C++,可自定为list;

void set(int i)

{

//i>>SHIFT_BIT等价于i/INT_BITS,i & MASK等价于i%MASK,取余的分母一般为^n-1

bitmap[i>>SHIFT_BIT] |= 1<<(i & MASK);  //当前位,置为1,再进行或运算

}

//获取第i行,第j列

bool get(int i,int j)

{

//return (bitmap[i>>SHIFT_BIT] & 1<<(i & MASK));

return (bitmap[i] & 1<<(j & MASK));

}

int main()

{

set(2);

set(3);

set(50000000);

set(100);

set(50);

//不按数字遍历,按行遍历,减少遍历次数

for(int i = 0; i < bitmap.size(); ++i)

{

if( !bitmap[i] )

{

continue;

}

for(int j = 0; j <= MASK;++j)

{

bool result = get(i,j);

if(result)

{

cout << i*INT_BITS+j << endl;

}

}

}

system("pause");

return 0;

}

时间: 2024-10-10 14:30:47

位图排序示例的相关文章

位图排序

在<编程珠玑>上看到的,开篇第一个问题,有很多数,小于一个MAXNUM,没有重复的,怎么排序最快. 答案是位图排序. 如果某一位不为0,那么这一位存代表一个数,位数(在序列中的位置)代表这个数. 比方说这些数都存在数组a,然后利用一个数组b,b初始状态各位都为0,然后读取a,如果a[1]=2,那么b[2]为1,a[3]=6,那么b[6]=1. 实现如下: 1 #include <iostream> 2 #include <fstream> 3 #include<s

[数据结构]利用位图排序

[cpp] view plaincopy #include <stdio.h> #include <stdlib.h> #define INT_BY_BIT 32 #define MASK 0x1F #define SHIFT 5 #define N 1000000 int a[N/INT_BY_BIT+1]; void set_bit(int x) {a[x>>SHIFT] |= 1 << (x & MASK);} void clear_bit(i

【每日算法】计数&amp;基数&amp;桶&amp;位图排序-简介

在前面的文章中,我们介绍的都是基于比较的排序. 对于比较排序,对含n个元素的序列进行排序,在最坏情况下都要用O(n logn)次比较(归并排序和堆排序是渐近最优的). 本文将继续介绍以线性时间运行的排序算法,他们使用的是非比较排序,因此下界O(n logn)对它们不适用. 计数排序 想象下面这种情况: 一个班有k个人,需要排成一条纵队,地面上已经用粉笔按从小到大的顺序标明了1到k个号码,要求按身高从低到高排列,也就是说,最高的站在标号为k的位置,最矮的站在标号为1的位置. 那么对于每个人,如何知

计数排序与位图排序

计数排序(Counting sort)是一种稳定的线性时间排序算法.计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数.然后根据数组C来将A中的元素排到正确的位置.计数排序不是比较排序,排序的速度快于任何比较排序算法.由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存.计数排序更适合于小范围集合的排序.比如100万学生参加高考,我们想对这100万学生的数学成绩(

位图排序(位图技术应用)

1.  问题描述 给定不大于整数 n 的 k 个互不相等的整数 ( k <n ) , 对这些整数进行排序.本文讨论的内容具体可参见<编程珠玑>(第二版)的第一章. 2.  问题分析 关于排序,已经有多种排序方法了:插入排序,归并排序,快速排序,希尔排序等.每种排序都有不同的用武之地.为什么需要位图排序呢?所有的内部排序(上述所提及)都必须一次性将所有排序元素载入内存.假如有1000,000个整数,每个整数4字节,则意味着,至少需要4000,000B 约为 4MB 的内存空间, 如果仅仅只

【算法思想】位图排序算法

问题的提出 一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7.假设最多只有1M的内存空间可用,在考虑空间和时间的优化的情况下,请问如何对其进行排序? 常规思想 我们假设这些整数都是用整型存储(一般整型的大小为4个字节),那么1M字节可以存储250 000个数据.由于输入文件最大可能有10^7个数据,因此可以通过遍历输入文件40次来完成排序.第一次将在[0,249 999]范围内的整数读入到内存中,第二次将在[250 000,499 999]范围内的整数读入到内存中,依此类推.每读入

java按照集合中元素的属性进行排序示例代码

public class Student { private String name; private int age; private int id; public Student() {  super(); } public Student(String name, int age, int id) {  super();  this.name = name;  this.age = age;  this.id = id; } public String getName() {  retur

Go语言实现位图排序

Go语言提供了byte类型,一个byte对应8个位,所以转换一下就可以实现位图了. 代码: package main //author:xcl //date:2014-1-25 import ( "fmt" ) func main() { arrInt32 := [...]uint32{5, 4, 2, 1, 3, 17, 13} var arrMax uint32 = 20 bit := NewBitmap(arrMax) for _, v := range arrInt32 { b

位图排序思想及代码详解

输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7.如果在输入文件中有任何重复整数出现就是致命错误.没有其他数据与该整数相关联 输出:按升序排列的 输入整数的列表. 约束:最多有(大约)1MB的内存空间可用,有充足的磁盘存储空间可用.运行时间最多几分钟,运行时间为10秒就不需要进一步优化了.          从0开始解决这个问题的话,可以把它分为两个部分:首先随机生成K个小于N的数:再对这K个数排列.          系统参数:GCC:#pragma pack(4)