題目是:乙個檔案中有40億個整數,每個整數為四個位元組,記憶體為1gb,寫出乙個演算法:求出這個檔案裡的整數裡不包含的乙個整數
演算法一:分配512mb記憶體,每一bit代表乙個整數,測試程式(vc6)如下:
//乙個
bit代表乙個數,實際上只需要
4096/8=512
兆的記憶體空間(即
(4096/32)*1024*1024
個整數陣列)
//unsigned long p[(4096/32)*1024*1024];//
棧預設不允許分配這麼大的空間!!
bool
bfound
= false;
unsigned
long*p
,lresult
;
p= newunsigned
long
[(4096/32)*1024*1024];
//這裡堆分配這麼大會較慢,約
20秒,但可以完成
//初始化記憶體,如果記憶體小,這句會很慢
memset(p
,0,(4096/8)*1024*1024);
//直接讀檔案的辦法:分段讀入檔案內容,把讀入的內容
4個位元組一組當無符號整數處理
//注意檔案中的整數可能會重複,並且沒有順序排列
/*file* stream = fopen("c://skinppdemo-vc.msi", "r");
if (stream)
fclose(stream);
}*///以下使用記憶體對映的方法:由於檔案有
16g那麼大,一次全對映也是不行的,要分多次
hfile
hfile
;
ofstruct
opbuf
;
handle
hmapfile
;
handle
hmapview
;
byte
*recv
;
hfile
=openfile
("c://skinppdemo-vc.msi"
,&opbuf
,of_read
);
if (
hfile
==hfile_error
)
dword
dwsizelow
, dwsizehigh
;
dwsizelow
= getfilesize
((handle
)hfile
, &dwsizehigh
);
hmapfile=((
handle
)hfile
,null
,page_readonly
,0,0,
"maptest"
);
if(hmapfile
==null
|| dwsizelow
== 0)
closehandle
((handle
)hfile
);
hfile
=0;
for(unsigned
long
l=0;
l<=
dwsizehigh;l
++)
recv
=(byte
*)hmapview
;
byte
*cur
=recv
;
long
lsize
= ((
lreadtimes
- 1 >
j) ?
read_size_every_time
: (dwsizelow
%read_size_every_time
));
while ( (
cur-
recv
) < (
lsize
- 3))
unmapviewoffile
(hmapview
);
} }
//完成後,掃瞄一下陣列
p,找到第乙個不存在的數
for(unsigned
long
i=0;
i<(4096/32)*1024*1024;
i++)}}
if (
bfound
)
break;
}delete p;
注:如果直接用new申請動態記憶體,由於記憶體高達512兆,會很容易被交換到頁面檔案上去,效率會急劇下降,所以建議把記憶體申請在物理記憶體上,請參考virtualalloc和mapuserphysicalpages(需要sdk)等的使用
筆試題 騰訊基礎研究方向
編輯公式不方便,需要公式可自己上網查,這裡只給形象的概念幫助記憶。1.數學問題 3sigma原理,t分布,特徵根,特徵值,最大似然估計,馬爾科夫鏈。1 3sigma原理 在正態分佈中 代表標準差,代表均值x 即為影象的對稱軸,三 原則即為 數值分布在 中的概率為0.6526 數值分布在 2 2 中的...
筆試題目 騰訊2023年9月基礎研究筆試題
第一題 進行特徵選擇時,即分析哪些協變數對目標變數有較大影響時,有哪些常用的方法?你本人更看好其中哪些?為什麼?第二題 網路上流傳乙個故事,關於資料的神奇性 某商場向一位未婚少女郵寄一些用於保胎的商品目標和折扣券,其父親發火,後證實該少女確實懷孕,解釋一下如何做到的?個人從一下幾個方面答的,可能存在...
騰訊的遞迴筆試題目
題目是這樣的 f m,n m n 1 if m n 0 f m,n f m 1,f m,n 1 填空是 top 0 do elsewhile 1 top printf f d n f 解答過程 這是一道遞迴題目,說實話,第一次看到這種遞迴題目,還是感覺比較害怕,畢竟 f m,n f m 1,f m,...