第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

大數(shù)據(jù)的位圖是什么?

大數(shù)據(jù)的位圖是什么?

千巷貓影 2018-09-21 15:11:06
大數(shù)據(jù)的位圖是什么?
查看完整描述

1 回答

?
吃雞游戲

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊

題目:對(duì)2G的數(shù)據(jù)量進(jìn)行排序,這是基本要求。

數(shù)據(jù):1、每個(gè)數(shù)據(jù)不大于8億;2、數(shù)據(jù)類(lèi)型位int;3、每個(gè)數(shù)據(jù)最多重復(fù)一次。

內(nèi)存:最多用200M的內(nèi)存進(jìn)行操作。

我聽(tīng)過(guò)很多種類(lèi)似問(wèn)題的解法,有的是內(nèi)存多次利用,有的用到了外存,我覺(jué)得這兩種做法都不是比較好的思想,太慢。由于這個(gè)題目看起來(lái)沒(méi)有對(duì)效率進(jìn)行約束,所以這兩種方法也是對(duì)的,但是我這次提出一個(gè)比較好的算法來(lái)解答此題,如果有更好的做法請(qǐng)趕快跟帖留言,共同討論。希望大神們的加入。。。。。

思想:把200M的內(nèi)存平分,可以開(kāi)兩個(gè)數(shù)組,一個(gè)數(shù)組arr存放一遍不重復(fù)的所有數(shù)據(jù),另一個(gè)數(shù)組arr_2只存放重復(fù)的數(shù)據(jù)。存放方法是對(duì)數(shù)組中的每個(gè)數(shù)據(jù)的位進(jìn)行操作。比如:18這個(gè)數(shù),18/32=0,18就會(huì)對(duì)應(yīng)arr[0]這個(gè)數(shù)組中的某一位,而每一個(gè)數(shù)組元素都是32位組成,18%32=18,也就是說(shuō)arr[0]那個(gè)數(shù)的第18位對(duì)應(yīng)18這個(gè)數(shù)。同樣道理再來(lái)一個(gè)數(shù):43

43/32=1,43%32=11,也就是說(shuō)43對(duì)應(yīng)的是arr[1]中的第11位。只要找到了對(duì)應(yīng)位置,把該位置1,其余位置不變(默認(rèn)為0),遍歷一次數(shù)據(jù),就會(huì)把內(nèi)存中的對(duì)應(yīng)位置1.如果遇到重復(fù)數(shù)據(jù),此時(shí)就會(huì)用到第二個(gè)數(shù)組了,若本次查詢(xún)?cè)撐灰呀?jīng)為1,那么就要把a(bǔ)rr_2這個(gè)數(shù)組中的對(duì)應(yīng)位置1。在輸出的時(shí)候就要同步遍歷兩個(gè)數(shù)組。

輸出:就是一個(gè)反向還原過(guò)程,遍歷內(nèi)存中的每一位,該位對(duì)應(yīng)的有數(shù)組下標(biāo)和所處位,進(jìn)行一次乘、和運(yùn)算就能還原回來(lái)數(shù)據(jù),并依次寫(xiě)入文件或者打印到屏幕上。

廢話(huà)不多說(shuō),直接上代碼,如有問(wèn)題,跟帖討論。

#include <stdio.h>
#include <stdlib.h>
#define NUM 1024*1024 //數(shù)據(jù)占用的內(nèi)存大小,即存儲(chǔ)數(shù)據(jù)的載體
#define N 1024*1024*128 //10測(cè)試正確性可以用10來(lái)測(cè) //數(shù)據(jù)量

unsigned long int arr[NUM];
unsigned long int arr_2[NUM];
unsigned long int temp[N];//本可不必開(kāi)辟這個(gè)數(shù)組的,直接從文件中讀取

int main(){

int i,j,temp_num=0,temp_num_2=0,flag=0;
//清空內(nèi)存
memset(arr,0,sizeof(arr));
memset(arr_2,0,sizeof(arr_2));
//得到數(shù)據(jù),存到數(shù)組中
for(i=0;i<N;i++){
temp[i]=N-i;
temp[i++]=N-i;
}
//下邊這個(gè)循環(huán)是一個(gè)排序過(guò)程,把對(duì)應(yīng)位置1,如果原來(lái)是1,就把另一塊內(nèi)存中的對(duì)應(yīng)位置1
for(i=0;i<N;i++){
if(((arr[temp[i]/32] >> (temp[i]%32)) & 0x00000001) == 1)
arr_2[temp[i]/32] |= (0x00000001<<(temp[i]%32));
arr[temp[i]/32] |= (0x00000001<<(temp[i]%32));
}
printf("\n");

for(i=0;i<NUM && flag<N;i++){
if(arr[i] == 0)
continue;
temp_num=arr[i];
for(j=0;j<32;j++){
if((temp_num&0x00000001) == 0){
temp_num=(temp_num>>1);
}
else if((temp_num&0x0001) == 1){
printf("%d ",(i<<5)+j);
temp_num=(temp_num>>1);
temp_num_2=arr[i];
flag++;
//重復(fù)數(shù)據(jù)的輸出
if((temp_num_2&0x00000001) == 1){
printf("%d ",(i<<5)+j);
flag++;
}

}
}
}
printf("\n");
return 0;
}



查看完整回答
反對(duì) 回復(fù) 2018-10-23
  • 1 回答
  • 0 關(guān)注
  • 885 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)