導(dǎo)讀: 計(jì)算機(jī)科學(xué)是算法與算法變換的科學(xué),算法是計(jì)算機(jī)科學(xué)的基石仲锄。 任何一個(gè)計(jì)算問題的分析與建模冰蘑,幾乎都可以歸為算法問題胸遇。?MapReduce算法模型是由Google公司針對(duì)大規(guī)模群組中的海量數(shù)據(jù)處理而提出的分布編程模型厌秒,主要應(yīng)用于大規(guī)模數(shù)據(jù)集{大于1TB}的分布并行運(yùn)算读拆。
在MapReduce模型中的Map{映射}和Reduce{化簡(jiǎn)}創(chuàng)意來自函數(shù)型編程語言,同是也繼承了向量型編程語言的特性鸵闪。 MapReduce模型能夠使程序員在不了解分布式并行編程的情況下檐晕,將自己書寫的程序在分布式系統(tǒng)上運(yùn)行。MapReduce模型主要實(shí)現(xiàn)了映射與化簡(jiǎn)兩個(gè)核心功能蚌讼,分別由Map和Reduce完成辟灰,這兩個(gè)函數(shù)也是函數(shù)型語言中常用的函數(shù),由用戶負(fù)責(zé)實(shí)現(xiàn)啦逆。
Map函數(shù)應(yīng)用于集合中的所有成員伞矩,然后返回一個(gè)基于這個(gè)處理的結(jié)果集。而Reduce函數(shù)是從兩個(gè)或更多個(gè)Map結(jié)果中夏志,通過多個(gè)線程乃坤、進(jìn)程或者獨(dú)立系統(tǒng)并行執(zhí)行處理的結(jié)果進(jìn)行分類和歸納。 一個(gè)Map函數(shù)用來把對(duì)映象成一組新的鍵值對(duì)沟蔑,Reduce函數(shù)用來對(duì)同一個(gè)鍵的值進(jìn)行合并湿诊。
下面給大家著重介紹一下函數(shù)式編程范式,函數(shù)式編程是一種編程范式瘦材,在這種編程范式中厅须,更多地使用了函數(shù)運(yùn)算。
函數(shù)型語言與函數(shù)式編程
函數(shù)型語言是一種典型的程序設(shè)計(jì)語言食棕。函數(shù)型語言的特點(diǎn)是把問題求解過程表示成塊結(jié)構(gòu)朗和,對(duì)調(diào)用塊的調(diào)用者來說,每個(gè)塊都有輸入數(shù)據(jù)和經(jīng)過加工處理后的輸出數(shù)據(jù)簿晓。每個(gè)塊的功能就如同函數(shù)的功能眶拉,例如LISP語言、ML語言等都屬于函數(shù)型語言憔儿。
利用函數(shù)型語言編程就是一種函數(shù)式編程忆植,函數(shù)式編程使用一系列的函數(shù)解決問題。任何一個(gè)函數(shù)僅接受輸入數(shù)據(jù)并產(chǎn)生輸出函數(shù)值谒臼,不包含任何能影響產(chǎn)生輸出的內(nèi)部狀態(tài)朝刊。任何情況下,使用相同的參數(shù)調(diào)用函數(shù)始終能得到一致的結(jié)果蜈缤。
在一個(gè)函數(shù)式的程序中拾氓,輸入數(shù)據(jù)要通過一系列的函數(shù),每個(gè)函數(shù)根據(jù)它的輸入產(chǎn)生輸出劫樟。函數(shù)式編程位于面向?qū)ο缶幊痰膶?duì)立面痪枫。面向?qū)ο缶幊掏ǔ0瑑?nèi)部狀態(tài){字段}和許多能修改這些狀態(tài)的函數(shù)织堂,程序運(yùn)行中則不斷的修改狀態(tài)。 函數(shù)式編程則極力避免狀態(tài)改動(dòng)奶陈。對(duì)于復(fù)雜的系統(tǒng)易阳,可以同時(shí)使用函數(shù)式編程和面向?qū)ο缶幊蹋谶@種混合應(yīng)用中吃粒,既采用了面向?qū)ο蠹夹g(shù)建模潦俺,還獲得了函數(shù)式編程風(fēng)格的優(yōu)點(diǎn)。
函數(shù)式編程的優(yōu)點(diǎn)
函數(shù)式編程具有如下優(yōu)點(diǎn):
1徐勃,邏輯可證
由于沒有邊界效應(yīng)事示,所以更容易從邏輯上證明程序正確性,而不是僅通過測(cè)試完成僻肖。
2肖爵,模塊化
函數(shù)式編程以簡(jiǎn)單為原則,一個(gè)函數(shù)只做一件事臀脏,將大的功能模塊拆分成盡可能小的功能模塊劝堪。小的功能模塊更易于閱讀和檢查錯(cuò)誤。
3揉稚,組件化
更容易利用簡(jiǎn)單的小函數(shù)加以組合形成新的功能更強(qiáng)的函數(shù)秒啦,體現(xiàn)了組件化的特點(diǎn)。
4搀玖,易于調(diào)試
細(xì)化的余境、定義清晰的函數(shù)能夠使得調(diào)試更加簡(jiǎn)單,當(dāng)程序運(yùn)行不正常時(shí)灌诅,每個(gè)函數(shù)都是檢查數(shù)據(jù)是否正確的連接口芳来,能更快速地排除沒有問題的代碼,定位到出現(xiàn)問題的地方猜拾。
5绣张,易于測(cè)試
函數(shù)不依賴于系統(tǒng)狀態(tài),無須在測(cè)試前構(gòu)造測(cè)試樁关带,更加容易編寫單元測(cè)試的代碼。
6沼撕,更高的生產(chǎn)率
函數(shù)式編程產(chǎn)生的代碼比其他技術(shù)更簡(jiǎn)潔宋雏,往往是其他技術(shù)的一半左右,并且更容易閱讀和維護(hù)务豺。
函數(shù)式編程的特征
1磨总,沒有副作用
函數(shù)程序由一系列函數(shù)對(duì)數(shù)據(jù)的變換構(gòu)成,因?yàn)楹瘮?shù)式編程中的每個(gè)符號(hào)都是最終的笼沥,所以從來沒有在某個(gè)地方修改過值蚪燕,也沒有函數(shù)修改過在其作用域之外的量并被其他函數(shù)使用娶牌。這表明函數(shù)求值的結(jié)果只是其返回值,而唯一影響其返回值的就是函數(shù)的參數(shù)馆纳,函數(shù)操作數(shù)據(jù)诗良,所以函數(shù)沒有產(chǎn)生副作用。
2鲁驶,無狀態(tài)的編程
在現(xiàn)實(shí)情況中鉴裹,狀態(tài)不可能一直保持不變,而狀態(tài)必然需要改變與傳遞钥弯,那么在函數(shù)式編程中的則是將其保存在函數(shù)的參數(shù)中径荔,作為函數(shù)的附屬品來傳遞。
3脆霎,輸入值和輸出值
在函數(shù)式編程中总处,只有輸入值和輸出值。函數(shù)式基本單位睛蛛,幾乎被用作所有部分鹦马,包括最簡(jiǎn)單的計(jì)算,甚至連變量都被計(jì)算所取代玖院。變量只是一個(gè)名稱菠红,而不是一個(gè)儲(chǔ)存單元,這是函數(shù)式編程與傳統(tǒng)的命令式編程最經(jīng)典的不同之處难菌。
在面向?qū)ο缶幊讨惺运荩瑢?duì)象傳來傳去。在函數(shù)式編程中郊酒,是將函數(shù)傳來傳去遇绞,又將這個(gè)函數(shù)稱為高階函數(shù)。在數(shù)學(xué)和計(jì)算機(jī)科學(xué)中燎窘,高階函數(shù)是至少滿足下列一個(gè)條件的函數(shù):
@ 接受一個(gè)或多個(gè)函數(shù)作為輸入摹闽。
@輸出一個(gè)函數(shù)值。
好了褐健,今天就分享到這付鹿,下次將給大家分享映射函數(shù)與化簡(jiǎn)函數(shù),希望大家多多關(guān)注哦蚜迅!對(duì)大數(shù)據(jù)感興趣的可以加入大數(shù)據(jù)群:725197860