一道資料處理的演算法題

2022-01-24 09:11:23 字數 667 閱讀 5159

有乙份5000萬個使用者的資料,有乙份2億個使用者看電影的記錄。只有1g的記憶體,找到看電影最多的前1000個使用者?

應該怎麼做呢?

我一開始的想法,哎呀,快速排序!把2億個使用者的資料提取出來放到5000萬長度的陣列裡進行快速排序。把2億個使用者的資料提取出來,只能靠hashmap了,那麼就要在建乙個5000萬個key的hashmap了。但是想想只有1g的記憶體。

查詢資料,在乙個人部落格中寫到:1000000個item的hashmap就佔記憶體接近60m了,那麼5000萬個item估計就要超過1個g了,因為haspmap是非常非常消耗記憶體的。越是我的這個想法就宣告失敗。

其實從思想上來看,我的這個想法只是暴力而已,用已經熟知的快速排序在時間上找點優勢。然後看看題目,就知道他考你的不是時間,而是記憶體。我們都知道快速排序用的分而治之的思想,和這個思想相同的排序演算法還有歸併排序。

這個問題的正確解法應該是將2億個記錄分成一段段小的部分(可以用1g記憶體處理的部分),然後用我上面的方法進行排序,這樣得出來每段的順序,取前1000個,然後兩兩結合再次排序,或者三三結合也行。直到最後合併成一塊,那就是我們需要的東西。

縱觀下來,這就是歸併排序的思想,也是分而治之的思想。在物理記憶體限制的情況下,我們只能區域性求解,慢慢擴充套件到整體。這樣可以用少的記憶體解決乙個很龐大的問題。

如果這樣的思想能在你的腦袋裡扎根,那麼很多問題你就可以解決了。

一道演算法題

兩個燒杯,乙個放糖乙個放鹽,用勺子舀一勺糖到鹽,攪拌均勻,然後舀一勺混合 物會放糖的燒杯,問你兩個燒杯哪個雜質多?一樣多吧 對的 為啥?是不是因為 糖和鹽本來就是均勻的 因為,就算不攪拌均,你放一勺過去,那邊放一勺不含雜質的過來,那麼都是一勺雜之 如果攪拌均勻的話也是一樣 小依 21 45 32 也...

一道演算法題

1.上午主要做了對翻譯任務的劃分,下午把 翻譯完畢。2.明天要講的演算法題 對乙個集合,求出其連續元素組成的子集中,和最大的子集 我對這道題的理解是 1 若集合中最小值大於0,意味著所有的都大於0,則最大的子集和,為所有值加起來 2 若集合中最大值小於0,意味著所有的都小於0,則最大的子集和,為集合...

一道演算法題

include using namespace std const int size 5 int max sub array const int a,int n,int m int max matrix const int a size int row,int col,int subsize int...