数组中寻找第K小的数----位图法(bitmap)
来源:互联网 发布:遗传算法的基本步骤 编辑:程序博客网 时间:2024/05/01 12:28
(1)位图法
所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的(百度百科)。
例如:对{0, 1, 5,3, 7}进行排序,可以在计算机中使用8位表示这几个数,也就是使用一个字节空间可以完成排序。
数组中的数: 0 1 3 5 7
bitmap中的位值: 1 1 0 1 0 1 0 1 //若在数组中,则位值设为1,否则为0
bitmap中的位标号: 0 1 2 3 4 5 6 7
位图法还可以判断数组中值是否重复出现。位图法在降低了时间复杂度的同时,很好的控制了空间复杂度。
(2)算法实现(分为 针对无符号数组 及 有符号数组)
A:针对无符号数组实现:
#include <stdio.h>#include <string.h>#include <iostream>using namespace std;void set_bit(char *bit_map, int n){for(int i=0; i<(n/8); ++i)bit_map++;//相应表示的位置1*bit_map =(*bit_map) | (0x01<<n%8);}int get_max_value(int num[], int n){ int temp = num[0]; for(int i=1; i<n; ++i) { if(num[i]>temp) temp = num[i]; } return temp;}void bit_map_sort(int num[], int n){//首先得到数组中的最大值int max = get_max_value(num, n);//计算bitmap的长度,每一个字节可以表示8个数int bit_map_len = 0;if(max%8 == 0) bit_map_len = max/8;else bit_map_len = max/8+1;//创建bitmapchar* bit_map = new char[bit_map_len];memset(bit_map, 0, bit_map_len);for(int i=0; i<n; ++i)set_bit(bit_map, num[i]);//输出数组for(int i=0; i<bit_map_len; ++i){for(int j=0; j<8; ++j){//如果该位是1,则输出if((bit_map[i]&(0x01<<j)) == (0x01<<j))cout<<(i*8+j)<<" ";}}cout<<endl;}int main(){ int num[] = {3,5, 2, 10, 6, 9999999, 8, 14, 9}; bit_map_sort(num, 9); return 0;}
B:针对有符号数组(数组中存在负数)
#include <stdio.h>#include <string.h>#include <iostream>using namespace std;//从bitmap中间开始计算,左边表示负数,右边表示正数void set_bit(char *bit_map_mid, int num){//若为正数,则指针右移if(num >= 0) for(int i=0; i<(num/8); ++i)bit_map_mid++;//反之,指针左移if(num < 0){ num = -1*num; for(int i=0; i<(num/8); ++i)bit_map_mid--; bit_map_mid--;}//相应表示的位置1*bit_map_mid =(*bit_map_mid) | (0x01<<num%8);}//得到数组中绝对值最大的值int get_max_absolute_value(int num[], int n){ int temp = 0; for(int i=0; i<n; ++i) { if(num[i]>temp) temp = num[i]; else if(num[i]<0) if((num[i]*(-1))>temp) temp = num[i]*(-1); } return temp;}void bit_map_sort(int num[], int n){//首先得到数组中的最大值int max = get_max_absolute_value(num, n);//计算bitmap的长度,每一个字节可以表示8个数int bit_map_len = 0;if(2*max%8 == 0)//若最大值为16,则其bitmap应该能表示[-16, 16],所以乘以2; bit_map_len = 2*max/8;else bit_map_len = 2*max/8+1;//创建bitmapchar* bit_map = new char[bit_map_len];memset(bit_map, 0, bit_map_len);int mid = bit_map_len/2;for(int i=0; i<n; ++i)set_bit(bit_map+mid, num[i]);//首先输出负数for(int i=0; i<mid; ++i){for(int j=0; j<8; ++j){//如果该位是1,则输出if((bit_map[i]&(0x01<<j)) == (0x01<<j))cout<<(-1)*((mid-1-i)*8+j)<<" ";}}for(int i=mid; i<bit_map_len; ++i){for(int j=0; j<8; ++j){//如果该位是1,则输出if((bit_map[i]&(0x01<<j)) == (0x01<<j))cout<<(i-mid)*8+j<<" ";}}cout<<endl;}int main(){ int num[] = {3,5, 2, 10, 6, -999999, 8, -14, 9};bit_map_sort(num, 9);return 0;}
- 数组中寻找第K小的数----位图法(bitmap)
- 数组中寻找第K小的数----位图法(bitmap)
- 寻找两个有序数组的第k小的数
- 两个有序数组,寻找第k小的数
- 寻找数组里第K 小的数
- 寻找数组中第i小的数(C++)
- 数组中第k小的数
- 数组中第K小的数
- 两个有序数组中,寻找第K大的数
- 寻找数组中第k大的数
- 寻找无序数组中第k大的数
- 寻找数组中第k大的数
- 寻找数组中第k小元素
- 寻找单个无序数组中第K小的数字
- 第k大(小)数,寻找最小的k个数(进一步要求顺序与原数组中元素顺序一致)
- 寻找第K小的数
- 寻找第K小的数
- 寻找第K小的数
- HDU 1194 Beat the Spread!
- 进程,线程之间的关系
- Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)
- VC2010的/DYNAMICBASE链接选项问题
- 输出星号图03
- 数组中寻找第K小的数----位图法(bitmap)
- js实现各种排序算法
- js验证表单大全
- Json lib 抛出 NestableRuntimeException
- xml约束
- 开关机的action
- 以太网接口基础概念
- 堆 栈 堆栈
- Tomcat构建WEB站点