請教乙個演算法題,最優解應該怎麼做?

時間 2021-05-05 15:25:00

1樓:Yuanfei Bi

最優要看題目的具體情況。

拓展下,如果是stream問題,即有新數字加入陣列的話,能不能很快找出新陣列的最大m個數?這時候可以用極小堆。

2樓:那羅延

先說結論,下面我要推薦的演算法,計算複雜度為 O(n) ,這個計算複雜度可以秒殺排序演算法了,而且應該比select median要快……

首先肯定一點,你一定會遍歷這個無序排列的未知數組,所以演算法複雜度至少是 O(n),這是逃不掉了的……

我能想到的演算法如下:

建立乙個空的二叉堆 heap ,二叉堆根節點是最小值,所以是binary min heap。

從陣列的第乙個元素開始遍歷,對於前 m 個元素,直接往二叉堆heap裡插入。

從第 i = m+1 個元素開始,和當前的heap的根節點比較(根節點是heap當前所有元素的最小值):

如果比根節點小或者相等,看 i + 1 (next)

遍歷n個元素完畢之後,返回當前二叉堆。演算法結束!

演算法中間步驟的計算複雜度分別為

遍歷陣列:O(n)

插入操作:O(1) - O(log(m)) 因為m相對於n來說是很小的數,而且並不會隨著n增大,所以其實是O(1)

所以最終計算複雜度為 O(n) 。

注意,如果n足夠長,且陣列排序純隨機,越往後遍歷,插入操作越不容易進行。

考慮最好情況,陣列是降序排列,前m個之後永遠不會有插入操作,妥妥的O(n),而且非常快,因為就是單純的一次遍歷加上微不足道的比較!

最壞情況,陣列嚴格公升序排列,一直在插入,所以是O(n log(m))。

我認為這個演算法要比select median要快一倍左右,因為select median其實是 2n,遍歷的兩倍(還要算上比較),而這個其實是在 n 和 n log(m) 之間,靠近 n 的一側。

3樓:

用select median演算法的變種,可以在deterministic 的時間內找到前m大。這個時間複雜度顯然是最優的。

4樓:趙長青

如果n無限大到記憶體裝不下,可以先建立乙個大小為m的小根堆,然後遍歷處理後面的元素。

如果n不大,使用快排,尋找povit元素使得povit右邊的元素為m個,即為解。

該題使用強化學習演算法應該怎麼做?從哪些方面考慮?

一唯絳 首先捋清楚這個RL問題的state,action和reward是哪些 a1和a2都是時間的函式,它們應當理解為state a1,a2 其中第一行的兩個式子分別對應這兩個狀態分量的轉移規律 第二行式子給出了狀態的初始狀態,即state 0 第三行式子則是間接給出了reward函式,reward...

作為乙個老師,她應該怎麼做

想太多 做自己想做的吧,至於課後輔導,我經歷的輔導都是各科任老師搶來的,其他老師不願意麼,你朋友願意就好,只是對工作的熱情很容易消減。 人間甜餅 記住,不忘初心。哪怕這個世界都混沌,只要自己堅持,總會讓學生看見光明。這種事,我去實習的時候遇到過。實習的學校是乙個當地不太好的初中。生源大部分都是進城務...

乙個新人主播應該怎麼做?

趙某某 現如今網際網路時代,做直播是處處可見的,很多人在直播中賺錢。隨著直播的普遍,現在的直播也並不是這麼好做了,那麼做直播所遇到的問題也越來越多,考慮的因素也多了。首先,就是待遇方面。為什麼會想到去做直播呢?很多人是想利用閒暇之餘去賺點外快,就會想著做兼直播。比如說學生利用寒暑假1 2個月時間去玩...