從N個數中等概率列印M個數

2021-10-02 19:23:11 字數 1087 閱讀 5736

【題目】

給定乙個長度為n且沒有重複元素的陣列arr和乙個整數n,實現函式等概率隨機列印arr中的m個數。

【要求】

相同的數不要重複列印;

時間複雜度為o(m

)o(m)

o(m)

,額外空間複雜度為o(1

)o(1)

o(1)

;可以改變arr陣列。

不考慮額外空間複雜度為o(1

)o(1)

o(1)

的限制,建立乙個狀態陣列或者雜湊表記錄已列印的數。

本題的小技巧是與最後乙個位置的數值交換swap arr[cur], arr[n - 1 - i],很多有關等概率隨機的題目沿用這個思路(e.g. 等概率隨機快速獲取key的結構)

def

random_print_m_numbers

(arr, m)

:if arr is

none

or m <=0or

len(arr)

< m:

return

n =len(arr)

for i in

range

(m):

cur =

int(random.random()*

(n - i)

)print

(arr[cur]

, end=

' ')

# swap arr[cur], arr[n - 1 - i]

temp = arr[cur]

arr[cur]

= arr[n -

1- i]

arr[n -

1- i]

= temp

# 簡單測試

if __name__ ==

'__main__'

: arr =[1

,4,9

,3,8

] random_print_m_numbers(arr,

2)

從N個數中等概率列印M個數

題目 給定乙個長度為n且 沒有重複元素 的陣列array和乙個整數m,實現函式等概論隨機列印array中的m個數。要求 1.相同的數不要重複列印 2.時間複雜度為o m 額外空間複雜度為o 1 3.可以改變array陣列 解題思路 解法的關鍵點是利用要求3改變陣列array。列印過程如下 1.在 0...

從n個數中刪除m個數

補題 題目大意是 有個很大的整數n,刪除其中的m位數字,使得剩下的數字按原來的次序組成的數最大。include include include include include include include define ll long long define inf 0x3f3f3f3f usin...

等概率無重複的從n個數中選取m個數

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!問題描述 程式的輸入包含兩個整數m和n,其中m學習過概率統計的同學應該都知道每乙個數字被抽取的概率都應該為m n.那麼我們怎麼構造出這樣的概率呢?在 程式設計珠璣 上面是這樣解析的 依次考慮整數0,1,2,n 1,並通過乙個適當的隨機測試對每個整數...