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

13演算法案例

發布時間: 2022-04-11 14:07:44

A. 十三張撲克演算法

積分規則演算法如下:

1、牌面大小順序:A>K>Q>J>10>9>8>7>6>5>4>3>2。

2、牌型大小順序:一條龍>同花順>四條>葫蘆>同花>順子>三條>兩對>對子>散牌(烏龍)。

3、贏一墩:同一墩,大於其他某個玩家,自己加1注(頭墩加1注,中墩加2注,底墩加3注)。

4、輸一墩:同一墩,小於其他某個玩家,自己減1注(頭墩減1注,中墩減2注,底墩減3注)。

5、強碰(打和):同一墩,與其他玩家大小一樣,自己加0注。

游戲規則:

四人中一人為莊家,(也可以四人對比,) 莊家把除去大小王的一副牌牌分成四份,每份十三張。開牌前,各閑家向莊家下注。

各人把十三張牌排成三段(道),稱頭(道)、二道及尾(道)。頭有三張,二道及尾各五張。頭道必須小於二道,二道必須小於尾道,否則稱為「相公」。凡「相公」者全賠。

頭段因為只有三張牌,因此不算順、花。只可能是不成花式(稱無頭),一對或三條。各人排好牌後,打開牌跟莊家比較大小。頭跟頭比,二道跟二道比,尾跟尾比。

比較時,先比牌型。牌型相同時,比點數。部分玩法的規則,比點數時由最大點數的牌比起,相同時比第二大的牌,如此類推。倘若完全相同,比最大點數牌的花色。

部分玩法的規則訂成對莊家稍為有利:只比點數最大的一隻牌。倘若相同,一律由莊家勝。任何一方遇上以下的組合通吃,稱為「報到」。

B. 13×14的數學最快演算法

13的二次方+13=169+13=182

C. 13開根號是多少

√13是一個無理數,等於3.605551275464.....

開根號就像求一個數的幾次方的反義詞一樣,比如3的2次方是9,那麼9開根號2就是3。在中學階段,涉及開平方的計算,一是查數學用表,一是利用計算器。而在解題時用的最多的是利用分解質因數來解決。

根號是一個數學符號。根號是用來表示對一個數或一個代數式進行開方運算的符號。若aⁿ=b,那麼a是b開n次方的n次方根或a是b的1/n次方。開n次方手寫體和印刷體用表示,被開方的數或代數式寫在符號左方√ ̄的右邊和符號上方一橫部分的下方共同包圍的區域中,而且不能出界。

(3)13演算法案例擴展閱讀:

1、寫根號:

先在格子中間畫向右上角的短斜線,然後筆畫不斷畫右下中斜線,同樣筆畫不斷畫右上長斜線再在格子接近上方的地方根據自己的需要畫一條長度適中的橫線,不夠再補足。(這里只重點介紹筆順和寫法,可以根據印刷體參考本條模仿寫即可,不硬性要求)

2、寫被開方的數或式子:

被開方的數或代數式寫在符號左方v形部分的右邊和符號上方一橫部分的下方共同包圍的區域中,而且不能出界,若被開方的數或代數式過長,則上方一橫必須延長確保覆蓋下方的被開方數或代數式。

3、寫開方數或者式子:

開n次方的n寫在符號√ ̄的左邊,n=2(平方根)時n可以忽略不寫,但若是立方根(三次方根)、四次方根等,是必須書寫。

一般來說能夠開方開的盡的,算一兩次基本結果就出來了。舉個例子:計算469225的平方根。首先我們發現600^2<469225<700^2,我們可以挑選650作為第一次計算的數。即算 (650+469225/650)/2得到685.9。而685附近只有685^2末尾數字是5,因此685^2=469225
對於那些開方開不盡的數,用這種方法算兩三次精度就很可觀了,一般達到小數點後好幾位。實際中這種演算法也是計算機用於開方的演算法。

D. 13乘3有幾種不同的演算法

1、13×3=39
2、13×3=13+13+13=39
3、13×3=(10+3)×3=10×3+3×3=39

E. 二十四點1~13各種演算法及運算過程

首先要對789很敏感
無論什麼數 先往789上湊

其餘的不知道怎麼說。。。每什麼明顯規律

F. 分治演算法的應用實例

下面通過實例加以說明: 給你一個裝有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 <= n;i++)
{ if(A[i]> *max) *max= A[i];
if(A[i] < *min) *min= A[i];
}
}
上面這個演算法需比較2(n-1)次。能否找到更好的演算法呢?我們用分治策略來討論。
把n個元素分成兩組:
A1={A[1],...,A[int(n/2)]}和A2={A[INT(N/2)+1],...,A[N]}
分別求這兩組的最大值和最小值,然後分別將這兩組的最大值和最小值相比較,求出全部元素的最大值和最小值。如果A1和A2中的元素多於兩個,則再用上述方法各分為兩個子集。直至子集中元素至多兩個元素為止。
例如有下面一組元素:-13,13,9,-5,7,23,0,15。用分治策略比較的演算法如下:
void maxmin2(int A[],int i,int j,int *max,int *min)
/*A存放輸入的數據,i,j存放數據的范圍,初值為0,n-1,*max,*min 存放最大和最小值*/
{ int mid,max1,max2,min1,min2;
if (j==i) {最大和最小值為同一個數;return;}
if (j-1==i) {將兩個數直接比較,求得最大會最小值;return;}
mid=(i+j)/2;
求i~mid之間的最大最小值分別為max1,min1;
求mid+1~j之間的最大最小值分別為max2,min2;
比較max1和max2,大的就是最大值;
比較min1和min2,小的就是最小值;
} 題目:在一個(2^k)*(2^k)個方格組成的棋盤上,有一個特殊方格與其他方格不同,稱為特殊方格,稱這樣的棋盤為一個特殊棋盤。我們要求對棋盤的其餘部分用L型方塊填滿(註:L型方塊由3個單元格組成。即圍棋中比較忌諱的愚形三角,方向隨意),且任何兩個L型方塊不能重疊覆蓋。L型方塊的形態如下:
題目的解法使用分治法,即子問題和整體問題具有相同的形式。我們對棋盤做一個分割,切割一次後的棋盤如圖1所示,我們可以看到棋盤被切成4個一樣大小的子棋盤,特殊方塊必定位於四個子棋盤中的一個。假設如圖1所示,特殊方格位於右上角,我們把一個L型方塊(灰色填充)放到圖中位置。這樣對於每個子棋盤又各有一個「特殊方塊」,我們對每個子棋盤繼續這樣分割,直到子棋盤的大小為1為止。
用到的L型方塊需要(4^k-1)/3 個,演算法的時間是O(4^k),是漸進最優解法。
本題目的C語言的完整代碼如下(TC2.0下調試),運行時,先輸入k的大小,(1<=k<=6),然後分別輸入特殊方格所在的位置(x,y), 0<=x,y<=(2^k-1)。 #include<stdio.h>//#include<conio.h>//#include<math.h>inttitle=1;intboard[64][64];voidchessBoard(inttr,inttc,intdr,intdc,intsize){ints,t;if(size==1)return;t=title++;s=size/2;if(dr<tr+s&&dc<tc+s)chessBoard(tr,tc,dr,dc,s);else{board[tr+s-1][tc+s-1]=t;chessBoard(tr,tc,tr+s-1,tc+s-1,s);}if(dr<tr+s&&dc>=tc+s)chessBoard(tr,tc+s,dr,dc,s);else{board[tr+s-1][tc+s]=t;chessBoard(tr,tc+s,tr+s-1,tc+s,s);}if(dr>=tr+s&&dc<tc+s)chessBoard(tr+s,tc,dr,dc,s);else{board[tr+s][tc+s-1]=t;chessBoard(tr+s,tc,tr+s,tc+s-1,s);}if(dr>=tr+s&&dc>=tc+s)chessBoard(tr+s,tc+s,dr,dc,s);else{board[tr+s][tc+s]=t;chessBoard(tr+s,tc+s,tr+s,tc+s,s);}}voidmain(){intdr=0,dc=0,s=1,i=0,j=0;printf(printinthesizeofchess: );scanf(%d,&s);printf(printinspecalpointx,y: );scanf(%d%d,&dr,&dc);if(dr<s&&dc<s){chessBoard(0,0,dr,dc,s);for(i=0;i<s;i++){for(j=0;j<s;j++){printf(%4d,board[i][j]);}printf( );}}elseprintf(thewrongspecalpoint!! );getch();}

G. 一個2一個3一個5等於13有多少種演算法

1,2的3次方+5=13
2,2*5+3=13
3,3*5-2=13
共三種演算法。

H. 黃金分割點的演算法,要具體的。給個數字13。要所有算的步驟。謝勒

黃金分割點
(golden section ratio)
在分割時.在長度為全長的約0.618處進行分割.就叫作黃金分割.這個分割點就叫做黃金分割點

把一條線段分割為兩部分,使其中一部分與全長之比等於另一部分與這部分之比。其比值是一個無理數,用分數表示為√5-1/2,取其前三位數字的近似值是0.618。由於按此比例設計的造型十分美麗,因此稱為黃金分割,也稱為中外比。這是一個十分有趣的數字,我們以0.618來近似表示,通過簡單的計算就可以發現:

1/0.618=1.618

(1-0.618)/0.618=0.618

這個數值的作用不僅僅體現在諸如繪畫、雕塑、音樂、建築等藝術領域,而且在管理、工程設計等方面也有著不可忽視的作用。

讓我們首先從一個數列開始,它的前面幾個數是:1、1、2、3、5、8、13、21、34、55、89、144…..這個數列的名字叫做"菲波那契數列",這些數被稱為"菲波那契數"。特點是即除前兩個數(數值為1)之外,每個數都是它前面兩個數之和。

菲波那契數列與黃金分割有什麼關系呢?經研究發現,相鄰兩個菲波那契數的比值是隨序號的增加而逐漸趨於黃金分割比的。即f(n)/f(n-1)-→0.618…。由於菲波那契數都是整數,兩個整數相除之商是有理數,所以只是逐漸逼近黃金分割比這個無理數。但是當我們繼續計算出後面更大的菲波那契數時,就會發現相鄰兩數之比確實是非常接近黃金分割比的。

一個很能說明問題的例子是五角星/正五邊形。五角星是非常美麗的,我們的國旗上就有五顆,還有不少國家的國旗也用五角星,這是為什麼?因為在五角星中可以找到的所有線段之間的長度關系都是符合黃金分割比的。正五邊形對角線連滿後出現的所有三角形,都是黃金分割三角形。

由於五角星的頂角是36度,這樣也可以得出黃金分割的數值為2Sin18度。

黃金分割點約等於0.618:1

是指把一線段分為兩部分,使得原來線段的長跟較長的那部分的比為黃金分割的點。線段上有兩個這樣的點。

利用線段上的兩黃金分割點,可作出正五角星,正五邊形。

2000多年前,古希臘雅典學派的第三大算學家歐道克薩斯首先提出黃金分割。所謂黃金分割,指的是把長為L的線段分為兩部分,使其中一部分對於全部之比,等於另一部分對於該部分之比。而計算黃金分割最簡單的方法,是計算斐波那契數列1,1,2,3,5,8,13,21,...後二數之比2/3,3/5,4/8,8/13,13/21,...近似值的。

黃金分割在文藝復興前後,經過阿拉伯人傳入歐洲,受到了歐洲人的歡迎,他們稱之為"金法",17世紀歐洲的一位數學家,甚至稱它為"各種演算法中最可寶貴的演算法"。這種演算法在印度稱之為"三率法"或"三數法則",也就是我們現在常說的比例方法。

其實有關"黃金分割",我國也有記載。雖然沒有古希臘的早,但它是我國古代數學家獨立創造的,後來傳入了印度。經考證。歐洲的比例演算法是源於我國而經過印度由阿拉伯傳入歐洲的,而不是直接從古希臘傳入的。

因為它在造型藝術中具有美學價值,在工藝美術和日用品的長寬設計中,採用這一比值能夠引起人們的美感,在實際生活中的應用也非常廣泛,建築物中某些線段的比就科學採用了黃金分割,舞台上的報幕員並不是站在舞台的正中央,而是偏在台上一側,以站在舞台長度的黃金分割點的位置最美觀,聲音傳播的最好。就連植物界也有採用黃金分割的地方,如果從一棵嫩枝的頂端向下看,就會看到葉子是按照黃金分割的規律排列著的。在很多科學實驗中,選取方案常用一種0.618法,即優選法,它可以使我們合理地安排較少的試驗次數找到合理的西方和合適的工藝條件。正因為它在建築、文藝、工農業生產和科學實驗中有著廣泛而重要的應用,所以人們才珍貴地稱它為"黃金分割"。

黃金分割(Golden Section)是一種數學上的比例關系。黃金分割具有嚴格的比例性、藝術性、和諧性,蘊藏著豐富的美學價值。應用時一般取1.618 ,就像圓周率在應用時取3.14一樣。

發現歷史

由於公元前6世紀古希臘的畢達哥拉斯學派研究過正五邊形和正十邊形的作圖,因此現代數學家們推斷當時畢達哥拉斯學派已經觸及甚至掌握了黃金分割。

公元前4世紀,古希臘數學家歐多克索斯第一個系統研究了這一問題,並建立起比例理論。

公元前300年前後歐幾里得撰寫《幾何原本》時吸收了歐多克索斯的研究成果,進一步系統論述了黃金分割,成為最早的有關黃金分割的論著。

中世紀後,黃金分割被披上神秘的外衣,義大利數家帕喬利稱中末比為神聖比例,並專門為此著書立說。德國天文學家開普勒稱黃金分割為神聖分割。

到19世紀黃金分割這一名稱才逐漸通行。黃金分割數有許多有趣的性質,人類對它的實際應用也很廣泛。最著名的例子是優選學中的黃金分割法或0.618法,是由美國數學家基弗於1953年首先提出的,70年代在中國推廣。

|..........a...........|

+-------------+--------+ -

| | | .

| | | .

| B | A | b

| | | .

| | | .

| | | .

+-------------+--------+ -

|......b......|..a-b...|

通常用希臘字母 表示這個值。

黃金分割奇妙之處,在於其比例與其倒數是一樣的。例如:1.618的倒數是0.618,而1.618:1與1:0.618是一樣的。

確切值為根號5+1/2

黃金分割數是無理數,前面的2000位為:
0.6180339887 4989484820 4586834365 6381177203 0917980576 : 50
2862135448 6227052604 6281890244 9707207204 1893911374 : 100
8475408807 5386891752 1266338622 2353693179 3180060766 : 150
7263544333 8908659593 9582905638 3226613199 2829026788 : 200
0675208766 8925017116 9620703222 1043216269 5486262963 : 250
1361443814 9758701220 3408058879 5445474924 6185695364 : 300
8644492410 4432077134 4947049565 8467885098 7433944221 : 350
2544877066 4780915884 6074998871 2400765217 0575179788 : 400
3416625624 9407589069 7040002812 1042762177 1117778053 : 450
1531714101 1704666599 1466979873 1761356006 7087480710 : 500

1317952368 9427521948 4353056783 0022878569 9782977834 : 550
7845878228 9110976250 0302696156 1700250464 3382437764 : 600
8610283831 2683303724 2926752631 392473 1671112115 : 650
8818638513 3162038400 5222165791 2866752946 5490681131 : 700
7159934323 5973494985 0904094762 1322298101 7261070596 : 750
1164562990 9816290555 2085247903 5240602017 2799747175 : 800
3427775927 7862561943 2082750513 1218156285 5122248093 : 850
9471234145 1702237358 0577278616 0086883829 5230459264 : 900
7878017889 9219902707 7690389532 1968198615 1437803149 : 950
9741106926 0886742962 2675756052 3172777520 3536139362 : 1000

1076738937 6455606060 5921658946 6759551900 4005559089 : 1050
5022953094 2312482355 2122124154 4400647034 0565734797 : 1100
6639723949 4994658457 8873039623 0903750339 9385621024 : 1150
2369025138 6804145779 9569812244 5747178034 1731264532 : 1200
2041639723 2134044449 4873023154 1767689375 2103068737 : 1250
8803441700 9395440962 7955898678 7232095124 2689355730 : 1300
9704509595 6844017555 1988192180 2064052905 5189349475 : 1350
9260073485 2282101088 1946445442 2231889131 9294689622 : 1400
0023014437 7026992300 780308 1807545192 8877050210 : 1450
9684249362 7135925187 6077788466 5836150238 9134933331 : 1500

2231053392 3213624319 2637289106 7050339928 2265263556 : 1550
2090297986 4247275977 2565508615 4875435748 2647181414 : 1600
5127000602 3890162077 7322449943 5308899909 5016803281 : 1650
1219432048 1964387675 8633147985 7191139781 5397807476 : 1700
1507722117 5082694586 3932045652 0989698555 6781410696 : 1750
8372884058 7461033781 0544439094 3683583581 3811311689 : 1800
9385557697 5484149144 5341509129 5407005019 4775486163 : 1850
0754226417 2939468036 7319805861 8339183285 9913039607 : 1900
2014455950 4497792120 7612478564 5916160837 0594987860 : 1950
0697018940 9886400764 4361709334 1727091914 3365013715 : 2000

我們常常聽說有「黃金分割」這個詞,「黃金分割」當然不是指的怎樣分割黃金,這是一個比喻的說法,就是說分割的比例像黃金一樣珍貴。那麼這個比例是多少呢?是0.618。人們把這個比例的分割點,叫做黃金分割點,把0.618叫做黃金數。並且人們認為如果符合這一比例的話,就會顯得更美、更好看、更協調。在生活中,對「黃金分割」有著很多的應用。

最完美的人體:肚臍到腳底的距離/頭頂到腳底的距離=0.618

最漂亮的臉龐:眉毛到脖子的距離/頭頂到脖子的距離=0.618

I. 蛇形分組法的具體例子

蛇行分組法:首先將運動員按成績排序,再根據需排的組數,按蛇行走向將運動員排列分成不同的小組;如果同組中有多個同單位的運動員,只能就近上下調整.然後抽簽排定各組的比賽順序和運動員的比賽道次
A B C D
1 2 3 4
8 7 6 5
9 10 11 12
16 15 14 13

演算法.
1)把1,2號挑出來.(1/2)
2)把3,4號從右向左分別配給2,1號.(1/4, 2/3)
3)把5,6,7,8號從左向右分別配給前4號.(1/5, 4/6, 2/7, 3/8)
4)把9-16號從右向左分別配給前8號.(1/16, 5/15, 4/14, 6/13, 2/12, 7/11, 3/10, 8/9)
........
上面演算法的基本思想是:
把1,2號種子選出來, 為了避免他們過早相遇, 我們用3,4號選手分別配給他們, 即插入他們中間形成(1/4)(2/3)的對陣. 然後再用5,6號選擇把(1/4)拆開形成(1/5)(4/6)的對陣, 用7,8號選手把(2/3)拆開形成(2/7)(3/8)的對陣......
每次插入新的選手時, 使用蛇形次序, 即第一次從右到左, 第二次從左到右....
經過多次拆分插入後, 每次獲得的對陣表如同下面的三角形所示:
1/2
1/4,│ 2/3
1/5, 4/6,│ 2/7, 3/8
1/16, 5/15, 4/14, 6/13,│ 2/12, 7/11, 3/10, 8/9

如果是32個選手, 就繼續把17配給1號, 18配給16號, 19配5, 20配15, 21配4, 22配14.........即上面最後一行, 由左到右依次分配.

這樣種子們就分散開了. 相鄰組的勝者進行淘汰賽也不會有種子過早相遇. 其實上述四個步驟中的配對也就是種子們獲勝後的配對形式. 上述演算法將所有排好後, 相鄰兩組的四個人可以組成一個小組打循環賽.

J. 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

熱點內容
python更改目錄 發布:2024-11-15 08:41:08 瀏覽:264
伺服器快閃記憶體可以裝在一般電腦上嗎 發布:2024-11-15 08:36:46 瀏覽:7
安卓手機怎麼查詢自己的路線軌跡 發布:2024-11-15 08:32:19 瀏覽:968
phpdatet 發布:2024-11-15 08:32:17 瀏覽:506
HDB3編解碼實驗 發布:2024-11-15 08:17:31 瀏覽:211
怪星球編程 發布:2024-11-15 08:15:55 瀏覽:843
慧編程價格 發布:2024-11-15 08:14:09 瀏覽:458
python多行注釋的快捷鍵 發布:2024-11-15 08:09:14 瀏覽:956
c1腳本病毒 發布:2024-11-15 07:59:04 瀏覽:611
為什麼淘寶上的阿里雲伺服器便宜 發布:2024-11-15 07:58:49 瀏覽:547