第一篇:火龍果軟件-UMLATM設(shè)計(jì)文檔
火龍果?整理 uml.org.cn
UML實(shí)驗(yàn)報(bào)告
2.用例建模
掌握客戶需求分析的方法和步驟 了解以用例驅(qū)動(dòng)的軟件開發(fā)方法 掌握用例圖的畫法
掌握用Rose或PowerDesigner進(jìn)行用例建模的具體方法和步驟
1.ATM系統(tǒng)用例圖:
存款現(xiàn)金管理取款客戶修改密碼銀行管理員維護(hù)ATM設(shè)備轉(zhuǎn)賬余額查詢
2.這個(gè)ATM系統(tǒng)主要顯示了對客戶提供存取款,轉(zhuǎn)賬,余額查詢和密碼修改的功能,以及銀行管理員對客戶修改密碼,現(xiàn)金和ATM設(shè)備維護(hù)的操作。3.描述用例 “取款”用例 用例編號(hào):0671 用例名:轉(zhuǎn)賬 執(zhí)行者:.人執(zhí)行者:客戶
.系統(tǒng)執(zhí)行者:取款子系統(tǒng) 目的:執(zhí)行取款任務(wù) 類型:端點(diǎn) 主要的 基本的 級(jí)別:一級(jí) 過程描述: 1.插卡
2.輸入密碼
3.輸入取款金額確定
4.取款打印憑條
5.退出系統(tǒng) “查詢”用例 用例編號(hào):0670
火龍果?整理 uml.org.cn
用例名:查詢賬戶 執(zhí)行者:.人執(zhí)行者:客戶
.系統(tǒng)執(zhí)行者:查詢子系統(tǒng) 目的:執(zhí)行查詢?nèi)蝿?wù) 類型:端點(diǎn) 主要的 基本的 級(jí)別:一級(jí) 過程描述: 1.插卡
2.輸入密碼
3.查詢賬號(hào)
4.人名幣查詢
5.查詢打印憑條
6.退出系統(tǒng)
“修改密碼”用例 用例編號(hào):0669 用例名:修改密碼 執(zhí)行者:
.人執(zhí)行者:客戶、銀行工作人員.系統(tǒng)執(zhí)行者:修改密碼子系統(tǒng) 目的:執(zhí)行修改密碼任務(wù) 類型:端點(diǎn) 主要的 基本的 級(jí)別:一級(jí) 過程描述:1.插卡
2.輸入密碼
3.修改密碼
4.輸入新密碼
5.再次輸入新密碼
6.修改成功退出系統(tǒng)
“轉(zhuǎn)賬”用例 用例編號(hào):0668 用例名:轉(zhuǎn)賬 執(zhí)行者:.人執(zhí)行者:客戶
.系統(tǒng)執(zhí)行者:轉(zhuǎn)賬子系統(tǒng) 目的:執(zhí)行轉(zhuǎn)賬任務(wù) 類型:端點(diǎn) 主要的 基本的 級(jí)別:一級(jí) 過程描述:1.插卡。
2.輸入密碼。
3.進(jìn)入轉(zhuǎn)賬界面。
4.輸入轉(zhuǎn)入卡號(hào)或賬號(hào)(只能同行轉(zhuǎn)賬)。
5.再次輸入卡號(hào)或賬號(hào)。
火龍果?整理 uml.org.cn
6.輸入轉(zhuǎn)入金額確定。
7.退出系統(tǒng) “現(xiàn)金管理”用例 用例編號(hào):0667 用例名:現(xiàn)金管理 執(zhí)行者:
.人執(zhí)行者:銀行管理員.系統(tǒng)執(zhí)行者:現(xiàn)金管理子系統(tǒng) 目的:執(zhí)行現(xiàn)金管理任務(wù) 類型:端點(diǎn) 主要的 基本的 級(jí)別:一級(jí)
過程描述: 1.進(jìn)入銀行系統(tǒng)
2.進(jìn)行添加現(xiàn)金操作
3.退出系統(tǒng) “維護(hù)ATM設(shè)備”用例 用例編號(hào):0667 用例名:維護(hù)ATM設(shè)備 執(zhí)行者:
.人執(zhí)行者:銀行管理員
.系統(tǒng)執(zhí)行者:維護(hù)ATM設(shè)備子系統(tǒng) 目的:執(zhí)行現(xiàn)金管理任務(wù) 類型:端點(diǎn) 主要的 基本的 級(jí)別:一級(jí)
過程描述: 1.進(jìn)入銀行系統(tǒng)
2.對ATM設(shè)備進(jìn)行檢查
3.對ATM設(shè)備進(jìn)行相應(yīng)維護(hù)
4.退出系統(tǒng)
3.活動(dòng)圖建模
了解活動(dòng)圖建模的概念
掌握描述一個(gè)操作執(zhí)行過程中所完成工作(動(dòng)作)的方法 掌握描述對象內(nèi)部工作的具體步驟
ATM取款子系統(tǒng)活動(dòng)圖:
火龍果?整理 uml.org.cn 客戶需求分析規(guī)格說明書/系統(tǒng)分析規(guī)格說明書
了解用包模型來描述系統(tǒng)體系結(jié)構(gòu)(用例模型)的方法 掌握用Rose或PowerDesigner進(jìn)行包圖建模的具體方法和步驟
火龍果?整理 uml.org.cn
掌握書寫客戶需求規(guī)格說明書的基本格式
5.類建模
? 對象類建模
理解面向?qū)ο笙到y(tǒng)分析和對象類建模的概念 了解和掌握面向?qū)ο笙到y(tǒng)分析的方法和步驟 了解和掌握尋找待開發(fā)系統(tǒng)中類的方法和技巧 掌握使用Rose或PowerDesigner建立類模型的方法
? 類的繼承建模
理解類之間的繼承關(guān)系
了解和掌握分析類之間繼承關(guān)系的方法
掌握使用Rose或PowerDesigner建立類之間繼承關(guān)系模型的過程
? 對象類關(guān)聯(lián)關(guān)系建模
理解面向?qū)ο箢愔g關(guān)聯(lián)關(guān)系的概念 了解和掌握分析類之間的關(guān)聯(lián)關(guān)系的方法
了解和掌握待開發(fā)系統(tǒng)中類之間關(guān)聯(lián)關(guān)系的分析方法
掌握使用Rose或PowerDesigner如何對關(guān)聯(lián)關(guān)系進(jìn)行建模的過程
許多單個(gè)的帳戶組成了帳戶庫。帳戶具有帳戶類型、帳戶號(hào)、余額三個(gè)屬性,均為private,其類型分別為char,int,double。六個(gè)操作分別為setType、getType、getAccountNumbe、setAccountNumbe、caculateBalance、getBalance,除caculateBalance為protected其余均為public。
setType設(shè)置帳戶類型,返回類型為void,參數(shù)類型為char,輸入帳戶類型。
getType獲取帳戶類型,返回類型為char,無參數(shù)。
setAccountNumbe設(shè)置帳戶號(hào),返回類型為void,參數(shù)類型為int,輸入帳戶號(hào)。
getAccountNumbe獲取帳戶號(hào),返回類型為int,無參數(shù)。
caculateBalance計(jì)算余額,返回類型為void,參數(shù)為double,第一個(gè)參數(shù)為輸入存取款數(shù)額,第二個(gè)參數(shù)為存款余額,既為輸入也為輸出。
getBalance獲取帳戶余額,返回類型為double,無參數(shù)。
許多銀行儲(chǔ)戶組成了儲(chǔ)戶庫。ATM系統(tǒng)包含了許多ATM機(jī)。銀行儲(chǔ)戶及ATM機(jī)兩個(gè)類包含哪些屬性,哪些操作,它們的可見性及操作的返回類型、參數(shù)個(gè)數(shù)、參數(shù)類型從類圖上都一目了然。更多的屬性及操作都可以一一加上,使這個(gè)類圖更詳細(xì)更完整,從而使參與項(xiàng)目的每個(gè)成員都能無歧義的明了整個(gè)設(shè)計(jì)的類的結(jié)構(gòu)。同樣對于一個(gè)真正的銀行系統(tǒng),這個(gè)類圖過于簡單。比如帳戶類型我們可以先定義一個(gè)abstract class,它包含一個(gè)帳戶最基本的屬性及操作。而有些操作先定義為abstract,如余額的計(jì)算。然后再繼承這個(gè)abstract class,我們可以有saving account 和checking account等等。不同的帳戶有不同的余額計(jì)算方法,我們可以加上具體的算法。對于不同的帳戶可能還有一些它特有的操作,我們也可以加上,比如saving account在存款達(dá)到多少時(shí)可以享受機(jī)票打折的優(yōu)惠。
對象類關(guān)聯(lián)關(guān)系圖:
火龍果?整理 uml.org.cn
銀行0..10..10..*0..10..1賬號(hào)庫0..*銀行儲(chǔ)戶庫ATM系統(tǒng)0..10..10..10..*賬戶---++++++賬戶類型: char賬戶號(hào)·: int余額: DoublesetType()getType()setAccountNumbe()getAccountNumbe()caculateBalance()getBalance()0..*1..*銀行儲(chǔ)戶: char: char: void: int: Double: Double---+++用戶姓名: int用戶ID: int用戶密碼: int存錢(): int取錢(): int其他操作(): intATM機(jī)0..*0..*-+++ATM機(jī)ID: int收款(): int吐款(): int其他服務(wù)(): int1..*0..1 順序圖建模
理解順序圖的基本概念
了解和掌握軟件工程中用例邏輯時(shí)序的分析方法 了解和掌握待開發(fā)系統(tǒng)中順序圖的設(shè)計(jì)和實(shí)現(xiàn) 掌握使用Rose或PowerDesigner創(chuàng)建順序圖的方法
下圖描述了顧客在ATM機(jī)上取款時(shí)信息的流動(dòng)情況。以時(shí)間為順序。因?yàn)閮H是示例,所以整個(gè)過程是沒有出現(xiàn)任何故障時(shí)的流程,并且只畫到了取款結(jié)束。通過這個(gè)圖,我們可以看出消息是如何在系統(tǒng)中不同對象之間進(jìn)行交互。
通過流程圖我們可以很清楚地看到系統(tǒng)是如何工作的,系統(tǒng)各部分之間的信息及控制是如何發(fā)送的,整個(gè)流程是否合理。流程圖對我們的設(shè)計(jì)起到了很好的幫助作用。注意在本圖沒有一個(gè)生命線終端有一個(gè)“X”,這是因?yàn)檫@個(gè)流程中還未遇到有對象生命結(jié)束。當(dāng)有對象生命結(jié)束時(shí)需在對應(yīng)的生命線終端畫“X”,表明這個(gè)對象在這時(shí)被銷毀。
首先銀行儲(chǔ)戶將ATM卡插入讀卡機(jī),讀卡機(jī)將信息傳給客戶管理,客戶管理提出查詢密碼,顯示部分將輸入密碼請求顯示出來…..ATM取款順序圖 :
火龍果?整理 uml.org.cn
順序客戶讀卡器顯示設(shè)備輸入設(shè)備ATM數(shù)據(jù)庫點(diǎn)鈔機(jī)銀行數(shù)據(jù)庫插入ATM卡接受ATM卡顯示輸入密碼請求查詢密碼輸入密碼密碼傳遞請求確認(rèn)密碼合法性詢問服務(wù)類別顯示輸入服務(wù)類別請求輸入取款請求取款請求確認(rèn)密碼合法性詢問取款數(shù)額顯示輸入數(shù)額請求輸入取款數(shù)額傳遞取款數(shù)額顯示確認(rèn)數(shù)額請求詢問取款數(shù)額確認(rèn)確認(rèn)輸入傳遞確認(rèn)信息數(shù)額合法性確認(rèn)請求確認(rèn)數(shù)額合法性出鈔請求出鈔取鈔詢問是否打印憑條顯示詢問是否打印憑條確定請求退出取出ATM卡 火龍果?整理 uml.org.cn 合作圖建模
了解合作圖的概念及其在系統(tǒng)設(shè)計(jì)中的作用 掌握兩種交互圖(順序圖和合作圖)的差別 熟悉和掌握合作圖案例的分析方法
掌握使用Rose或PowerDesigner依據(jù)用例繪制合作圖
合作圖和順序圖是可以無信息損失的相互轉(zhuǎn)換,只是它們的側(cè)重點(diǎn)是不一樣的。順序圖著重于對象間消息傳遞的時(shí)間順序,合作圖著重于表達(dá)對象之間的靜態(tài)連接關(guān)系。下圖將順序圖轉(zhuǎn)換為合作圖。
ATM系統(tǒng)協(xié)作圖 :
1.插入ATM卡
2.接受ATM卡
3.查詢密碼
4.顯示輸入密碼請求
5.輸入密碼
6.密碼傳遞
7.請求確認(rèn)密碼合法性
8.確認(rèn)密碼合法性
9.詢問服務(wù)類別
10.顯示輸入服務(wù)服務(wù)類別請求
11.輸入取款請求
12.取款請求
13.詢問取款數(shù)額
14.顯示輸入數(shù)額請求
15.輸入取款數(shù)額
16.傳遞取款數(shù)額
17.詢問取款數(shù)額確認(rèn)
火龍果?整理 uml.org.cn
18.顯示確認(rèn)數(shù)額請求
19.輸入確認(rèn)
20.傳遞確認(rèn)信息
21.?dāng)?shù)額合法性確認(rèn)請求
22.確認(rèn)數(shù)額和法性
23.出鈔請求
24.計(jì)算帳戶余額
25.出鈔
26.取鈔
27.傳遞余額并詢問是否還需要其他服務(wù)
28.顯示帳戶余額并提示選擇下面的服務(wù) 狀態(tài)圖建模
了解狀態(tài)圖的概念及其在系統(tǒng)設(shè)計(jì)中的作用
掌握使用Rose或PowerDesigner依據(jù)用例繪制對象的狀態(tài)圖
下圖描述了顧客在ATM機(jī)上進(jìn)行操作會(huì)經(jīng)歷的幾種狀態(tài),及各種狀態(tài)之間轉(zhuǎn)換的條件。因?yàn)槭呛喕说睦?,所以除了等待顧客插入磁卡的起始狀態(tài)和結(jié)束服務(wù)的終止?fàn)顟B(tài),顧客會(huì)處于輸入密碼、選擇服務(wù)類型、存款及取款四種狀態(tài)。
ATM狀態(tài)圖:
插入磁卡后進(jìn)入輸密碼狀態(tài),當(dāng)密碼輸入正確時(shí)進(jìn)入選擇服務(wù)類型狀態(tài),當(dāng)輸入密碼不正確時(shí),停留在原狀態(tài),但如果三次不正確,服務(wù)結(jié)束。進(jìn)入選擇服務(wù)類型后根據(jù)選擇的不同,顧客可進(jìn)入存款和取款狀態(tài)。存、取款結(jié)束后,顧客既可以選擇結(jié)束服務(wù)到最終狀態(tài),也可以選擇繼續(xù)服務(wù)回到選擇服務(wù)類型狀態(tài)。
通過狀態(tài)圖我們可以無歧義的了解各個(gè)活動(dòng)角色是如何在不同狀況下轉(zhuǎn)換的,轉(zhuǎn)換的條件是什么,是否會(huì)出現(xiàn)死鎖現(xiàn)象,是否有條件沒考慮周全,是否有狀態(tài)無法達(dá)到。狀態(tài)圖可以幫助我們發(fā)現(xiàn)問題,并及時(shí)改正。構(gòu)件圖建模
了解系統(tǒng)物理體系結(jié)構(gòu)模型和表示方法 了解構(gòu)件圖建模的概念及其在系統(tǒng)設(shè)計(jì)中的作用 掌握使用Rose或PowerDesigner繪制構(gòu)件圖
火龍果?整理 uml.org.cn 部署圖建模
了解系統(tǒng)物理體系結(jié)構(gòu)模型和表示方法 了解部署圖的概念及其在系統(tǒng)設(shè)計(jì)中的作用 掌握使用Rose或PowerDesigner繪制部署圖的方法
第二篇:火龍果軟件-海量數(shù)據(jù)處理小結(jié)
火龍果?整理 uml.org.cn
海量的數(shù)據(jù)處理問題,對其進(jìn)行處理是一項(xiàng)艱巨而復(fù)雜的任務(wù)。原因有以下幾個(gè)方面:
一、數(shù)據(jù)量過大,數(shù)據(jù)中什么情況都可能存在。如果說有10條數(shù)據(jù),那么大不了每條去逐一檢查,人為處理,如果有上百條數(shù)據(jù),也可以考慮,如果數(shù)據(jù)上到千萬級(jí)別,甚至過億,那不是手工能解決的了,必須通過工具或者程序進(jìn)行處理,尤其海量的數(shù)據(jù)中,什么情況都可能存在,例如,數(shù)據(jù)中某處格式出了問題,尤其在程序處理時(shí),前面還能正常處理,突然到了某個(gè)地方問題出現(xiàn)了,程序終止了。
二、軟硬件要求高,系統(tǒng)資源占用率高。對海量的數(shù)據(jù)進(jìn)行處理,除了好的方法,最重要的就是合理使用工具,合理分配系統(tǒng)資源。一般情況,如果處理的數(shù)據(jù)過TB級(jí),小型機(jī)是要考慮的,普通的機(jī)子如果有好的方法可以考慮,不過也必須加大CPU和內(nèi)存,就象面對著千軍萬馬,光有勇氣沒有一兵一卒是很難取勝的。
三、要求很高的處理方法和技巧。這也是本文的寫作目的所在,好的處理方法是一位工程師長期工作經(jīng)驗(yàn)的積累,也是個(gè)人的經(jīng)驗(yàn)的總結(jié)。沒有通用的處理方法,但有通用的原理和規(guī)則。那么處理海量數(shù)據(jù)有哪些經(jīng)驗(yàn)和技巧呢,我把我所知道的羅列一下,以供大家參考:
一、選用優(yōu)秀的數(shù)據(jù)庫工具現(xiàn)在的數(shù)據(jù)庫工具廠家比較多,對海量數(shù)據(jù)的處理對所使用的數(shù)據(jù)庫工具要求比較高,一般使用Oracle或者DB2,微軟公司最近發(fā)布的SQL Server 2005性能也不錯(cuò)。另外在BI領(lǐng)域:數(shù)據(jù)庫,數(shù)據(jù)倉庫,多維數(shù)據(jù)庫,數(shù)據(jù)挖掘等相關(guān)工具也要進(jìn)行選擇,象好的ETL工具和好的OLAP工具都十分必要,例如Informatic,Eassbase等。筆者在實(shí)際數(shù)據(jù)分析項(xiàng)目中,對每天6000萬條的日志數(shù)據(jù)進(jìn)行處理,使用SQL Server 2000需要花費(fèi)6小時(shí),而使用SQL Server 2005則只需要花費(fèi)3小時(shí)。
二、編寫優(yōu)良的程序代碼處理數(shù)據(jù)離不開優(yōu)秀的程序代碼,尤其在進(jìn)行復(fù)雜數(shù)據(jù)處理時(shí),必須使用程序。好的程序代碼對數(shù)據(jù)的處理至關(guān)重要,這不僅僅是數(shù)據(jù)處理準(zhǔn)確度的問題,更是數(shù)據(jù)處理效率的問題。良好的程序代碼應(yīng)該包含好的算法,包含好的處理流程,包含好的效率,包含好的異常處理機(jī)制等。
三、對海量數(shù)據(jù)進(jìn)行分區(qū)操作對海量數(shù)據(jù)進(jìn)行分區(qū)操作十分必要,例如針對按年份存取的數(shù)據(jù),我們可以按年進(jìn)行分區(qū),不同的數(shù)據(jù)庫有不同的分區(qū)方式,不過處理機(jī)制大體相同。例如SQL Server的數(shù)據(jù)庫分區(qū)是將不同的數(shù)據(jù)存于不同的文件組下,而不同的文件組存于不同的磁盤分區(qū)下,這樣將數(shù)據(jù)分散開,減小磁盤I/O,減小了系統(tǒng)負(fù)荷,而且還可以將日志,索引等放于不同的分區(qū)下。
四、建立廣泛的索引對海量的數(shù)據(jù)處理,對大表建立索引是必行的,建立索引要考慮到具體情況,例如針對大表的分組、排序等字段,都要建立相應(yīng)索引,一般還可以建立復(fù)合索引,對經(jīng)常插入的表則建立索引時(shí)要小心,筆者在處理數(shù)據(jù)時(shí),曾經(jīng)在一個(gè)ETL流程中,當(dāng)插入表時(shí),首先刪除索引,然后插入完畢,建立索引,并實(shí)施聚合操作,聚合完成后,再次插入前還是刪除索引,所以索引要用到好的時(shí)機(jī),索引的填充因子和聚集、非聚集索引都要考慮。
五、建立緩存機(jī)制當(dāng)數(shù)據(jù)量增加時(shí),一般的處理工具都要考慮到緩存問題。緩存大小設(shè)置的好差也關(guān)系到數(shù)據(jù)處理的成敗,例如,筆者在處理2億條數(shù)據(jù)聚合操作時(shí),緩存設(shè)置為100000條/Buffer,這對于這個(gè)級(jí)別的數(shù)據(jù)量是可行的。
六、加大虛擬內(nèi)存如果系統(tǒng)資源有限,內(nèi)存提示不足,則可以靠增加虛擬內(nèi)存來解決。筆者在實(shí)際項(xiàng)目中曾經(jīng)遇到針對18億條的數(shù)據(jù)進(jìn)行處理,內(nèi)存為1GB,1個(gè)P4 2.4G的CPU,對這么大的數(shù)據(jù)量進(jìn)行聚合操作是有問題的,提示內(nèi)存不足,那么采用了加大虛擬內(nèi)存的方法來解決,在6塊磁盤分區(qū)上分別建立了6個(gè)4096M的磁盤分區(qū),用于虛擬內(nèi)存,這樣虛擬的內(nèi)存則增加為 4096*6 + 1024 = 25600 M,解決了數(shù)據(jù)處理中的內(nèi)存不足問題。
七、分批處理 海量數(shù)據(jù)處理難因?yàn)閿?shù)據(jù)量大,那么解決海量數(shù)據(jù)處理難的問題其中一個(gè)技巧是減少數(shù)據(jù)量??梢詫A繑?shù)據(jù)分批處理,然后處理后的數(shù)據(jù)再進(jìn)行合并操作,這樣逐個(gè)擊破,有利于小數(shù)據(jù)量的處理,不至于面對大數(shù)據(jù)量帶來的問題,不過這種方法也要因時(shí)因勢進(jìn)行,如果不允許拆分?jǐn)?shù)據(jù),還需要另想辦法。不過一般的數(shù)據(jù)按天、按月、按年等存儲(chǔ)的,都可以采用先分后合的方法,對數(shù)據(jù)進(jìn)行分開處理。
八、使用臨時(shí)表和中間表數(shù)據(jù)量增加時(shí),處理中要考慮提前匯總。這樣做的目的是化整為零,大表變小表,分塊處理完成后,再利用一定的規(guī)則進(jìn)行合并,處理過程中的臨時(shí)表的使用和中間結(jié)果的保存都非常重要,如果對于超海量的數(shù)據(jù),大表處理不了,只能拆分為多個(gè)小表。如果處理過程中需要多步匯總操作,可按
火龍果?整理 uml.org.cn
匯總步驟一步步來,不要一條語句完成,一口氣吃掉一個(gè)胖子。
九、優(yōu)化查詢SQL語句在對海量數(shù)據(jù)進(jìn)行查詢處理過程中,查詢的SQL語句的性能對查詢效率的影響是非常大的,編寫高效優(yōu)良的SQL腳本和存儲(chǔ)過程是數(shù)據(jù)庫工作人員的職責(zé),也是檢驗(yàn)數(shù)據(jù)庫工作人員水平的一個(gè)標(biāo)準(zhǔn),在對SQL語句的編寫過程中,例如減少關(guān)聯(lián),少用或不用游標(biāo),設(shè)計(jì)好高效的數(shù)據(jù)庫表結(jié)構(gòu)等都十分必要。筆者在工作中試著對1億行的數(shù)據(jù)使用游標(biāo),運(yùn)行3個(gè)小時(shí)沒有出結(jié)果,這是一定要改用程序處理了。
十、使用文本格式進(jìn)行處理對一般的數(shù)據(jù)處理可以使用數(shù)據(jù)庫,如果對復(fù)雜的數(shù)據(jù)處理,必須借助程序,那么在程序操作數(shù)據(jù)庫和程序操作文本之間選擇,是一定要選擇程序操作文本的,原因?yàn)椋撼绦虿僮魑谋舅俣瓤欤粚ξ谋具M(jìn)行處理不容易出錯(cuò);文本的存儲(chǔ)不受限制等。例如一般的海量的網(wǎng)絡(luò)日志都是文本格式或者csv格式(文本格式),對它進(jìn)行處理牽扯到數(shù)據(jù)清洗,是要利用程序進(jìn)行處理的,而不建議導(dǎo)入數(shù)據(jù)庫再做清洗。
十一、定制強(qiáng)大的清洗規(guī)則和出錯(cuò)處理機(jī)制海量數(shù)據(jù)中存在著不一致性,極有可能出現(xiàn)某處的瑕疵。例如,同樣的數(shù)據(jù)中的時(shí)間字段,有的可能為非標(biāo)準(zhǔn)的時(shí)間,出現(xiàn)的原因可能為應(yīng)用程序的錯(cuò)誤,系統(tǒng)的錯(cuò)誤等,這是在進(jìn)行數(shù)據(jù)處理時(shí),必須制定強(qiáng)大的數(shù)據(jù)清洗規(guī)則和出錯(cuò)處理機(jī)制。
十二、建立視圖或者物化視圖視圖中的數(shù)據(jù)來源于基表,對海量數(shù)據(jù)的處理,可以將數(shù)據(jù)按一定的規(guī)則分散到各個(gè)基表中,查詢或處理過程中可以基于視圖進(jìn)行,這樣分散了磁盤I/O,正如10根繩子吊著一根柱子和一根吊著一根柱子的區(qū)別。
十三、避免使用32位機(jī)子(極端情況)目前的計(jì)算機(jī)很多都是32位的,那么編寫的程序?qū)?nèi)存的需要便受限制,而很多的海量數(shù)據(jù)處理是必須大量消耗內(nèi)存的,這便要求更好性能的機(jī)子,其中對位數(shù)的限制也十分重要。
十四、考慮操作系統(tǒng)問題海量數(shù)據(jù)處理過程中,除了對數(shù)據(jù)庫,處理程序等要求比較高以外,對操作系統(tǒng)的要求也放到了重要的位置,一般是必須使用服務(wù)器的,而且對系統(tǒng)的安全性和穩(wěn)定性等要求也比較高。尤其對操作系統(tǒng)自身的緩存機(jī)制,臨時(shí)空間的處理等問題都需要綜合考慮。
十五、使用數(shù)據(jù)倉庫和多維數(shù)據(jù)庫存儲(chǔ)數(shù)據(jù)量加大是一定要考慮OLAP的,傳統(tǒng)的報(bào)表可能5、6個(gè)小時(shí)出來結(jié)果,而基于Cube的查詢可能只需要幾分鐘,因此處理海量數(shù)據(jù)的利器是OLAP多維分析,即建立數(shù)據(jù)倉庫,建立多維數(shù)據(jù)集,基于多維數(shù)據(jù)集進(jìn)行報(bào)表展現(xiàn)和數(shù)據(jù)挖掘等。
十六、使用采樣數(shù)據(jù),進(jìn)行數(shù)據(jù)挖掘基于海量數(shù)據(jù)的數(shù)據(jù)挖掘正在逐步興起,面對著超海量的數(shù)據(jù),一般的挖掘軟件或算法往往采用數(shù)據(jù)抽樣的方式進(jìn)行處理,這樣的誤差不會(huì)很高,大大提高了處理效率和處理的成功率。一般采樣時(shí)要注意數(shù)據(jù)的完整性和,防止過大的偏差。筆者曾經(jīng)對1億2千萬行的表數(shù)據(jù)進(jìn)行采樣,抽取出400萬行,經(jīng)測試軟件測試處理的誤差為千分之五,客戶可以接受。還有一些方法,需要在不同的情況和場合下運(yùn)用,例如使用代理鍵等操作,這樣的好處是加快了聚合時(shí)間,因?yàn)閷?shù)值型的聚合比對字符型的聚合快得多。類似的情況需要針對不同的需求進(jìn)行處理。海量數(shù)據(jù)是發(fā)展趨勢,對數(shù)據(jù)分析和挖掘也越來越重要,從海量數(shù)據(jù)中提取有用信息重要而緊迫,這便要求處理要準(zhǔn)確,精度要高,而且處理時(shí)間要短,得到有價(jià)值信息要快,所以,對海量數(shù)據(jù)的研究很有前途,也很值得進(jìn)行廣泛深入的研究。
一般來說第7種方案是最常用的,有的主要就是使用第7種方案,選擇的余地也非常的大,不只是俺月,日,年,也可以按周等等劃分,靈活性較高
而面對大量數(shù)據(jù)的處理一般都是分批次處理,之前我做一個(gè)文本分類器,面對1g多的索引(索引1g多,但是分類時(shí)需要的數(shù)據(jù)就大得多了),40-50分鐘就可以跑完所有分類:
一是分批操作。
二是給jvm回收內(nèi)存的時(shí)間,比如每次20w的數(shù)據(jù)進(jìn)行分類,完成之后睡眠一段時(shí)間,每睡眠一端時(shí)間就手動(dòng)gc一次。
火龍果?整理 uml.org.cn
通過這些方式取得了很明顯得見效。
海量數(shù)據(jù)處理專題
(一)大數(shù)據(jù)量的問題是很多面試筆試中經(jīng)常出現(xiàn)的問題,比如baidu google 騰訊 這樣的一些涉及到海量數(shù)據(jù)的公司經(jīng)常會(huì)問到。
下面的方法是我對海量數(shù)據(jù)的處理方法進(jìn)行了一個(gè)一般性的總結(jié),當(dāng)然這些方法可能并不能完全覆蓋所有的問題,但是這樣的一些方法也基本可以處理絕大多數(shù)遇到的問題。下面的一些問題基本直接來源于公司的面試筆試題目,方法不一定最優(yōu),如果你有更好的處理方法,歡迎與我討論。
本貼從解決這類問題的方法入手,開辟一系列專題來解決海量數(shù)據(jù)問題。擬包含 以下幾個(gè)方面。
1.Bloom Filter 2.Hash 3.Bit-Map 4.堆(Heap)5.雙層桶劃分 6.數(shù)據(jù)庫索引
7.倒排索引(Inverted Index)8.外排序 9.Trie樹 10.MapReduce
在這些解決方案之上,再借助一定的例子來剖析海量數(shù)據(jù)處理問題的解決方案。歡迎大家關(guān)注。
海量數(shù)據(jù)處理專題
(二)【什么是Bloom Filter】
Bloom Filter是一種空間效率很高的隨機(jī)數(shù)據(jù)結(jié)構(gòu),它利用位數(shù)組很簡潔地表示一個(gè)集合,并能判斷一個(gè)元素是否屬于這個(gè)集合。Bloom Filter的這種高效是有一定代價(jià)的:在判斷一個(gè)元素是否屬于某個(gè)集合時(shí),有可能會(huì)把不屬于這個(gè)集合的元素誤認(rèn)為屬于這個(gè)集合(false positive)。因此,Bloom Filter不適合那些“零錯(cuò)誤”的應(yīng)用場合。而在能容忍低錯(cuò)誤率的應(yīng)用場合下,Bloom Filter通過極少的錯(cuò)誤換取了存儲(chǔ)空間的極大節(jié)省。這里有一篇關(guān)于Bloom Filter的詳細(xì)介紹,不太懂的博友可以看看。
【適用范圍】
可以用來實(shí)現(xiàn)數(shù)據(jù)字典,進(jìn)行數(shù)據(jù)的判重,或者集合求交集
【基本原理及要點(diǎn)】
火龍果?整理 uml.org.cn
對于原理來說很簡單,位數(shù)組+k個(gè)獨(dú)立hash函數(shù)。將hash函數(shù)對應(yīng)的值的位數(shù)組置1,查找時(shí)如果發(fā)現(xiàn)所有hash函數(shù)對應(yīng)位都是1說明存在,很明顯這 個(gè)過程并不保證查找的結(jié)果是100%正確的。同時(shí)也不支持刪除一個(gè)已經(jīng)插入的關(guān)鍵字,因?yàn)樵撽P(guān)鍵字對應(yīng)的位會(huì)牽動(dòng)到其他的關(guān)鍵字。所以一個(gè)簡單的改進(jìn)就是 counting Bloom filter,用一個(gè)counter數(shù)組代替位數(shù)組,就可以支持刪除了。
還有一個(gè)比較重要的問題,如 何根據(jù)輸入元素個(gè)數(shù)n,確定位數(shù)組m的大小及hash函數(shù)個(gè)數(shù)。當(dāng)hash函數(shù)個(gè)數(shù)k=(ln2)*(m/n)時(shí)錯(cuò)誤率最小。在錯(cuò)誤率不大于E的情況 下,m至少要等于n*lg(1/E)才能表示任意n個(gè)元素的集合。但m還應(yīng)該更大些,因?yàn)檫€要保證bit數(shù)組里至少一半為0,則m應(yīng) 該>=nlg(1/E)*lge 大概就是nlg(1/E)1.44倍(lg表示以2為底的對數(shù))。
舉個(gè)例子我們假設(shè)錯(cuò)誤率為0.01,則此時(shí)m應(yīng)大概是n的13倍。這樣k大概是8個(gè)。
注意這里m與n的單位不同,m是bit為單位,而n則是以元素個(gè)數(shù)為單位(準(zhǔn)確的說是不同元素的個(gè)數(shù))。通常單個(gè)元素的長度都是有很多bit的。所以使用bloom filter內(nèi)存上通常都是節(jié)省的。
【擴(kuò)展】
Bloom filter將集合中的元素映射到位數(shù)組中,用k(k為哈希函數(shù)個(gè)數(shù))個(gè)映射位是否全1表示元素在不在這個(gè)集合中。Counting bloom filter(CBF)將位數(shù)組中的每一位擴(kuò)展為一個(gè)counter,從而支持了元素的刪除操作。Spectral Bloom Filter(SBF)將其與集合元素的出現(xiàn)次數(shù)關(guān)聯(lián)。SBF采用counter中的最小值來近似表示元素的出現(xiàn)頻率。
【問題實(shí)例】
給你A,B兩個(gè)文件,各存放50億條URL,每條URL占用64字節(jié),內(nèi)存限制是4G,讓你找出A,B文件共同的URL。如果是三個(gè)乃至n個(gè)文件呢?
根據(jù)這個(gè)問題我們來計(jì)算下內(nèi)存的占用,4G=2^32大概是40億*8大概是340億,n=50億,如果按出錯(cuò)率0.01算需要的大概是650億個(gè) bit?,F(xiàn)在可用的是340億,相差并不多,這樣可能會(huì)使出錯(cuò)率上升些。另外如果這些urlip是一一對應(yīng)的,就可以轉(zhuǎn)換成ip,則大大簡單了。
海量數(shù)據(jù)處理專題
(三)什么是Hash
Hash,一般翻譯做“散列”,也有直接音譯為“哈希”的,就是把任意長度的輸入(又叫做預(yù)映射,pre-image),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉(zhuǎn)換是一種壓縮映射,也就是,散列值的空間通常遠(yuǎn)小于輸入的空間,不同的輸入可能會(huì)散列成相同的輸出,而不可能從散列值來唯一的確定輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數(shù)。
火龍果?整理 uml.org.cn
HASH主要用于信息安全領(lǐng)域中加密算法,它把一些不同長度的信息轉(zhuǎn)化成雜亂的128位的編碼,這些編碼值叫做HASH值.也可以說,hash就是找到一種數(shù)據(jù)內(nèi)容和數(shù)據(jù)存放地址之間的映射關(guān)系。數(shù)組的特點(diǎn)是:尋址容易,插入和刪除困難;而鏈表的特點(diǎn)是:尋址困難,插入和刪除容易。那么我們能不能綜合兩者的特性,做出一種尋址容易,插入刪除也容易的數(shù)據(jù)結(jié)構(gòu)?答案是肯定的,這就是我們要提起的哈希表,哈希表有多種不同的實(shí)現(xiàn)方法,我接下來解釋的是最常用的一種方法——拉鏈法,我們可以理解為“鏈表的數(shù)組”,如圖:
左邊很明顯是個(gè)數(shù)組,數(shù)組的每個(gè)成員包括一個(gè)指針,指向一個(gè)鏈表的頭,當(dāng)然這個(gè)鏈表可能為空,也可能元素很多。我們根據(jù)元素的一些特征把元素分配到不同的鏈表中去,也是根據(jù)這些特征,找到正確的鏈表,再從鏈表中找出這個(gè)元素。
元素特征轉(zhuǎn)變?yōu)閿?shù)組下標(biāo)的方法就是散列法。散列法當(dāng)然不止一種,下面列出三種比較常用的。1,除法散列法
最直觀的一種,上圖使用的就是這種散列法,公式:
index = value % 16
學(xué)過匯編的都知道,求模數(shù)其實(shí)是通過一個(gè)除法運(yùn)算得到的,所以叫“除法散列法”。
2,平方散列法
求index是非常頻繁的操作,而乘法的運(yùn)算要比除法來得省時(shí)(對現(xiàn)在的CPU來說,估計(jì)我們感覺不出
火龍果?整理 uml.org.cn
來),所以我們考慮把除法換成乘法和一個(gè)位移操作。公式:
index =(value * value)>> 28
如果數(shù)值分配比較均勻的話這種方法能得到不錯(cuò)的結(jié)果,但我上面畫的那個(gè)圖的各個(gè)元素的值算出來的index都是0——非常失敗。也許你還有個(gè)問題,value如果很大,value * value不會(huì)溢出嗎?答案是會(huì)的,但我們這個(gè)乘法不關(guān)心溢出,因?yàn)槲覀兏静皇菫榱双@取相乘結(jié)果,而是為了獲取index。
3,斐波那契(Fibonacci)散列法
平方散列法的缺點(diǎn)是顯而易見的,所以我們能不能找出一個(gè)理想的乘數(shù),而不是拿value本身當(dāng)作乘數(shù)呢?答案是肯定的。
1,對于16位整數(shù)而言,這個(gè)乘數(shù)是40503 2,對于32位整數(shù)而言,這個(gè)乘數(shù)是2654435769
3,對于64位整數(shù)而言,這個(gè)乘數(shù)是***98485
這幾個(gè)“理想乘數(shù)”是如何得出來的呢?這跟一個(gè)法則有關(guān),叫黃金分割法則,而描述黃金分割法則的最經(jīng)典表達(dá)式無疑就是著名的斐波那契數(shù)列,如果你還有興趣,就到網(wǎng)上查找一下“斐波那契數(shù)列”等關(guān)鍵字,我數(shù)學(xué)水平有限,不知道怎么描述清楚為什么,另外斐波那契數(shù)列的值居然和太陽系八大行星的軌道半徑的比例出奇吻合,很神奇,對么?
對我們常見的32位整數(shù)而言,公式:
i ndex =(value * 2654435769)>> 28
如果用這種斐波那契散列法的話,那我上面的圖就變成這樣了:
很明顯,用斐波那契散列法調(diào)整之后要比原來的取摸散列法好很多。
火龍果?整理 uml.org.cn
【適用范圍】
快速查找,刪除的基本數(shù)據(jù)結(jié)構(gòu),通常需要總數(shù)據(jù)量可以放入內(nèi)存?!净驹砑耙c(diǎn)】
hash函數(shù)選擇,針對字符串,整數(shù),排列,具體相應(yīng)的hash方法。
碰撞處理,一種是open hashing,也稱為拉鏈法;另一種就是closed hashing,也稱開地址法,opened addressing。
【擴(kuò)展】
d-left hashing中的d是多個(gè)的意思,我們先簡化這個(gè)問題,看一看2-left hashing。2-left hashing指的是將一個(gè)哈希表分成長度相等的兩半,分別叫做T1和T2,給T1和T2分別配備一個(gè)哈希函數(shù),h1和h2。在存儲(chǔ)一個(gè)新的key時(shí),同 時(shí)用兩個(gè)哈希函數(shù)進(jìn)行計(jì)算,得出兩個(gè)地址h1[key]和h2[key]。這時(shí)需要檢查T1中的h1[key]位置和T2中的h2[key]位置,哪一個(gè) 位置已經(jīng)存儲(chǔ)的(有碰撞的)key比較多,然后將新key存儲(chǔ)在負(fù)載少的位置。如果兩邊一樣多,比如兩個(gè)位置都為空或者都存儲(chǔ)了一個(gè)key,就把新key 存儲(chǔ)在左邊的T1子表中,2-left也由此而來。在查找一個(gè)key時(shí),必須進(jìn)行兩次hash,同時(shí)查找兩個(gè)位置。
【問題實(shí)例】
1).海量日志數(shù)據(jù),提取出某日訪問百度次數(shù)最多的那個(gè)IP。
IP的數(shù)目還是有限的,最多2^32個(gè),所以可以考慮使用hash將ip直接存入內(nèi)存,然后進(jìn)行統(tǒng)計(jì)。
海量數(shù)據(jù)處理專題
(四)【什么是Bit-map】
所謂的Bit-map就是用一個(gè)bit位來標(biāo)記某個(gè)元素對應(yīng)的Value,而Key即是該元素。由于采用了Bit為單位來存儲(chǔ)數(shù)據(jù),因此在存儲(chǔ)空間方面,可以大大節(jié)省。
如果說了這么多還沒明白什么是Bit-map,那么我們來看一個(gè)具體的例子,假設(shè)我們要對0-7內(nèi)的5個(gè)元素(4,7,2,5,3)排序(這里假設(shè)這些元素沒有重復(fù))。那么我們就可以采用Bit-map的方法來達(dá)到排序的目的。要表示8個(gè)數(shù),我們就只需要8個(gè)Bit(1Bytes),首先我們開辟1Byte 的空間,將這些空間的所有Bit位都置為0(如下圖:)
火龍果?整理 uml.org.cn
然后遍歷這5個(gè)元素,首先第一個(gè)元素是4,那么就把4對應(yīng)的位置為1(可以這樣操作 p+(i/8)|(0x01<<(i%8))當(dāng)然了這里的操作涉及到Big-ending和Little-ending的情況,這里默認(rèn)為Big-ending),因?yàn)槭菑牧汩_始的,所以要把第五位置為一(如下圖):
然后再處理第二個(gè)元素7,將第八位置為1,,接著再處理第三個(gè)元素,一直到最后處理完所有的元素,將相應(yīng)的位置為1,這時(shí)候的內(nèi)存的Bit位的狀態(tài)如下:
然后我們現(xiàn)在遍歷一遍Bit區(qū)域,將該位是一的位的編號(hào)輸出(2,3,4,5,7),這樣就達(dá)到了排序的目的。下面的代碼給出了一個(gè)BitMap的用法:排序。//定義每個(gè)Byte中有8個(gè)Bit位 #include <memory.h> #define BYTESIZE 8 void SetBit(char *p, int posi){
}
void BitMapSortDemo(){
//BufferLen這個(gè)值是根據(jù)待排序的數(shù)據(jù)中最大值確定的 //待排序中的最大值是14,因此只需要2個(gè)Bytes(16個(gè)Bit)//為了簡單起見,我們不考慮負(fù)數(shù) int num[] = {3,5,2,10,6,12,8,14,9};*p = *p|(0x01<<(posi%BYTESIZE));//將該Bit位賦值1 return;for(int i=0;i <(posi/BYTESIZE);i++){ } p++;
火龍果?整理 uml.org.cn
} //就可以了。
const int BufferLen = 2;char *pBuffer = new char[BufferLen];//要將所有的Bit位置為0,否則結(jié)果不可預(yù)知。memset(pBuffer,0,BufferLen);for(int i=0;i<9;i++){
} //首先將相應(yīng)Bit位上置為1 SetBit(pBuffer,num[i]);//輸出排序結(jié)果
for(int i=0;i<BufferLen;i++)//每次處理一個(gè)字節(jié)(Byte){
} for(int j=0;j<BYTESIZE;j++)//處理該字節(jié)中的每個(gè)Bit位 {
} pBuffer++;
//判斷該位上是否是1,進(jìn)行輸出,這里的判斷比較笨。//首先得到該第j位的掩碼(0x01<<j),將內(nèi)存區(qū)中的 //位和此掩碼作與操作。最后判斷掩碼是否和處理后的 //結(jié)果相同
if((*pBuffer&(0x01<<j))==(0x01<<j)){ }
printf(“%d ”,i*BYTESIZE + j);int _tmain(int argc, _TCHAR* argv[]){
} 【適用范圍】 BitMapSortDemo();return 0;
火龍果?整理 uml.org.cn
可進(jìn)行數(shù)據(jù)的快速查找,判重,刪除,一般來說數(shù)據(jù)范圍是int的10倍以下 【基本原理及要點(diǎn)】
使用bit數(shù)組來表示某些元素是否存在,比如8位電話號(hào)碼 【擴(kuò)展】
Bloom filter可以看做是對bit-map的擴(kuò)展 【問題實(shí)例】
1)已知某個(gè)文件內(nèi)包含一些電話號(hào)碼,每個(gè)號(hào)碼為8位數(shù)字,統(tǒng)計(jì)不同號(hào)碼的個(gè)數(shù)。
8位最多99 999 999,大概需要99m個(gè)bit,大概10幾m字節(jié)的內(nèi)存即可。(可以理解為從0-99 999 999的數(shù)字,每個(gè)數(shù)字對應(yīng)一個(gè)Bit位,所以只需要99M個(gè)Bit==1.2MBytes,這樣,就用了小小的1.2M左右的內(nèi)存表示了所有的8位數(shù)的電話)
2)2.5億個(gè)整數(shù)中找出不重復(fù)的整數(shù)的個(gè)數(shù),內(nèi)存空間不足以容納這2.5億個(gè)整數(shù)。
將bit-map擴(kuò)展一下,用2bit表示一個(gè)數(shù)即可,0表示未出現(xiàn),1表示出現(xiàn)一次,2表示出現(xiàn)2次及以上,在遍歷這些數(shù)的時(shí)候,如果對應(yīng)位置的值是0,則將其置為1;如果是1,將其置為2;如果是2,則保持不變?;蛘呶覀儾挥?bit來進(jìn)行表示,我們用兩個(gè)bit-map即可模擬實(shí)現(xiàn)這個(gè) 2bit-map,都是一樣的道理。
海量數(shù)據(jù)處理專題
(五)【什么是堆】
概念:堆是一種特殊的二叉樹,具備以下兩種性質(zhì)
1)每個(gè)節(jié)點(diǎn)的值都大于(或者都小于,稱為最小堆)其子節(jié)點(diǎn)的值
2)樹是完全平衡的,并且最后一層的樹葉都在最左邊
這樣就定義了一個(gè)最大堆。如下圖用一個(gè)數(shù)組來表示堆:
火龍果?整理 uml.org.cn
那么下面介紹二叉堆:二叉堆是一種完全二叉樹,其任意子樹的左右節(jié)點(diǎn)(如果有的話)的鍵值一定比根節(jié)點(diǎn)大,上圖其實(shí)就是一個(gè)二叉堆。
你一定發(fā)覺了,最小的一個(gè)元素就是數(shù)組第一個(gè)元素,那么二叉堆這種有序隊(duì)列如何入隊(duì)呢?看圖:
火龍果?整理 uml.org.cn
假設(shè)要在這個(gè)二叉堆里入隊(duì)一個(gè)單元,鍵值為2,那只需在數(shù)組末尾加入這個(gè)元素,然后盡可能把這個(gè)元素往上挪,直到挪不動(dòng),經(jīng)過了這種復(fù)雜度為Ο(logn)的操作,二叉堆還是二叉堆。
那如何出隊(duì)呢?也不難,看圖:
火龍果?整理 uml.org.cn
出隊(duì)一定是出數(shù)組的第一個(gè)元素,這么來第一個(gè)元素以前的位置就成了空位,我們需要把這個(gè)空位挪至葉子節(jié)點(diǎn),然后把數(shù)組最后一個(gè)元素插入這個(gè)空位,把這個(gè)“空位”盡量往上挪。這種操作的復(fù)雜度也是Ο(logn)。
【適用范圍】
海量數(shù)據(jù)前n大,并且n比較小,堆可以放入內(nèi)存
【基本原理及要點(diǎn)】
最大堆求前n小,最小堆求前n大。方法,比如求前n小,我們比較當(dāng)前元素與最大堆里的最大元素,如果它小于最大元素,則應(yīng)該替換那個(gè)最大元 素。這樣最后得到的n個(gè)元素就是最小的n個(gè)。適合大數(shù)據(jù)量,求前n小,n的大小比較小的情況,這樣可以掃描一遍即可得到所有的前n元素,效率很高。
【擴(kuò)展】
雙堆,一個(gè)最大堆與一個(gè)最小堆結(jié)合,可以用來維護(hù)中位數(shù)。
【問題實(shí)例】
1)100w個(gè)數(shù)中找最大的前100個(gè)數(shù)。
用一個(gè)100個(gè)元素大小的最小堆即可。
海量數(shù)據(jù)處理專題
(六)火龍果?整理 uml.org.cn
【什么是雙層桶】
事實(shí)上,與其說雙層桶劃分是一種數(shù)據(jù)結(jié)構(gòu),不如說它是一種算法設(shè)計(jì)思想。面對一堆大量的數(shù)據(jù)我們無法處理的時(shí)候,我們可以將其分成一個(gè)個(gè)小的單元,然后根據(jù)一定的策略來處理這些小單元,從而達(dá)到目的。
【適用范圍】
第k大,中位數(shù),不重復(fù)或重復(fù)的數(shù)字
【基本原理及要點(diǎn)】
因?yàn)樵胤秶艽螅荒芾弥苯訉ぶ繁?,所以通過多次劃分,逐步確定范圍,然后最后在一個(gè)可以接受的范圍內(nèi)進(jìn)行??梢酝ㄟ^多次縮小,雙層只是一個(gè)例子,分治才是其根本(只是“只分不治”)。
【擴(kuò)展】
當(dāng)有時(shí)候需要用一個(gè)小范圍的數(shù)據(jù)來構(gòu)造一個(gè)大數(shù)據(jù),也是可以利用這種思想,相比之下不同的,只是其中的逆過程。
【問題實(shí)例】
1).2.5億個(gè)整數(shù)中找出不重復(fù)的整數(shù)的個(gè)數(shù),內(nèi)存空間不足以容納這2.5億個(gè)整數(shù)。
有點(diǎn)像鴿巢原理,整數(shù)個(gè)數(shù)為2^32,也就是,我們可以將這2^32個(gè)數(shù),劃分為2^8個(gè)區(qū)域(比如用單個(gè)文件代表一個(gè)區(qū)域),然后將數(shù)據(jù)分離到不同的區(qū)域,然后不同的區(qū)域在利用bitmap就可以直接解決了。也就是說只要有足夠的磁盤空間,就可以很方便的解決。當(dāng)然這個(gè)題也可以用我們前面講過的BitMap方法解決,正所謂條條大道通羅馬~~~ 2).5億個(gè)int找它們的中位數(shù)。
這個(gè)例子比上面那個(gè)更明顯。首先我們將int劃分為2^16個(gè)區(qū)域,然后讀取數(shù)據(jù)統(tǒng)計(jì)落到各個(gè)區(qū)域里的數(shù)的個(gè)數(shù),之后我們根據(jù)統(tǒng)計(jì)結(jié)果就可以判斷中位數(shù)落到那個(gè)區(qū)域,同時(shí)知道這個(gè)區(qū)域中的第幾大數(shù)剛好是中位數(shù)。然后第二次掃描我們只統(tǒng)計(jì)落在這個(gè)區(qū)域中的那些數(shù)就可以了。
實(shí)際上,如果不是int是int64,我們可以經(jīng)過3次這樣的劃分即可降低到可以接受的程度。即可以先將int64分成2^24個(gè)區(qū)域,然后確定區(qū)域的第幾 大數(shù),在將該區(qū)域分成2^20個(gè)子區(qū)域,然后確定是子區(qū)域的第幾大數(shù),然后子區(qū)域里的數(shù)的個(gè)數(shù)只有2^20,就可以直接利用direct addr table進(jìn)行統(tǒng)計(jì)了。
3).現(xiàn)在有一個(gè)0-30000的隨機(jī)數(shù)生成器。請根據(jù)這個(gè)隨機(jī)數(shù)生成器,設(shè)計(jì)一個(gè)抽獎(jiǎng)范圍是0-350000彩票中獎(jiǎng)號(hào)碼列表,其中要包含20000個(gè)中獎(jiǎng)號(hào)碼。
這個(gè)題剛好和上面兩個(gè)思想相反,一個(gè)0到3萬的隨機(jī)數(shù)生成器要生成一個(gè)0到35萬的隨機(jī)數(shù)。那么我們完全可以將0-35萬的區(qū)間分成35/3=12個(gè)區(qū)間,然后每個(gè)區(qū)間的長度都小于等于3萬,這樣我們就可以用題目給的隨機(jī)數(shù)生成器來生成了,然后再加上該區(qū)間的基數(shù)。那么要每個(gè)區(qū)間生成多少個(gè)隨機(jī)數(shù)呢?計(jì)算公式就是:區(qū)間長度*隨機(jī)數(shù)密度,在本題目中就是30000*(20000/350000)。最后要注意一點(diǎn),該題目是有隱含條件的:彩票,這意味著你生成的隨機(jī)數(shù)里面不能有重復(fù),這也是我為什么用雙層桶劃分思想的另外一個(gè)原因。
第三篇:火龍果作文指導(dǎo)教學(xué)設(shè)計(jì) 新版
《火龍果》作文指導(dǎo)教學(xué)設(shè)計(jì)
馬上縣城南小學(xué) 岑愛艷
【訓(xùn)練內(nèi)容】
1.抓住火龍果的特征進(jìn)行描述。
2.學(xué)會(huì)用眼睛看,用手摸,用鼻子聞,用口嘗去了解火龍果果?!窘虒W(xué)目標(biāo)】
1.能抓住火龍果的特點(diǎn),按一定的順序說話、寫話。2.培養(yǎng)學(xué)生的觀察能力、表達(dá)能力和想象能力。
3.通過品嘗火龍果,讓學(xué)生切身感受、體驗(yàn),為說寫積累豐富的感性材料。【教學(xué)重點(diǎn)】
學(xué)會(huì)用多種觀察方法觀察水果?!窘虒W(xué)難點(diǎn)】
善于聯(lián)想和想象,會(huì)用上比喻、擬人等修辭手法把文章寫生動(dòng)。【教學(xué)準(zhǔn)備】
多媒體教學(xué)課件、火龍果實(shí)物、稿紙。【教學(xué)過程】
一、創(chuàng)設(shè)情境引入
1、自我介紹,跟學(xué)生打招呼
2、今天岑老師第一次給大家上課,準(zhǔn)備了一份見面禮(打開包拿出火龍果。
3、板書“火龍果”學(xué)生跟著書空
二、調(diào)動(dòng)感官--感受體驗(yàn)--指導(dǎo)說話
/ 5
(一)看一看
師:下面我們來比賽,看看誰的眼睛最亮最會(huì)看? 師:火龍果是什么顏色的?(師板書:顏色)師:你最有精神,你來說。(提問兩到三個(gè)學(xué)生)
師:你把火龍果的顏色介紹得很清楚,它好像穿上一件漂亮的衣裳,你會(huì)用上這句話再來說說火龍果的顏色嗎?(師出示課件:課件出示句子: 穿著一件 的外衣)提問2——3名學(xué)生
師:火龍果不僅顏色漂亮而且還長得很特別,你發(fā)現(xiàn)了嗎?(長滿鱗片一樣的葉子)
師:對,火龍果的顏色火紅火紅的,身上長滿了像龍鱗一樣的葉子,因此被人們叫做“火龍果”(火龍果名字的由來)
師:這個(gè)火龍果的形狀是橢圓形的(師板書:形狀),你知道嗎?它還有別的形狀呢?讓我們來看一看吧,(師出示課件:有關(guān)火龍果形狀和比喻句的圖片及填空的題目)
課件:(火龍果(顏色)的,像穿上一件的 外衣。它身上長著像 一樣的,所以大家叫它,它的形狀有,也有。有的像 有的像 還有的像。)
讓學(xué)生先自己說說后師再提問
(二)摸一摸
師:只要學(xué)會(huì)用心觀察,就能把火龍果的形狀和顏色介紹清楚。這么可愛的火龍果,想摸嗎?(師拿出事先準(zhǔn)備好的火龍果)拿到火龍果后請你先閉上
/ 5
眼睛聞一聞再摸一摸,摸出感覺迅速往后傳,然后把你聞到的、摸到的感覺告訴的同桌。
師:誰愿意和大家分享你的感受。(引導(dǎo)學(xué)生說)師表揚(yáng)學(xué)生(你說得真好!你有了新的發(fā)現(xiàn),掌聲祝賀他)
(三)聞一聞。
師:老師發(fā)現(xiàn)有的小朋友已經(jīng)開始流口水了,老師也一樣,好!現(xiàn)在老師要把火龍果切開,請你仔細(xì)觀察,看一看里面的果肉是什么樣的。和完成這樣你的同桌分享吧。出示課件,完成這樣的填空。
(課件出示)
老師———— 地切開———— 一看,哇!————的果肉出現(xiàn)在我面前,————的果肉上還有————,就像————————,那是火龍果的————。一陣————撲鼻而來。饞得我————————。(你可以按照上面的提示說也可以自己說)師巡堂個(gè)別指導(dǎo)
(四)嘗一嘗
師:同學(xué)們說得真好!現(xiàn)在嘴巴干了吧,好,我們就來嘗一嘗吧!(師拿起準(zhǔn)備好的果肉并交代每一組左邊的同學(xué)負(fù)責(zé)拿起兩片火龍果,右邊的同學(xué)負(fù)責(zé)把碗往后傳,不能弄丟哦。)老師有個(gè)條件,千萬別像豬八戒吃人參果一樣“一口吞”,什么味都嘗不出。請先聞一聞再咬上一小口,慢慢品嘗。感覺怎么樣?然后和同桌交流。
師:才咬了一小口就這么好吃,再吃上一大口,細(xì)細(xì)地品味一下,你還想說什么?
/ 5
師:誰來把自己嘗到的火龍果的味道說給大家聽一聽?提問2—3名學(xué)生(板書:味道)
(指名說,評(píng)議)
三、指導(dǎo)寫作
師:還有這么多小朋友都想說怎么辦呢?這樣吧,我給你們出個(gè)主意,我們來把剛才觀察到的火龍果寫下來好嗎?看看誰能成為小作家。趕快動(dòng)起手來吧!
課件出示寫作提示:
1、在第一行中間寫題目,從第二行空兩格開始寫。
2、第一段:今天,誰給我們帶來什么禮物?看到禮物,自己的心情怎樣?
3、第二段:通過用眼看、用手摸、用鼻聞、用口嘗,把火龍果的形狀、顏色、味道寫具體,并會(huì)用上比喻、擬人等修辭手法。
顏色 :火紅火紅的(紅通通的、紅艷艷的、紫紅色的)形狀 :橢圓形、圓形、長滿鱗片一樣的葉子 果肉 :潔白的 籽
:像黑芝麻 外形
里面
味道 :清香、談?wù)劦奶鹞?/p>
第三段:表達(dá)對火龍果的感情。
/ 5
3、提醒學(xué)生寫作時(shí)注意:坐姿端正,握筆正確,做到不停筆,不說話,一氣呵成。
4、生寫作,教師輕輕地走到學(xué)生身邊,給予個(gè)別輔導(dǎo)。
五、總結(jié):
同學(xué)們,這節(jié)課,我們學(xué)會(huì)了用眼看、用手摸、用鼻聞、用口嘗的方法觀察火龍果,希望同學(xué)們做生活的有心人,這樣,我們就能發(fā)現(xiàn)更多的美,創(chuàng)造更多的美!
板書設(shè)計(jì):
火龍果 形狀:.....顏色:.......味道:.......}
看、摸、聞、嘗
/ 5
第四篇:記敘文:火龍果
記敘文:火龍果1
看著那鮮紅的火龍果,我的口水都要流下來了!它的外表如同一團(tuán)燃燒的火焰,上面還點(diǎn)綴著嫩綠的小葉片。火龍果呈水滴形,可真是圓圓的,一看就覺得好吃!把火龍果切開,里面的果肉黑白相間,似乎是在潔白無瑕的雪地上散落了一片小黑點(diǎn)。我拿起一個(gè)小勺子,挖下一小勺果肉,送進(jìn)口中。
哇!火龍果真是好吃,酸甜可口,讓人一下舒服了許多,那可口的味道,從舌尖蔓延到口中的每一個(gè)角落,真是讓精神了許多。
那一瞬間,我突然感到,全世界的水果,哪一種都與這美味的火龍果無法攀比。這美味,在我口中持續(xù)了很久,很久……
記敘文:火龍果2
“遠(yuǎn)看紅繡球,近觀生柳葉。
中間來一刀,豆腐鑲芝麻?!?/p>
大家猜一猜這是什么水果?是“火龍果”,你猜對了嗎?
今天,媽媽買來兩個(gè)火龍果,我很高興?;瘕埞男螤钍菣E圓形的,好像一個(gè)粉紅色的“小炸彈”。它的外面長滿了柳葉形狀的厚葉片,就好像跳動(dòng)的火苗,難怪大家都叫它火龍果呢。我迫不及待地把火龍果切開,哇,它的皮可真厚,足有一厘米。里面是白色的果肉,果肉里面還有一個(gè)個(gè)像芝麻粒一樣的小黑點(diǎn)。我問媽媽:“這些小黑點(diǎn)是什么東西?"媽媽告訴我說:“這是火龍果的種子,可以培育出小火龍果呢?!?/p>
開始品嘗了,我用小勺舀起一塊果肉,放進(jìn)嘴里,輕輕一嚼,甜滋滋的,清涼涼的,真爽口。果肉里面那些小小的種子被我嚼碎,發(fā)出“咯吱咯吱”的響聲,滿嘴清香,吃了一口還想吃第二口,第三口……真是越吃越好吃,吃也吃不夠。眨眼間,一個(gè)火龍果就不見了。
媽媽把另一個(gè)火龍果打成果汁,小芝麻粒被打碎了,我嘗一嘗香味更濃了,再加上蜂蜜、鮮奶、冰塊,真是異常美味可口。媽媽一邊品嘗著果汁一邊告訴我,火龍果是最佳的天然維他命,它含有維他命及鈣、磷、鐵等礦物質(zhì),是最好的美容養(yǎng)顏水果。
我十分喜歡火龍果,它不僅味美,而且營養(yǎng)豐富,請大家也都來嘗一嘗吧。
記敘文:火龍果3
我家的陽臺(tái)上,種著兩株火龍果。它普普通通,看不出與其他的有什么不同。一直到昨天,我才發(fā)現(xiàn)它與其他火龍果有怎樣的不同之處。
意外收獲
在我姥姥還住在深圳時(shí),一位羅奶奶送了我們兩株樹苗。它們長的奇型怪狀,細(xì)細(xì)長長,呈立體扁狀的三角形。我十分好奇,伸手摸了那兩只“怪物”一下。啊唷……疼的我尖叫了起來。那東西長著仙人掌般尖銳的刺?!斑@到底是個(gè)什么玩意兒?”我問姥姥。姥姥說:“是火龍果呀?!薄盎瘕埞俊蔽殷@訝極了,這就是傳說中的火龍果?今天終于見到真的了。于是,我每天就開始勤奮的給它澆水、施肥,還有松土。它在我的`呵護(hù)下,慢慢的開始長高長大了。
“夢想”破滅
我從來都沒有看見過火龍果的樹苗,所以我急于讓它結(jié)出果實(shí)來,所以沒有一天虧待過它。但它似乎是不領(lǐng)情,長是夠長的,都長到鄰居家里了,就是沒見過它結(jié)過果子。我在心里想:“我花了那么多心血去養(yǎng)它,給它營養(yǎng),給它水分,給它松土,它卻不領(lǐng)情。就這樣想著想著,就逐漸逐漸地將它淡忘了。它身下的泥土干涸了,我也不管,它的一節(jié)被狂風(fēng)吹倒了,我也視若無睹。到了暑假,我出去比賽回來的那一天,它竟然發(fā)生了不可思議的巨大的變化
苦盡甘來
它結(jié)出了一個(gè)火龍果,而且是一個(gè)大大的火龍果。聽說這個(gè)消息時(shí),我興奮極了,連鞋也沒來得及脫,就奔向了陽臺(tái)。只見那個(gè)火龍果在風(fēng)中搖搖欲墜,似乎馬上就要掉下去一樣。摘下來切開一看,還是紫心兒的呢,這種的火龍果我還沒有見過呢。
經(jīng)過這次的的“火龍果事件”后,我明白了一個(gè)道理——千萬不要對別人泄氣,因?yàn)樗欢〞?huì)做到的,對自己,也是一樣。
第五篇:火龍果散文
火龍果!
認(rèn)識(shí)火龍果,喜歡火龍果緣于QQ種菜。我的理想田園里種著紅彤彤的招人喜愛的火龍果。
每每望著農(nóng)場里成熟的果實(shí),就想品嘗它的味道!
火龍果是舶來的果實(shí),東北沒有。因?yàn)楹闷嫔暇W(wǎng)查詢,原來它的祖籍是中美洲熱帶,尤其墨西哥熱帶沙漠長得更好,怪不得她那么火熱呢。后來由南洋引進(jìn)臺(tái)灣,再后來由臺(tái)灣引進(jìn)種植在廣西、廣東一帶。因?yàn)樗兄S富的維生素和水性善纖維深受女性的青睞!
每當(dāng)想品嘗,就有朋友奉勸,不知道是良性還是熱性的水果,慎重為先,尤其南方水果,北方人不一定適應(yīng)。為了身體的安全,一忍再忍。
直到那天去朋友家,當(dāng)朋友拿出一個(gè)碩大的火龍果讓我們品嘗時(shí)。望著紅的似火有著蛟龍鱗片的果皮,我就猜想她名字的來歷。果然網(wǎng)上說:因此而得名。
當(dāng)朋友拿著刀把如蛟龍鱗片的外皮剝掉,脫掉外衣的火龍果,盡顯白皙與光滑,透過白皙略見果肉摻雜著黑色點(diǎn)點(diǎn)。那黑色點(diǎn)點(diǎn)如芝麻大小,像黑色的寶石鑲嵌在白色的天鵝絨上。不吃看著就令人垂涎欲滴。
一股淡淡的清香從果肉出發(fā)向四周蔓延,沁人心脾!
咬一口味道很平和,不酸也不甜。細(xì)細(xì)地咀嚼,有點(diǎn)獼猴桃的味道!朋友說不是,我說是。在爭論中吞下一塊,然后再吃一塊。越吃越覺得味道不一般,他沒有南國梨那樣凜冽,也沒有柑橘那樣棉甜,更沒有山楂那樣令人牙酸。
那紅的似火的外皮也不是擺設(shè),它是一道最好的涼菜原材料。將切好的火龍果皮和切好的黃瓜混在一起,紅的似火綠的清脆。清爽可口刺激你的味蕾,引起食欲,想減肥事半功倍!
從朋友家回來,吃了那么多好東西,印象最深的還是火龍果。望著農(nóng)場成熟的火龍果,真想奔過去采摘品嘗……
今天,去了超市,看見柜臺(tái)一角擺放著火龍果。一堆火龍果聚在一起嘰嘰喳喳地述說著遷徙的喜悅!他們相互擁擠著推搡著讓這里變得熱鬧!雖然季節(jié)的日歷讓沈陽到了春季,乍暖還寒的天氣讓人們沒有感覺春天來臨,厚重的冬裝抵御春光撫媚!倒是火龍果讓這里春光無限,讓我的心變得暖暖的。
站在她們面前,讓火龍果接受我的挑選。我早已心花怒放!
看得眼花繚亂,挑的手軟。愛這個(gè)喜歡那個(gè),總不能把它們?nèi)繋Щ丶?,那樣既有些鋪張浪費(fèi)兜子銀子也吃緊。最后在三千佳麗之中我最愛三位……
把它們擺放在家里,供奉在書桌前,我要給她們最好的禮遇,讓她們的芬芳彌漫在我小小的房間,我要和她們促膝交談,讓她們敞開心扉,說說遷徙的苦與樂!
試圖用我溫暖的心,敲開她們緊閉的心房。我不是傳說中的壞人,我想與他們心與心交流,問問幾位對故鄉(xiāng)的眷戀和我一樣不一樣?