本文主要介紹蒙特卡洛(monte carlo)演算法、拉斯維加斯(las vegas)演算法和舍伍德(sherwood)演算法。
蒙特卡羅演算法並不是一種演算法的名稱,而是是一類隨機方法的統稱。這類方法的特點是,可以在隨機取樣上計算得到近似結果,隨著取樣的增多,得到的結果是正確結果的概率逐漸加大,但在(放棄隨機取樣,而採用類似全取樣這樣的確定性方法)獲得真正的結果之前,無法知道目前得到的結果是不是真正的結果。
從特性特性來說,我們知道,既然是隨機演算法,在取樣不全時,通常不能保證找到最優解,只能說是盡量找。那麼根據怎麼個「盡量」法呢,我們我們把隨機演算法分成兩類:
(1)蒙特卡羅演算法:取樣越多,越近似最優解;無法證明當前解是否為最優解。
(2)拉斯維加斯演算法:取樣越多,越有機會找到最優解;如果找到最優解能夠立刻證明是最優解。
舉個例子,假如筐裡有100個蘋果,讓我每次閉眼拿1個,挑出最大的。於是我隨機拿1個,再隨機拿1個跟它比,留下大的,再隨機拿1個……我每拿一次,留下的蘋果都至少不比上次的小。拿的次數越多,挑出的蘋果就越大,但我除非拿100次,否則無法肯定挑出了最大的。這個挑蘋果的演算法,就屬於蒙特卡羅演算法——盡量找好的,但不保證是最好的,即使找到了前99個蘋果中最大的那個,也不能保證當前最大的蘋果就一定是100個中最大的。
而拉斯維加斯演算法,則是另一種情況。假如有一把鎖,給我100把鑰匙,只有1把是對的。於是我每次隨機拿1把鑰匙去試,打不開就再換1把。我試的次數越多,開啟(最優解)的機會就越大,但在開啟之前,那些錯的鑰匙都是沒有用的。這個試鑰匙的演算法,就是拉斯維加斯演算法——盡量找最好的,但不保證能找到,但是一旦鎖被開啟了,就一定是找對了鑰匙,剩下的鑰匙可以不必理會。
個人認為舍伍德演算法嚴格意義上不是乙個演算法,而是乙個隨機處理過程,我將原始演算法經過舍伍德處理後的演算法稱為舍伍德演算法。舍伍德演算法通過增加乙個較小的額外開銷從而使得演算法的複雜度與具體例項x無關,雖然此時的演算法仍有可能發生複雜度比較大的情況,但這種偶然行行為只是由於演算法所做的概率選擇引起的。我們可以通過多次執行演算法來避免最差情況。
實際上幾乎所有查詢與排序演算法都可以使用舍伍德演算法進行處理,排序演算法在執行排序之前對資料進行隨機打亂就是乙個典型的方法。某些有序表的查詢也可以在查詢前隨機找乙個數進行比較,從而使演算法具有較好的平均效能。比如像快速排序中,某些特定的業務場景可能會產生特定性質的序列,有時這種序列恰好就是快速排序的「最糟糕情況」,當採用先原地打亂再進行快排,由於每次隨機化的結果將不帶有業務特性,可以避免這種情況發生。
Hadoop集群三種作業排程演算法介紹
hadoop集群中有三種作業排程演算法,分別為fifo,公平排程演算法和計算能力排程演算法 先來先服務 fifo hadoop中預設的排程器fifo 它先按照作業的優先順序高低,再按照到達時間的先後選擇被執行的作業。fifo比較簡單,hadoop中只有乙個作業佇列,被提交的作業按照先後順序在作業佇列...
Elasticsearch 三種快取介紹
filter cache query cache query cache也稱為filter cache,顧名思義它的作用就是對乙個查詢中包含的過濾器執行結果進行快取。比如我們常用的term,terms,range過濾器都會在滿足某種條件後被快取,注意,這裡的bool過濾器是不會被快取的,但bool過...
FIFO LRU LFU三種演算法
提到快取,有兩點是必須要考慮的 1 快取資料和目標資料的一致性問題。2 快取的過期策略 機制 其中,快取的過期策略涉及淘汰演算法。常用的淘汰演算法有下面幾種 1 fifo firstin first out 先進先出 2 lru leastrecently used 最近最少使用 3 lfu lea...