百度抽樣算法面試題(部分)

1.  給你一個長度爲N的鏈表。N很大,但你不知道N有多大。你的任務是從這N個元素中隨機取出k個元素。你只能遍歷這個鏈表一次。你的算法必須保證取出的元素恰好有k個,且它們是完全隨機的(出現概率均等)。

解:先選中前k個, 從第k+1個元素到最後一個元素爲止, 以k/i (i=k+1, k+2,...,N) 的概率選中第i個元素,並且隨機替換掉一個原先選中的元素, 這樣遍歷一次得到k個元素, 可以保證完全隨機選取。這個算法叫做蓄水池抽樣,在某門課上聽到的,證明起來也不是很複雜。

證:最後一個元素選中概率=K/N,倒數第2個元素選中概率=(K/N-1)*(1-(K/N)*(1/K))=K/N,以此類推……

2.  如何從n個排序的對象中選擇一個,但實現不知道n的大小

解:總是選擇第一個對象,並使用1/2的概率選擇第二個對象,使用1/3的概率選擇第三個對象,以此類推。在過程結束時,每個對像被選中的概率都是1/n。

3.  給你一個數組A[1..n],請你在O(n)的時間裏構造一個新的數組B[1..n],使得B[i]=A[1]*A[2]*...*A[n]/A[i]。你不能使用除法運算。

解:從前往後掃一遍,然後從後往前再掃一遍。也就是說,線性時間構造兩個新數組,P[i]=A[1]*A[2]*...*A[i],Q[i]=A[n]*A[n-1]*...*A[i]。於是,B[i]=P[i-1]*Q[i+1]。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章