當前位置:首頁 » 操作系統 » 演算法案例上

演算法案例上

發布時間: 2023-08-30 22:45:40

⑴ 關聯規則-演算法原理與案例

✓ 關聯規則(Association Rules)反映一個事務與其他事務之間的相
互依存性和關聯性。如果兩個或者多個事務之間存在一定的關聯關
系,那麼,其中一個事務就能夠通過其他事務預測到。
✓ 關聯規則是無監督的機器學習方法,用於知識發現,而非預測
✓ 關聯規則的學習器(learner)無需事先對訓練數據進行打標簽,因
為無監督學習沒有訓練這個步驟。缺點是很難對關聯規則學習器進
行模型評估,一般都可以通過業務經驗觀測結果是否合理

關聯規則之前,需要理解一些基本概念。
下圖數據集中,每一組數據ti表示不同的顧客一次在商場購買的商品
的集合,以該數據為例來說明關聯規則相關概念。

圖片顯示, 表中存儲著二維結構的記錄集,記為D,簡稱事務集D,含事務的個數稱為|D|。那麼圖片中從t1,t2,......直到t7含7個事務,|D|=7。

設I={i1,i2,…im}是m個不同項目的集合,每個ik(k=1,2,…m)稱為一個項目(Item),I是所有項目(Item)的集合,稱為所有項集(Items)。圖片中所有項集I={牛肉,雞肉,牛奶,乳酪,靴子,衣服},其中,「牛 肉」、「雞肉」等均為項目。

在事務數據集里的一筆記錄,記為事務T,{牛肉、雞肉、牛奶}便是一個事務,每個事務T(Transaction)是所有項集I的一個子集。

項目的集合簡稱為項集(Itemset),其元素個數為項集的長度,長度為k的項集稱為k-項集(k-Itemset)。
如{牛肉}、{雞肉}均為1-項集,{牛肉、乳酪}為2-項集,{雞肉、衣 服、牛奶}為3-項集。

重點概念5-項集的支持度:項集支持度用於描述X的重要性,對於項集X,count為事務集D中包含X的事務的數量,項集X的支持度就是項集X出現的概率。

項集的支持度就是該項集出現的次數除以總的記錄數,例如,上述的7個事務中,{牛肉、雞肉}出現的次數是3次,支持度就是3/7 。

我們在發現規則的時候,希望關注頻次高的項集,發現關聯規則要求項集必須滿足的最小支持閾值,稱為項集的最小支持度(Minimum Support),記為supmin。支持度大於或等於最小支持度的項集稱為頻繁項集,簡稱頻繁集,反之則稱為非頻繁集。支持度在這個演算法中通常是人為規定的參數。

規則R的支持度是交易集中同時包含X和Y的交易數與所有交易數之比;

支持度計算在事務集中,既有A又有B的概率。
例:在7條記錄中,既有牛肉又有雞肉的記錄有3條,則 R:牛肉 雞肉的支持度為3/7,即 ,表示在所有顧客當中有3/7同時購買了牛肉和雞肉,其反映了同時購買牛肉和雞肉的顧客在所有顧客當中的覆蓋范圍。

規則R的置信度是指包含X和Y的交易數與包含X的交易數之比。

規則的置信度的意義在於項集{X,Y}同時出現的次數占項集{X}出現次數的比例,即發生X的條件下,又發生Y的概率。

關聯規則的最小支持度也就是衡量頻繁集的最小支持度(Minimum
Support),記為supmin,它用於衡量規則需要滿足的最低重要性。
Minimum Support是一個閾值參數,必須在處理關聯規則之前指定該
參數。該參數表示用戶對某些項集和規則感興趣,這些規則表示數
據集的最低支持度。它是用於對項集進行限制,而不是對規則進行
限制。

✓ 如果關聯規則R: A→B滿足Support(A→B )>=supmin 且
Confidence( A→B )>=confmin,則稱關聯規則R: 為強關聯規則,否
則稱關聯規則為弱關聯規則;
✓ 在挖掘關聯規則時,產生的關聯規則要經過supmin和confmin的衡量,
篩選出來的強關聯規則才能用於指導商家的決策;

引入例題來計算這個概念,例:在所分析的10000個事務中,6000個事務包含計算機游戲,7500包含游戲機游戲,4000個事務同時包含兩者。
下面我們計算:關聯規則(計算機游戲 → 游戲機游戲)支持度=4000/10000=0.4,置信度=4000/6000=0.67,但其實這個關聯規則是一個誤導。

在用戶購買了計算機游戲後有(4000/6000)=0.667的概率去購買游戲機游戲,而在沒有任何前提條件下,用戶反而有(7500/10000) =0.75的概率去購買游戲機游戲,也就是說設置了購買計算機游戲這樣的條件反而會降低用戶去購買游戲機游戲的概率,所以計算機游戲和游戲機游戲是相斥的。

此時需要引入提升度的概念。

如果兩個條件相互獨立,則P(XY)=P(X)· P(Y),即提升度為1;如果小於1,說明使用這條規則來進行推薦,還不如不推薦(推薦無效);
一般在數據挖掘中當提升度大於3時,我們才承認挖掘出的關聯規則是有價值的。

上述例子中,假設購買計算機游戲為X,購買游戲機游戲為Y,則有提升度數=0.667/0.75<1

這表明這樣的推薦是無效的,提升度小於1,還不如不推薦。

第一步,生成候選項集,然後根據指定的最小支持度,過濾掉非頻繁項集,生成頻繁項集。
該步驟需要多次遍歷:第一次遍歷,對所有單項的支持度進行計數並確定頻繁項;在後續的每次遍歷中,利用上一次遍歷所得頻繁項集作為種子項集,產生新的頻繁項集-候選項集,並對候選項集的支持度進行計數,在本次遍歷結束時統計滿足最小支持度的候選項集,本次遍歷對應的頻繁項集就算是確定了,這些頻繁項集又成為下一次遍歷的種子;重復此遍歷過程,直到再不能發現新的頻繁項集。

第二步,找出第一步的頻繁項集中的規則,然後根據指定的最小置信度,過濾掉弱規則。第一步的計算量比第二步的計算量大。

步驟1:
✓ 生成候選1-項集C1,計算支持度
✓ 根據最小支持度,生成頻繁1-項集L1

步驟2:
✓ 生成候選2-項集C2,計算支持度
✓ 根據最小支持度,生成頻繁2-項集L2

✓ 生成關聯規則時,最簡單的方法就是對於每個頻繁項集,列出其所有非空
真子集,任取其中兩個分別作為LHS和RHS,形成關聯規則,並計算每條關
聯規則的置信度,刪除弱規則
✓ 上例中 , 對於頻繁項集 {B,C,E} , 它的非空子集有 {B},{C},{E},
{B,C},{B,E},{C,E}。據此獲得的關聯規則及其置信度,置信度>=50%(最小
置信度),都是強關聯規則

✓ Apriori原理可以幫助減少計算量
✓ Apriori原理:某個項集是頻繁的,那麼它的所有子集也是頻繁的;
更常用的是它的逆否命題,即如果一個項集是非頻繁的,那麼它的
所有超集也是非頻繁的(稱為項集的反單調性,向下閉合性)

已知陰影項集{2,3}是非頻繁的。利用Apriori原理,我們知道項集{0,2,3}, {1,2,3}以及{0,1,2,3}也是非頻繁的。也就是說,一旦計算出了{2,3}的支持 度 , 知 道 它 是 非 頻 繁 的 , 就 可 以 緊 接 著 排 除 {0,2,3} , {1,2,3} 和 {0,1,2,3}。

✓ 反單調性能迅速剪枝,提高搜索頻繁項集的處理效率

在商品列表中找出頻繁項集,構建商品列表。

創建模型,傳入數據,輸出的support就是支持度。

該段輸出結果如下

接下來可以篩選支持度大於某特定值的二項集

輸出結果

⑵ 二進制的演算法 多舉個例子。

1、加法法則: 0+0=0,0+1=1+0=1,1+1=10

2、減法法則: 0 - 0 = 0 1 - 0 = 1 1 - 1 = 0 0 - 1 = 1 有借位,借1當(10)2 0 - 1 - 1 = 0 有借位 1 - 1 - 1 = 1 有借位。減法,當需要向上一位借數時,必須把上一位的1看成下一位的(2)10。

3、乘法法則: 0×0=0,0×1=1×0=0,1×1=1

4、除法法則: 0÷1=0,1÷1=1 除法應注意: 0÷0 = 0 0÷1 = 0 1÷0 = 0 (無意義)

(2)演算法案例上擴展閱讀

二進制是計算技術中廣泛採用的一種數制。二進制數據是用0和1兩個數碼來表示的數。它的基數為2,進位規則是「逢二進一」,借位規則是「借一當二」,由18世紀德國數理哲學大師萊布尼茲發現。當前的計算機系統使用的基本上是二進制系統,數據在計算機中主要是以補碼的形式存儲的。計算機中的二進制則是一個非常微小的開關,用「開」來表示1,「關」來表示0。

c語言問題: 什麼是演算法試從日常生活中找3個例子,描述它們的演算法。 詳細點,謝謝!

c語言中的演算法是指:一系列解決問題的清晰指令,用系統的方法描述解決問題的策略機制。也就是說,能夠對一定規范的輸入,在有限時間內獲得所要求的輸出。通俗說就是解決問題的方法和步驟。

描述演算法的例子:

  1. 問題:從上海去到北京。

    其中的演算法:做汽車、做飛機、或者徒步。

  2. 問題:喝茶。

    其中的演算法:先找到茶葉,再燒一壺開水,然後將茶葉放到杯子里,將開水倒入杯中,等茶葉泡好。

  3. 問題:開車。

    其中的演算法:首先要打開車門,駕駛員坐好,插上車鑰匙,發動汽車。

⑷ 搜索演算法的應用案例

(1)題目:黑白棋游戲
黑白棋游戲的棋盤由4×4方格陣列構成。棋盤的每一方格中放有1枚棋子,共有8枚白棋子和8枚黑棋子。這16枚棋子的每一種放置方案都構成一個游戲狀態。在棋盤上擁有1條公共邊的2個方格稱為相鄰方格。一個方格最多可有4個相鄰方格。在玩黑白棋游戲時,每一步可將任何2個相鄰方格中棋子互換位置。對於給定的初始游戲狀態和目標游戲狀態,編程計算從初始游戲狀態變化到目標游戲狀態的最短著棋序列。
(2)分析
這題我們可以想到用深度優先搜索來做,但是如果下一步出現了以前的狀態怎麼辦?直接判斷時間復雜度的可能會有點大,這題的最優解法是用廣度優先搜索來做。我們就可以有初始狀態按照廣度優先搜索遍歷來擴展每一個點,這樣到達目標狀態的步數一定是最優的(步數的增加時單調的)。但問題是如果出現了重復的情況我們就必須要判重,但是樸素的判重是可以達到狀態數級別的,其實我們可以考慮用hash表來判重。
Hash表:思路是根據關鍵碼值進行直接訪問。也就是說把一個關鍵碼值映射到表中的一個位置來訪問記錄的過程。在Hash表中,一般插入,查找的時間復雜度可以在O(1)的時間復雜度內搞定。對於這一題我們可以用二進制值表示其hash值,最多2^16次方,所以我們開個2^16次方的表記錄這個狀態出現沒有,這樣可以在O(1)的時間復雜度內解決判重問題。
進一步考慮:從初始狀態到目標狀態,必定會產生很多無用的狀態,那還有什麼優化可以減少這時間復雜度?我們可以考慮把初始狀態和目標狀態一起擴展,這樣如果初始狀態的某個被擴展的點與目標狀態所擴展的點相同時,那這兩個點不用擴展下去,而兩個擴展的步數和也就是答案。
上面的想法是雙向廣度優先搜索:
就像圖二一樣,多擴展了很多不必要的狀態。
從上面一題可以看到我們用到了兩種優化方法,即Hash表優化和雙向廣搜優化。一般的廣度優先搜索用這兩個優化就足以解決。

⑸ hadoop的maprece常見演算法案例有幾種

基本MapRece模式

計數與求和
問題陳述:
有許多文檔,每個文檔都有一些欄位組成。需要計算出每個欄位在所有文檔中的出現次數或者這些欄位的其他什麼統計值。例如,給定一個log文件,其中的每條記錄都包含一個響應時間,需要計算出平均響應時間。
解決方案:
讓我們先從簡單的例子入手。在下面的代碼片段里,Mapper每遇到指定詞就把頻次記1,Recer一個個遍歷這些詞的集合然後把他們的頻次加和。

1 class Mapper
2 method Map(docid id, doc d)
3 for all term t in doc d do
4 Emit(term t, count 1)
5
6 class Recer
7 method Rece(term t, counts [c1, c2,...])
8 sum = 0
9 for all count c in [c1, c2,...] do
10 sum = sum + c
11 Emit(term t, count sum)

這種方法的缺點顯而易見,Mapper提交了太多無意義的計數。它完全可以通過先對每個文檔中的詞進行計數從而減少傳遞給Recer的數據量:

1 class Mapper
2 method Map(docid id, doc d)
3 H = new AssociativeArray
4 for all term t in doc d do
5 H{t} = H{t} + 1
6 for all term t in H do
7 Emit(term t, count H{t})

如果要累計計數的的不只是單個文檔中的內容,還包括了一個Mapper節點處理的所有文檔,那就要用到Combiner了:

1 class Mapper
2 method Map(docid id, doc d)
3 for all term t in doc d do
4 Emit(term t, count 1)
5
6 class Combiner
7 method Combine(term t, [c1, c2,...])
8 sum = 0
9 for all count c in [c1, c2,...] do
10 sum = sum + c
11 Emit(term t, count sum)
12
13 class Recer
14 method Rece(term t, counts [c1, c2,...])
15 sum = 0
16 for all count c in [c1, c2,...] do
17 sum = sum + c
18 Emit(term t, count sum)

應用:Log 分析, 數據查詢

整理歸類

問題陳述:
有一系列條目,每個條目都有幾個屬性,要把具有同一屬性值的條目都保存在一個文件里,或者把條目按照屬性值分組。 最典型的應用是倒排索引。
解決方案:
解決方案很簡單。 在 Mapper 中以每個條目的所需屬性值作為 key,其本身作為值傳遞給 Recer。 Recer 取得按照屬性值分組的條目,然後可以處理或者保存。如果是在構建倒排索引,那麼 每個條目相當於一個詞而屬性值就是詞所在的文檔ID。
應用:倒排索引, ETL
過濾 (文本查找),解析和校驗
問題陳述:
假設有很多條記錄,需要從其中找出滿足某個條件的所有記錄,或者將每條記錄傳換成另外一種形式(轉換操作相對於各條記錄獨立,即對一條記錄的操作與其他記錄無關)。像文本解析、特定值抽取、格式轉換等都屬於後一種用例。
解決方案:
非常簡單,在Mapper 里逐條進行操作,輸出需要的值或轉換後的形式。
應用:日誌分析,數據查詢,ETL,數據校驗

分布式任務執行

問題陳述:
大型計算可以分解為多個部分分別進行然後合並各個計算的結果以獲得最終結果。
解決方案: 將數據切分成多份作為每個 Mapper 的輸入,每個Mapper處理一份數據,執行同樣的運算,產生結果,Recer把多個Mapper的結果組合成一個。
案例研究: 數字通信系統模擬
像 WiMAX 這樣的數字通信模擬軟體通過系統模型來傳輸大量的隨機數據,然後計算傳輸中的錯誤幾率。 每個 Mapper 處理樣本 1/N 的數據,計算出這部分數據的錯誤率,然後在 Recer 里計算平均錯誤率。
應用:工程模擬,數字分析,性能測試
排序
問題陳述:
有許多條記錄,需要按照某種規則將所有記錄排序或是按照順序來處理記錄。
解決方案: 簡單排序很好辦 – Mappers 將待排序的屬性值為鍵,整條記錄為值輸出。 不過實際應用中的排序要更加巧妙一點, 這就是它之所以被稱為MapRece 核心的原因(「核心」是說排序?因為證明Hadoop計算能力的實驗是大數據排序?還是說Hadoop的處理過程中對key排序的環節?)。在實踐中,常用組合鍵來實現二次排序和分組。
MapRece 最初只能夠對鍵排序, 但是也有技術利用可以利用Hadoop 的特性來實現按值排序。想了解的話可以看這篇博客。
按照BigTable的概念,使用 MapRece來對最初數據而非中間數據排序,也即保持數據的有序狀態更有好處,必須注意這一點。換句話說,在數據插入時排序一次要比在每次查詢數據的時候排序更高效。
應用:ETL,數據分析

非基本 MapRece 模式

迭代消息傳遞 (圖處理)

問題陳述:
假設一個實體網路,實體之間存在著關系。 需要按照與它比鄰的其他實體的屬性計算出一個狀態。這個狀態可以表現為它和其它節點之間的距離, 存在特定屬性的鄰接點的跡象, 鄰域密度特徵等等。
解決方案:
網路存儲為系列節點的結合,每個節點包含有其所有鄰接點ID的列表。按照這個概念,MapRece 迭代進行,每次迭代中每個節點都發消息給它的鄰接點。鄰接點根據接收到的信息更新自己的狀態。當滿足了某些條件的時候迭代停止,如達到了最大迭代次數(網路半徑)或兩次連續的迭代幾乎沒有狀態改變。從技術上來看,Mapper 以每個鄰接點的ID為鍵發出信息,所有的信息都會按照接受節點分組,recer 就能夠重算各節點的狀態然後更新那些狀態改變了的節點。下面展示了這個演算法:

1 class Mapper
2 method Map(id n, object N)
3 Emit(id n, object N)
4 for all id m in N.OutgoingRelations do
5 Emit(id m, message getMessage(N))
6
7 class Recer
8 method Rece(id m, [s1, s2,...])
9 M = null
10 messages = []
11 for all s in [s1, s2,...] do
12 if IsObject(s) then
13 M = s
14 else // s is a message
15 messages.add(s)
16 M.State = calculateState(messages)
17 Emit(id m, item M)

一個節點的狀態可以迅速的沿著網路傳全網,那些被感染了的節點又去感染它們的鄰居,整個過程就像下面的圖示一樣:

案例研究: 沿分類樹的有效性傳遞
問題陳述:
這個問題來自於真實的電子商務應用。將各種貨物分類,這些類別可以組成一個樹形結構,比較大的分類(像男人、女人、兒童)可以再分出小分類(像男褲或女裝),直到不能再分為止(像男式藍色牛仔褲)。這些不能再分的基層類別可以是有效(這個類別包含有貨品)或者已無效的(沒有屬於這個分類的貨品)。如果一個分類至少含有一個有效的子分類那麼認為這個分類也是有效的。我們需要在已知一些基層分類有效的情況下找出分類樹上所有有效的分類。
解決方案:
這個問題可以用上一節提到的框架來解決。我們咋下面定義了名為 getMessage和 calculateState 的方法:

1 class N
2 State in {True = 2, False = 1, null = 0},
3 initialized 1 or 2 for end-of-line categories, 0 otherwise
4 method getMessage(object N)
5 return N.State
6 method calculateState(state s, data [d1, d2,...])
7 return max( [d1, d2,...] )

案例研究:廣度優先搜索
問題陳述:需要計算出一個圖結構中某一個節點到其它所有節點的距離。
解決方案: Source源節點給所有鄰接點發出值為0的信號,鄰接點把收到的信號再轉發給自己的鄰接點,每轉發一次就對信號值加1:

1 class N
2 State is distance,
3 initialized 0 for source node, INFINITY for all other nodes
4 method getMessage(N)
5 return N.State + 1
6 method calculateState(state s, data [d1, d2,...])
7 min( [d1, d2,...] )

案例研究:網頁排名和 Mapper 端數據聚合
這個演算法由Google提出,使用權威的PageRank演算法,通過連接到一個網頁的其他網頁來計算網頁的相關性。真實演算法是相當復雜的,但是核心思想是權重可以傳播,也即通過一個節點的各聯接節點的權重的均值來計算節點自身的權重。

1 class N
2 State is PageRank
3 method getMessage(object N)
4 return N.State / N.OutgoingRelations.size()
5 method calculateState(state s, data [d1, d2,...])
6 return ( sum([d1, d2,...]) )

要指出的是上面用一個數值來作為評分實際上是一種簡化,在實際情況下,我們需要在Mapper端來進行聚合計算得出這個值。下面的代碼片段展示了這個改變後的邏輯 (針對於 PageRank 演算法):

1 class Mapper
2 method Initialize
3 H = new AssociativeArray
4 method Map(id n, object N)
5 p = N.PageRank / N.OutgoingRelations.size()
6 Emit(id n, object N)
7 for all id m in N.OutgoingRelations do
8 H{m} = H{m} + p
9 method Close
10 for all id n in H do
11 Emit(id n, value H{n})
12
13 class Recer
14 method Rece(id m, [s1, s2,...])
15 M = null
16 p = 0
17 for all s in [s1, s2,...] do
18 if IsObject(s) then
19 M = s
20 else
21 p = p + s
22 M.PageRank = p
23 Emit(id m, item M)

應用:圖分析,網頁索引

值去重 (對唯一項計數)
問題陳述: 記錄包含值域F和值域 G,要分別統計相同G值的記錄中不同的F值的數目 (相當於按照 G分組).
這個問題可以推而廣之應用於分面搜索(某些電子商務網站稱之為Narrow Search)
Record 1: F=1, G={a, b}
Record 2: F=2, G={a, d, e}
Record 3: F=1, G={b}
Record 4: F=3, G={a, b}

Result:
a -> 3 // F=1, F=2, F=3
b -> 2 // F=1, F=3
d -> 1 // F=2
e -> 1 // F=2

解決方案 I:
第一種方法是分兩個階段來解決這個問題。第一階段在Mapper中使用F和G組成一個復合值對,然後在Recer中輸出每個值對,目的是為了保證F值的唯一性。在第二階段,再將值對按照G值來分組計算每組中的條目數。
第一階段:

1 class Mapper
2 method Map(null, record [value f, categories [g1, g2,...]])
3 for all category g in [g1, g2,...]
4 Emit(record [g, f], count 1)
5
6 class Recer
7 method Rece(record [g, f], counts [n1, n2, ...])
8 Emit(record [g, f], null )

第二階段:

1 class Mapper
2 method Map(record [f, g], null)
3 Emit(value g, count 1)
4
5 class Recer
6 method Rece(value g, counts [n1, n2,...])
7 Emit(value g, sum( [n1, n2,...] ) )

解決方案 II:
第二種方法只需要一次MapRece 即可實現,但擴展性不強。演算法很簡單-Mapper 輸出值和分類,在Recer里為每個值對應的分類去重然後給每個所屬的分類計數加1,最後再在Recer結束後將所有計數加和。這種方法適用於只有有限個分類,而且擁有相同F值的記錄不是很多的情況。例如網路日誌處理和用戶分類,用戶的總數很多,但是每個用戶的事件是有限的,以此分類得到的類別也是有限的。值得一提的是在這種模式下可以在數據傳輸到Recer之前使用Combiner來去除分類的重復值。

1 class Mapper
2 method Map(null, record [value f, categories [g1, g2,...] )
3 for all category g in [g1, g2,...]
4 Emit(value f, category g)
5
6 class Recer
7 method Initialize
8 H = new AssociativeArray : category -> count
9 method Rece(value f, categories [g1, g2,...])
10 [g1', g2',..] = ExcludeDuplicates( [g1, g2,..] )
11 for all category g in [g1', g2',...]
12 H{g} = H{g} + 1
13 method Close
14 for all category g in H do
15 Emit(category g, count H{g})

應用:日誌分析,用戶計數
互相關
問題陳述:有多個各由若干項構成的組,計算項兩兩共同出現於一個組中的次數。假如項數是N,那麼應該計算N*N。
這種情況常見於文本分析(條目是單詞而元組是句子),市場分析(購買了此物的客戶還可能購買什麼)。如果N*N小到可以容納於一台機器的內存,實現起來就比較簡單了。
配對法
第一種方法是在Mapper中給所有條目配對,然後在Recer中將同一條目對的計數加和。但這種做法也有缺點:
使用 combiners 帶來的的好處有限,因為很可能所有項對都是唯一的
不能有效利用內存

1 class Mapper
2 method Map(null, items [i1, i2,...] )
3 for all item i in [i1, i2,...]
4 for all item j in [i1, i2,...]
5 Emit(pair [i j], count 1)
6
7 class Recer
8 method Rece(pair [i j], counts [c1, c2,...])
9 s = sum([c1, c2,...])
10 Emit(pair[i j], count s)

Stripes Approach(條方法?不知道這個名字怎麼理解)
第二種方法是將數據按照pair中的第一項來分組,並維護一個關聯數組,數組中存儲的是所有關聯項的計數。The second approach is to group data by the first item in pair and maintain an associative array (「stripe」) where counters for all adjacent items are accumulated. Recer receives all stripes for leading item i, merges them, and emits the same result as in the Pairs approach.
中間結果的鍵數量相對較少,因此減少了排序消耗。
可以有效利用 combiners。
可在內存中執行,不過如果沒有正確執行的話也會帶來問題。
實現起來比較復雜。
一般來說, 「stripes」 比 「pairs」 更快

1 class Mapper
2 method Map(null, items [i1, i2,...] )
3 for all item i in [i1, i2,...]
4 H = new AssociativeArray : item -> counter
5 for all item j in [i1, i2,...]
6 H{j} = H{j} + 1
7 Emit(item i, stripe H)
8
9 class Recer
10 method Rece(item i, stripes [H1, H2,...])
11 H = new AssociativeArray : item -> counter
12 H = merge-sum( [H1, H2,...] )
13 for all item j in H.keys()
14 Emit(pair [i j], H{j})

應用:文本分析,市場分析
參考資料:Lin J. Dyer C. Hirst G. Data Intensive Processing MapRece
用MapRece 表達關系模式
在這部分我們會討論一下怎麼使用MapRece來進行主要的關系操作。
篩選(Selection)

1 class Mapper
2 method Map(rowkey key, tuple t)
3 if t satisfies the predicate
4 Emit(tuple t, null)

投影(Projection)
投影只比篩選稍微復雜一點,在這種情況下我們可以用Recer來消除可能的重復值。

1 class Mapper
2 method Map(rowkey key, tuple t)
3 tuple g = project(t) // extract required fields to tuple g
4 Emit(tuple g, null)
5
6 class Recer

⑹ 貪婪演算法幾個經典例子

問題一:貪心演算法的例題分析 例題1、[0-1背包問題]有一個背包,背包容量是M=150。有7個物品,物品不可以分割成任意大小。要求盡可能讓裝入背包中的物品總價值最大,但不能超過總容量。物品 A B C D E F G重量 35kg 30kg 6kg 50kg 40kg 10kg 25kg價值 10$ 40$ 30$ 50$ 35$ 40$ 30$分析:目標函數:∑pi最大約束條件是裝入的物品總重量不超過背包容量:∑wi 64輸出一個解,返回上一步驟c--(x,y) ← c計算(x,y)的八個方位的子結點,選出那些可行的子結點循環遍歷所有可行子結點,步驟c++重復2顯然⑵是一個遞歸調用的過程,大致如下:C++程序: #define N 8void dfs(int x,int y,int count){ int i,tx,ty; if(count>N*N) { output_solution();輸出一個解 return; } for(i=0; i>

問題二:收集各類貪心演算法(C語言編程)經典題目 tieba./...&tb=on網路的C語言貼吧。 全都是關於C的東西。

問題三:幾種經典演算法回顧 今天無意中從箱子里發現了大學時學演算法的教材《演算法設計與分析》,雖然工作這么幾年沒在什麼地方用過演算法,但演算法的思想還是影響深刻的,可以在系統設計時提供一些思路。大致翻了翻,重溫了一下幾種幾種經典的演算法,做一下小結。分治法動態規劃貪心演算法回溯法分支限界法分治法1)基本思想將一個問題分解為多個規模較小的子問題,這些子問題互相獨立並與原問題解決方法相同。遞歸解這些子問題,然後將這各子問題的解合並得到原問題的解。2)適用問題的特徵該問題的規模縮小到一定的程度就可以容易地解決該問題可以分解為若干個規模較小的相同問題,即該問題具有最優子結構性質該問題所分解出的各個子問題是相互獨立的,即子問題之間不包含公共的子問題3)關鍵如何將問題分解為規模較小並且解決方法相同的問題分解的粒度4)步驟分解->遞歸求解->合並 divide-and-conquer(P) { if ( | P | >

問題四:求三四個貪心演算法的例題(配源程序代碼,要帶說明解釋的)!非常感謝 貪心演算法的名詞解釋
ke./view/298415
第一個貪心演算法 (最小生成樹)
ke./view/288214
第二個貪心演算法 (Prim演算法)
ke./view/671819
第三個貪心演算法 (kruskal演算法)
ke./view/247951
演算法都有詳細解釋的

問題五:求 Java 一些經典例子演算法 前n項階乘分之一的和
public class jiecheng {
public static void main(String[] args)
{
double sum=0;
double j=1;
int n=10;
for(int i=1;i 問題六:關於編程的貪心法 定義
所謂貪心演算法(又稱貪婪演算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的局部最優解。 貪心演算法不是對所有問題都能得到整體最優解,但對范圍相當廣泛的許多問題他能產生整體最優解或者是整體最優解的近似解。
[編輯本段]貪心演算法的基本思路
1.建立數學模型來描述問題。 2.把求解的問題分成若干個子問題。 3.對每一子問題求解,得到子問題的局部最優解。 4.把子問題的解局部最優解合成原來解問題的一個解。 實現該演算法的過程: 從問題的某一初始解出發; while 能朝給定總目標前進一步 do 求出可行解的一個解元素; 由所有解元素組合成問題的一個可行解。 下面是一個可以試用貪心演算法解的題目,貪心解的確不錯,可惜不是最優解。
[編輯本段]例題分析
[背包問題]有一個背包,背包容量是M=150。有7個物品,物品不可以分割成任意大小。 要求盡可能讓裝入背包中的物品總價值最大,但不能超過總容量。 物品 A B C D E F G 重量 35 30 60 50 40 10 25 價值 10 40 30 50 35 40 30 分析: 目標函數: ∑pi最大 約束條件是裝入的物品總重量不超過背包容量:∑wi>

問題七:求解一貪心演算法問題 最快回答那個不懂別亂說,別誤人子弟。
這題標準的貪心演算法,甚至很多時候被當做貪心例題
要求平均等待時間,那麼就得用 總等待時間 / 人數
所以只用關心總等待時間,
如果數據大的在前面,那麼後面必然都要加一次這個時間,所以按從小到大排。
給你寫了個,自己看吧。
#include stdafx.h
#include
#include
#include
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int n;
float arr[105];
cin >> n;
for(int i = 0; i > arr[i];
sort(arr, arr+n);
int tnow = 0;
int tmax = 0;
for(int i = 0; i 問題八:分治演算法的應用實例 下面通過實例加以說明: 給你一個裝有1 6個硬幣的袋子。1 6個硬幣中有一個是偽造的,並且那個偽造的硬幣比真的硬幣要輕一些。你的任務是找出這個偽造的硬幣。為了幫助你完成這一任務,將提供一台可用來比較兩組硬幣重量的儀器,利用這台儀器,可以知道兩組硬幣的重量是否相同。比較硬幣1與硬幣2的重量。假如硬幣1比硬幣2輕,則硬幣1是偽造的;假如硬幣2比硬幣1輕,則硬幣2是偽造的。這樣就完成了任務。假如兩硬幣重量相等,則比較硬幣3和硬幣4。同樣,假如有一個硬幣輕一些,則尋找偽幣的任務完成。假如兩硬幣重量相等,則繼續比較硬幣5和硬幣6。按照這種方式,可以最多通過8次比較來判斷偽幣的存在並找出這一偽幣。另外一種方法就是利用分而治之方法。假如把1 6硬幣的例子看成一個大的問題。第一步,把這一問題分成兩個小問題。隨機選擇8個硬幣作為第一組稱為A組,剩下的8個硬幣作為第二組稱為B組。這樣,就把1 6個硬幣的問題分成兩個8硬幣的問題來解決。第二步,判斷A和B組中是否有偽幣。可以利用儀器來比較A組硬幣和B組硬幣的重量。假如兩組硬幣重量相等,則可以判斷偽幣不存在。假如兩組硬幣重量不相等,則存在偽幣,並且可以判斷它位於較輕的那一組硬幣中。最後,在第三步中,用第二步的結果得出原先1 6個硬幣問題的答案。若僅僅判斷硬幣是否存在,則第三步非常簡單。無論A組還是B組中有偽幣,都可以推斷這1 6個硬幣中存在偽幣。因此,僅僅通過一次重量的比較,就可以判斷偽幣是否存在。假設需要識別出這一偽幣。把兩個或三個硬幣的情況作為不可再分的小問題。注意如果只有一個硬幣,那麼不能判斷出它是否就是偽幣。在一個小問題中,通過將一個硬幣分別與其他兩個硬幣比較,最多比較兩次就可以找到偽幣。這樣,1 6硬幣的問題就被分為兩個8硬幣(A組和B組)的問題。通過比較這兩組硬幣的重量,可以判斷偽幣是否存在。如果沒有偽幣,則演算法終止。否則,繼續劃分這兩組硬幣來尋找偽幣。假設B是輕的那一組,因此再把它分成兩組,每組有4個硬幣。稱其中一組為B1,另一組為B2。比較這兩組,肯定有一組輕一些。如果B1輕,則偽幣在B1中,再將B1又分成兩組,每組有兩個硬幣,稱其中一組為B1a,另一組為B1b。比較這兩組,可以得到一個較輕的組。由於這個組只有兩個硬幣,因此不必再細分。比較組中兩個硬幣的重量,可以立即知道哪一個硬幣輕一些。較輕的硬幣就是所要找的偽幣。 在n個元素中找出最大元素和最小元素。我們可以把這n個元素放在一個數組中,用直接比較法求出。演算法如下:void maxmin1(int A[],int n,int *max,int *min){ int i;*min=*max=A[0];for(i=0;i *max) *max= A[i];if(A[i] >

問題九:回溯演算法的典型例題 八皇後問題:在8×8格的國際象棋上擺放八個皇後,使其不能互相攻擊,即任意兩個皇後都不能處於同一行、同一列或同一斜線上,問有多少種擺法。

問題十:什麼是演算法,都什麼,舉個例子,謝謝 演算法就是解決問題的具體的方法和步驟,所以具有以下性質:
1、有窮性: 一個演算法必須保證執行有限步之後結束(如果步驟無限,問題就無法解決)
2、確切性:步驟必須明確,說清楚做什麼。
3、輸入:即解決問題前我們所掌握的條件。
4、輸出:輸出即我們需要得到的答案。
5、可行性:邏輯不能錯誤,步驟必須有限,必須得到結果。
演算法通俗的講:就是解決問題的方法和步驟。在計算機發明之前便已經存在。只不過在計算機發明後,其應用變得更為廣泛。通過簡單的演算法,利用電腦的計算速度,可以讓問題變得簡單。

⑺ 分治演算法幾個經典例子

分治法,字面意思是「分而治之」,就是把一個復雜的1問題分成兩個或多個相同或相似的子問題,再把子問題分成更小的子問題直到最後子問題可以簡單地直接求解,原問題的解即子問題的解的合並,這個思想是很多高效演算法的基礎。

圖二

大整數乘法

Strassen矩陣乘法

棋盤覆蓋

合並排序

快速排序

線性時間選擇

最接近點對問題

循環賽日程表

漢諾塔

熱點內容
淘寶java下載 發布:2025-03-02 18:02:23 瀏覽:78
chrome瀏覽器android 發布:2025-03-02 17:55:01 瀏覽:838
暴富紅包源碼 發布:2025-03-02 17:54:58 瀏覽:252
學了伺服器和網路設備能幹什麼 發布:2025-03-02 17:54:56 瀏覽:79
上傳的協議 發布:2025-03-02 17:53:39 瀏覽:77
hibernate更新二級緩存 發布:2025-03-02 17:25:07 瀏覽:24
國泰策略價值靈活配置基金怎麼樣 發布:2025-03-02 17:24:59 瀏覽:724
java死機 發布:2025-03-02 17:24:58 瀏覽:113
lol和cf哪個對筆記本配置要求高 發布:2025-03-02 17:19:50 瀏覽:312
資料庫表內容 發布:2025-03-02 17:17:47 瀏覽:799