国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

算法通關(guān)村第十五關(guān)——從40億個數(shù)中產(chǎn)生一個不存在的數(shù)的處理方法

這篇具有很好參考價值的文章主要介紹了算法通關(guān)村第十五關(guān)——從40億個數(shù)中產(chǎn)生一個不存在的數(shù)的處理方法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1.從40個億中產(chǎn)生一個不存在的整數(shù)

題目要求:給定一個輸入文件,包含40億個非負(fù)整數(shù),請設(shè)計一個算法,產(chǎn)生一個不存在該文件中的整數(shù),假設(shè)你有1GB的內(nèi)存來完成這項任務(wù)。****

解題中心思想:存儲的不是這40億個數(shù)據(jù)本身,而是其對應(yīng)的位置。

本題不用寫代碼,能把方法過程說清楚就可以。

1.1 位圖存儲大數(shù)據(jù)的原理

方法8 bit1B,一個32位整數(shù)需要4B的存儲空間,40億個數(shù)就是 40億 * 4B,約為16GB,用位圖來做的話會更節(jié)省空間,因為位圖的每個位置只能用0或1進(jìn)行狀態(tài)表示,這樣就只需要40億 / 8 = 5億字節(jié),也就是大約500M的存儲空間。

過程:具體來做就是先遍歷這40億個數(shù),并把遍歷的每個數(shù)在位圖上的相對位置設(shè)置為1。這40億個數(shù)遍歷結(jié)束后,開始遍歷位圖,看看哪個位置上的狀態(tài)為0,就說明這個位置對應(yīng)的數(shù)沒有在40億個數(shù)中出現(xiàn),位圖遍歷結(jié)束后就能得到所有未在40億個數(shù)中出現(xiàn)過的數(shù)。

1.2 使用10MB來存儲呢?

如果使用10MB來存儲,位圖也搞不定了,這個時候就得使用分塊思想,用時間換空間,通過兩次遍歷來處理。

40億個數(shù)需要約500MB的空間,如果只有10MB的空間,至少需要50個塊才可以。一般劃分塊都使用2的冪次方的整數(shù)倍,此處劃分為64個塊是合理的。

首先將 0 ? 2 32 0-2^{32} 0?232 這個范圍的數(shù)平均分成64個區(qū)間,每個區(qū)間是67 108 864個數(shù),因為一共只有40億個數(shù),所以在統(tǒng)計每一個區(qū)間上的數(shù)有多少時,肯定會有至少一個區(qū)間上的計數(shù)小于67 108 864。利用這一點可以找出其中一個沒出現(xiàn)過的數(shù)。具體過程如下:

第一次遍歷:先申請長度位64的整型數(shù)組countArr[0, ..., 63],countArr[i]用來統(tǒng)計區(qū)間i上的數(shù)有多少。遍歷40億個數(shù),跟去當(dāng)前數(shù)是多少來決定哪一個區(qū)間上的計數(shù)增加。比如,如果當(dāng)前數(shù)為2 567 278 189,2 567 278 189 / 67 108 864 = 38 ,所以第38個區(qū)間上計數(shù)增加countArr[51]++。遍歷完40億個數(shù)之后,遍歷countArr,必然會有某一個位置上的值(countArr[i])小于67 108 864,表示第i區(qū)間上至少有一個數(shù)沒出現(xiàn)過。

此時使用的內(nèi)存是非常小的,是countArr的大?。?4 * 4B)

假設(shè)找到第37區(qū)間上的計數(shù)小于67 108 864,那么對這40億個數(shù)據(jù)進(jìn)行第二次遍歷:

  1. 申請長度為67 108 864的位圖(bit map),占用大約8MB的空間,記為bitArr[0, ... , 67108863]。
  2. 遍歷這40億個數(shù),此時的遍歷只關(guān)注落在第37區(qū)間上的數(shù),記為num(num滿足 num / 67108864 = == 37),其他區(qū)間的數(shù)全部忽略。
  3. 如果步驟2的num在第37區(qū)間上,將bitArr[num - 67108864 * 37]的值設(shè)置為1,也就是只做第37區(qū)間上的數(shù)的bitArr映射。
  4. 遍歷完40億個數(shù)之后,在bitArr上必然存在沒被設(shè)置成1的位置,假設(shè)第i個位置上的值沒被設(shè)置成1,那么67108864 * 37 + i這個數(shù)就是一個沒出現(xiàn)過的數(shù)

步驟小結(jié):

  • 根據(jù) 10MB 的內(nèi)存限制,確定統(tǒng)計區(qū)間的大小,就是第二次遍歷時的 bitArr 大小。
  • 利用區(qū)間計數(shù)的方式,找到那個計數(shù)不足的區(qū)間,這個區(qū)間上肯定有沒出現(xiàn)的數(shù)。
  • 對這個區(qū)間上的數(shù)做 bit map 映射,再遍歷bit map,找到一個沒出現(xiàn)的數(shù)即可。

1.3 如何確定分塊的區(qū)間

上面的例子中,采用兩次遍歷,第一次將數(shù)據(jù)分成64塊剛好解決問題,為什么不是128塊,32塊,16塊或者其他塊數(shù)呢?

這是主要為了保障第二次遍歷時每個塊都能放進(jìn)這10MB的空間中。 2 23 < 10 M B < 2 24 2^{23} < 10MB < 2^{24} 223<10MB<224,而 2 23 = 8388608 2^{23} = 8388608 223=8388608 大約是8MB,也就是說我們一次的分塊大小只能為8MB左右。我們在第二次遍歷時分成64塊剛好滿足要求,這是最少得分成64塊,當(dāng)然如果分成128塊、256塊也是可以的。文章來源地址http://www.zghlxwxcb.cn/news/detail-709227.html

到了這里,關(guān)于算法通關(guān)村第十五關(guān)——從40億個數(shù)中產(chǎn)生一個不存在的數(shù)的處理方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 算法通關(guān)村第十八關(guān)——排列問題

    LeetCode46.給定一個沒有重復(fù)數(shù)字的序列,返回其所有可能的全排列。例如: 輸入:[1,2,3] 輸出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 元素1在[1,2]中已經(jīng)使用過了,但是在[2,1]中還要再使用一次,所以就不能使用startlndex了,為此可以使用一個used數(shù)組來標(biāo)記已經(jīng)選擇的元

    2024年02月09日
    瀏覽(22)
  • 算法通關(guān)村第十七關(guān)——跳躍游戲

    leetCode55 給定一個非負(fù)整數(shù)數(shù)組,你最初位于數(shù)組的第一個位置。數(shù)組中的每個元素代表你在該位置可以跳躍的最大長度,判斷你是否能夠到達(dá)最后一個位置。 示例1: 輸入:[2,3,1,1,4] 輸出:true 解釋:從位置 0 到 1 跳 1 步,然后跳 3 步到達(dá)最后一個位置。 示例2: 輸入:[3

    2024年02月10日
    瀏覽(20)
  • 算法通關(guān)村第十九關(guān)——最小路徑和

    算法通關(guān)村第十九關(guān)——最小路徑和

    LeetCode64. 給定一個包含非負(fù)整數(shù)的 m × n 網(wǎng)格 grid,請找出一條從左上角到右下角的路徑,使得路徑上的數(shù)字總和為最小。 輸入:grid=[[1,3,1],[1,5,1],[4,2,1]] 輸出:7 解釋:因為路徑1→3→1→1→1的總和最小。 對于每一塊方塊來說,只能從他的上邊或者左邊走過來,所以在for循環(huán)中

    2024年02月09日
    瀏覽(22)
  • 算法通關(guān)村第十二關(guān)-字符串基礎(chǔ)題目

    思路:遍歷字符串,將第i個字符和第N-i-1個字符串交換即可; 代碼實現(xiàn): 題目:反轉(zhuǎn)字符串2 思路:每2k個一組,將其前k個字符反轉(zhuǎn),使用i+k與字符串長度n判斷剩余字符串長度屬于(0,k)還是 [k,2k)之間;然后按照要求剩余字符串即可; 代碼實現(xiàn): 題目:僅僅反轉(zhuǎn)字母 思

    2024年01月22日
    瀏覽(21)
  • 算法通關(guān)村第十七關(guān):青銅挑戰(zhàn)-貪心其實很簡單

    算法通關(guān)村第十七關(guān):青銅挑戰(zhàn)-貪心其實很簡單

    1. 難以解釋的貪心算法 貪心學(xué)習(xí)法則:直接做題,不考慮貪不貪心 貪心(貪婪)算法 是指在問題盡心求解時,在每一步選擇中都采取最好或者最優(yōu)(最有利)的選擇,從而希望能夠?qū)е陆Y(jié)果最好或者最優(yōu)的算法 貪心算法所得到的結(jié)果不一定是最優(yōu)的結(jié)果,但是都是相對近似最

    2024年02月09日
    瀏覽(28)
  • 算法通關(guān)村第十六關(guān)——滑動窗口與堆結(jié)合

    LeetCode239給你一個整數(shù)數(shù)組nums,有一個大小為k的滑動窗口從數(shù)組的最左側(cè)移動到數(shù)組的最右側(cè)。你只可以看到在滑動窗口內(nèi)的k個數(shù)字?;瑒哟翱诿看沃幌蛴乙苿右晃?,返回滑動窗口中的最大值。 優(yōu)先隊列中每個值存儲的是一個包含元素值和對應(yīng)索引的數(shù)組 [元素值, 索引] 。在

    2024年02月11日
    瀏覽(23)
  • 算法通關(guān)村第十八關(guān):青銅挑戰(zhàn)-回溯是怎么回事

    算法通關(guān)村第十八關(guān):青銅挑戰(zhàn)-回溯是怎么回事

    回溯,最重要的算法之一 主要解決一些暴力枚舉也搞不定的問題,例如組合、分割、子集、排列、棋盤等 從性能角度來看回溯算法的效率并不高,但對于這些暴力都搞不定的算法能出結(jié)果就很好了,效率低點沒關(guān)系 回溯可視為遞歸的拓展,很多思想和解法都與遞歸密切相關(guān)

    2024年02月09日
    瀏覽(22)
  • 算法通關(guān)村第十二關(guān)——字符串反轉(zhuǎn)問題解析

    算法通關(guān)村第十二關(guān)——字符串反轉(zhuǎn)問題解析

    字符串反轉(zhuǎn)是關(guān)于字符串算法里的重要問題,雖然不是太難,但需要考慮到一些邊界問題。本篇文章就對幾道字符串反轉(zhuǎn)題目進(jìn)行分析。 力扣344題,編寫一個函數(shù),其作用是將輸入的字符串反轉(zhuǎn)過來。輸入字符串以字符數(shù)組 s 的形式給出。不要給另外的數(shù)組分配額外的空間,

    2024年02月10日
    瀏覽(21)
  • 算法通關(guān)村第十六關(guān):青銅挑戰(zhàn)-滑動窗口其實很簡單

    算法通關(guān)村第十六關(guān):青銅挑戰(zhàn)-滑動窗口其實很簡單

    1. 滑動窗口基本思想 數(shù)組引入雙指針的背景: 很多算法會大量移動數(shù)組中的元素,頻繁移動元素會導(dǎo)致執(zhí)行效率低下或者超時,使用兩個變量能比較好的解決很多相關(guān)問題 數(shù)組雙指針,之前介紹過 對撞型 和 快慢型 兩種,滑動窗口思想就是快慢型的特例 滑動窗口 示例:

    2024年02月09日
    瀏覽(27)
  • 算法通關(guān)村第十六關(guān):黃金挑戰(zhàn):滑動窗口與堆結(jié)合

    堆的大小一般是有限的,能直接返回當(dāng)前位置下的最大值或者最小值 該特征與滑動窗口結(jié)合,可以解決一些特定場景的問題 1. 滑動窗口與堆問題的結(jié)合 LeetCode239 https://leetcode.cn/problems/sliding-window-maximum/ 思路分析 對于最大值,K個最大這種場景,優(yōu)先隊列(堆)是首先該考慮的

    2024年02月09日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包