社會名流是指在n個人中,乙個被所有人知道但是不知道其他人的人。若用有向圖描述此問題,可以表示為:若a認識b,則從a到b有一條邊。問題需要從n個人中,找到社會名流。
同樣可以推斷出,在乙個圖中社會名流至多有一人。若多於一人,假設a與b都是社會名流,由於a是社會名流,所以b認識a,a不認識b,同理b不認識a,a認識b。矛盾。所以在乙個圖中,社會名流的個數為0或者1個。
思想:
使用歸納法來處理此問題,從演算法1可以看出,問題主要是逐個排除候選人。當問題規模為n時,有n個候選人。所以我們將候選人的個數定義為歸納法的變數。
我們假設問題的規模為n-1時,問題可解。基礎情況為n = 1時,最多隻需詢問其餘的n-1乙個人,共2(n-1)個問題便可確定問題的解。
問題的關鍵為如何將問題的規模n變為n-1。
我們考慮任意兩個人a和b,若a到b有邊,則a一定不是社會名流。相反,若a到b沒邊,則b一定不是社會名流。由此可知,對任意兩個人,只需判斷a到b有沒有邊,便可排除乙個候選人。這樣,我們將問題由n變為n-1。
實現:
將演算法分為兩個階段,第乙個階段將問題的規模變為1.第二個階段判斷剩餘的乙個人是否是社會名流。
**:
public int findknown(boolean relation)
can = candidate.pop();
while(candidate.size() > 0)
//無邊can保持原值
} //得到can,進入檢測階段
for(i = 0 ; i < length ; i++)else
} return can;
}
總結:不要總是從n-1擴充套件到n,有時應嘗試將問題的規模降低,由n至n-1。 演算法學習01 生兔子的問題
程式1 題目 古典問題 有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子對數為多少?1.程式分析 兔子的規律為數列1,1,2,3,5,8,13,21.其實這個問題是找規律得出公式,其中規律是nx n 1 x n 2 x 其實我也...
深度學習中關於優化演算法的問題
模型微調 利用預訓練模型進行模型微調,預訓練模型即在其他資料集上訓練的比較的模型,預訓練模型通常在特徵上有很好的語義表達,此時只需要將模型在小資料集上進行微調就能獲得比較好的結果。單樣本或者少樣本學習,這種方式適用於樣本類別數遠遠大於樣本數量的極端情況。少樣本學習同樣需要借助預訓練模型,但區別在於微...
演算法學習 類似漢諾塔的問題
題目 漢諾塔問題比較經典,這裡修改一下遊戲規則 現在限制不能從最左側的塔直接移動到最右 側,也不能從最右側直接移動到最左側,而是必須經過中間。求當塔有 n 層的時候,列印 最優移動過程和最優移動總步數。例如,當塔數為兩層時,最上層的塔記為 1,最下層的塔記為 2,則列印 move 1 from le...