青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴(yán)以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

算法的力量:位運(yùn)算在排序與搜索中的應(yīng)用

楔子:
問(wèn)題:假設(shè)一個(gè)文件中有9億條不重復(fù)的9位整數(shù),現(xiàn)在要求對(duì)這個(gè)文件進(jìn)行排序。

一般解題思路:
1、將數(shù)據(jù)導(dǎo)入到內(nèi)存中
2、將數(shù)據(jù)進(jìn)行排序 (比如插入排序、快速排序)
3、將排序好的數(shù)據(jù)存入文件

難題:
一個(gè)整數(shù)為4個(gè)字節(jié)
即使使用數(shù)組也需要900,000,000 * 4byte = 3.4G內(nèi)存
對(duì)于32位系統(tǒng),訪問(wèn)2G以上的內(nèi)存非常困難,而且一般設(shè)備也沒(méi)有這么多的物理內(nèi)存
將數(shù)據(jù)完全導(dǎo)入到內(nèi)存中的做法不現(xiàn)實(shí)

其他解決辦法:
1、導(dǎo)入數(shù)據(jù)庫(kù)運(yùn)算
2、分段排序運(yùn)算
3、使用bit位運(yùn)算

解決方案一:數(shù)據(jù)庫(kù)排序
將文本文件導(dǎo)入到數(shù)據(jù)庫(kù),讓數(shù)據(jù)庫(kù)進(jìn)行索引排序操作后提取數(shù)據(jù)到文件

優(yōu)點(diǎn):操作簡(jiǎn)單
缺點(diǎn):運(yùn)算速度慢,而且需要數(shù)據(jù)庫(kù)設(shè)備。

解決方案二:分段排序
操作方式:
規(guī)定一個(gè)內(nèi)存大小,比如200M,200M可以記錄52428800條記錄,我們可以每次提取5000萬(wàn)條記錄到文件進(jìn)行排序,要裝滿9位整數(shù)需要20次,所以一共要進(jìn)行20次排序,需要對(duì)文件進(jìn)行20次讀操作

缺點(diǎn):
 編碼復(fù)雜,速度也慢(至少20次搜索)

關(guān)鍵步驟:
先將整個(gè)9位整數(shù)進(jìn)行分段,億條數(shù)據(jù)進(jìn)行分成20段,每段5000萬(wàn)條
在文件中依次搜索0~5000萬(wàn),50000001~1億……
將排序的結(jié)果存入文件

解決方案三:bit位操作
思考下面的問(wèn)題:
一個(gè)最大的9位整數(shù)為999999999
這9億條數(shù)據(jù)是不重復(fù)的
可不可以把這些數(shù)據(jù)組成一個(gè)隊(duì)列或數(shù)組,讓它有0~999999999(10億個(gè))元素
數(shù)組下標(biāo)表示數(shù)值,節(jié)點(diǎn)中用0表示這個(gè)數(shù)沒(méi)有,1表示有這個(gè)數(shù)
判斷0或1只用一個(gè)bit存儲(chǔ)就夠了

聲明一個(gè)可以包含9位整數(shù)的bit數(shù)組(10億),一共需要10億/8=120M內(nèi)存
把內(nèi)存中的數(shù)據(jù)全部初始化為0
讀取文件中的數(shù)據(jù),并將數(shù)據(jù)放入內(nèi)存。比如讀到一個(gè)數(shù)據(jù)為341245909這個(gè)數(shù)據(jù),那就先在內(nèi)存中找到341245909這個(gè)bit,并將bit值置為1
遍歷整個(gè)bit數(shù)組,將bit為1的數(shù)組下標(biāo)存入文件

關(guān)鍵代碼
檢查是某一個(gè)char里面(first)的第second位中存儲(chǔ)的數(shù)據(jù)是否為1

bool CompareBit (unsigned char first, int second)
{
 const static int mark_buf[] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80};
 if (second > 8)
  return false;

 return  (first & mark_buf[second]) == mark_buf[second];
}

將某一個(gè)char(Desc)中的第source位置為1

bool WriteToBit (unsigned char *Desc, int source)
{
 const static int mark_buf[] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80};

 if (source > 8)
  return false;

 Desc[0] |= mark_buf[source];

 return true;
}

案例
在某個(gè)項(xiàng)目中,我們需要對(duì)2億條手機(jī)號(hào)碼刪除重復(fù)記錄(過(guò)濾號(hào)碼黑名單同樣有效)

工作難點(diǎn)就在于如何處理這2億條電話號(hào)碼,直接用哈希表存放手機(jī)號(hào)碼不大現(xiàn)實(shí),即使經(jīng)過(guò)優(yōu)化,用一個(gè)unsigned int存放一條記錄,那也得需要2億*4=8億byte,遠(yuǎn)超過(guò)32位系統(tǒng)的尋址能力

解決方案:
將電話號(hào)碼由12位單個(gè)數(shù)字組成的字符串轉(zhuǎn)換為一個(gè)unsigned int型數(shù)據(jù)(這個(gè)完全可能,手機(jī)號(hào)碼由前三位數(shù)字和后面八位數(shù)字組成,后面八位需要占到1~1000萬(wàn)的空間,而前面用0~100的數(shù)字存儲(chǔ)已經(jīng)足夠)
為簡(jiǎn)單起見(jiàn),默認(rèn)為0~4G的數(shù)字都有可能分布號(hào)碼,為此我們分配4G/32=512M的內(nèi)存
將這2億個(gè)號(hào)碼整理成unsigned int類型后按上述辦法存放在這塊內(nèi)存中(比如13512345678我們整理后為112345678,我們找到內(nèi)存中112345678bit的下標(biāo),并將此bit值設(shè)為1)
遍歷整個(gè)bit數(shù)組,記錄下所有的號(hào)碼,這些號(hào)碼即是不重復(fù)的手機(jī)號(hào)碼

總結(jié)
建立一個(gè)足夠大的bit數(shù)組當(dāng)作hash表
以bit數(shù)組的下標(biāo)來(lái)表示一個(gè)整數(shù)
以bit位中的0或1來(lái)表示這個(gè)整數(shù)是否在這個(gè)數(shù)組中存在
適用于無(wú)重復(fù)原始數(shù)據(jù)的搜索
原來(lái)每個(gè)整數(shù)需要4byte空間變?yōu)?bit,空間壓縮率為32倍
擴(kuò)展后可實(shí)現(xiàn)其他類型(包括重復(fù)數(shù)據(jù))的搜索

注意
由于操作系統(tǒng)和編程語(yǔ)言本身的限制,有可能內(nèi)存足夠,但無(wú)法分配一塊連續(xù)大內(nèi)存的情況,這樣的話可以申請(qǐng)多塊稍微小一點(diǎn)的內(nèi)存,然后用鏈表或其他的方式連接起來(lái)使用

參考資料

 

posted on 2008-01-25 13:56 楊粼波 閱讀(295) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品久久久久久久久久ktv| 欧美成人午夜激情| 国产亚洲在线观看| 国产精品女主播在线观看| 欧美午夜视频| 国产精品亚洲综合色区韩国| 国产麻豆精品视频| 激情欧美日韩一区| 亚洲三级视频在线观看| 日韩亚洲精品在线| 亚洲欧美日韩一区二区在线| 欧美一区1区三区3区公司| 久久久久久久久岛国免费| 欧美 日韩 国产 一区| 亚洲国产欧美一区二区三区久久| 欧美成人激情视频| 日韩香蕉视频| 欧美一区二区播放| 欧美精品18videos性欧美| 国产精品嫩草久久久久| 在线国产亚洲欧美| 亚洲欧美成aⅴ人在线观看| 久久激情综合网| 亚洲美女视频网| 久久久精品性| 欧美日本国产精品| 好吊色欧美一区二区三区四区| 亚洲国产精品成人久久综合一区| 宅男66日本亚洲欧美视频| 欧美一区亚洲二区| 亚洲精品国产欧美| 久久精品一二三区| 国产精品嫩草久久久久| 黄色成人av网站| 亚洲天堂成人在线观看| 久久精品91| 在线亚洲伦理| 欧美激情一级片一区二区| 国产一区二区三区久久 | 久久av在线| 欧美欧美全黄| 亚洲电影第1页| 久久黄色小说| 亚洲欧美韩国| 国产精品红桃| 亚洲午夜伦理| 亚洲日本理论电影| 欧美大片一区二区| 亚洲国产女人aaa毛片在线| 久久九九免费视频| 西瓜成人精品人成网站| 国产精品久久久久婷婷| 一区二区三区高清在线| 亚洲日本欧美| 欧美日本不卡高清| 亚洲深夜福利| 日韩网站在线| 欧美亚州在线观看| 亚洲一区二区精品在线观看| 亚洲精品社区| 欧美视频在线免费| 亚洲欧美日韩天堂| 亚洲一区二区日本| 国产欧美日本一区二区三区| 午夜激情亚洲| 性色av一区二区三区在线观看| 国产女精品视频网站免费 | 亚洲黄色在线视频| 欧美极品aⅴ影院| 99国内精品久久久久久久软件| 亚洲欧洲综合另类| 欧美三级午夜理伦三级中视频| 亚洲淫性视频| 性久久久久久久久久久久| 国产视频一区二区在线观看| 久久久久久久久久久成人| 久久精品99| 91久久精品国产91久久性色| 亚洲国产欧美不卡在线观看| 欧美日韩视频不卡| 午夜精品美女久久久久av福利| 香蕉久久久久久久av网站| 极品裸体白嫩激情啪啪国产精品| 欧美成人国产| 欧美体内谢she精2性欧美| 久久成人免费视频| 亚洲人成亚洲人成在线观看图片| 亚洲电影天堂av| 欧美日韩三级电影在线| 欧美在线网站| 美女啪啪无遮挡免费久久网站| 亚洲日本成人| 亚洲一区二区高清| 在线欧美亚洲| 亚洲图片欧洲图片日韩av| 国内精品免费午夜毛片| 亚洲精品国产拍免费91在线| 国产欧美一区二区三区国产幕精品 | 国产区亚洲区欧美区| 欧美99在线视频观看| 国产精品jvid在线观看蜜臀| 久久视频精品在线| 欧美久久综合| 六月天综合网| 国产精品一卡二卡| 亚洲人人精品| 伊人久久成人| 亚洲影院在线观看| 在线亚洲观看| 欧美激情偷拍| 欧美91精品| 国产在线不卡精品| 宅男噜噜噜66一区二区66| 亚洲国产高清在线| 欧美在线91| 新片速递亚洲合集欧美合集| 欧美极品在线播放| 欧美www视频| 国产一区观看| 欧美亚洲一区在线| 午夜欧美大尺度福利影院在线看| 欧美精品一区二区三区蜜臀| 欧美/亚洲一区| 黄色精品免费| 久久国产精品久久久久久| 亚洲欧美色一区| 国产精品magnet| 一区二区不卡在线视频 午夜欧美不卡在| 影音先锋欧美精品| 久久久久久久一区二区| 久久精品亚洲一区二区| 国产精品网站视频| 亚洲自拍偷拍麻豆| 欧美亚洲视频一区二区| 欧美日韩在线一区| 亚洲午夜国产一区99re久久| 亚洲性视频网站| 国产精品久久波多野结衣| 在线亚洲一区观看| 午夜日韩av| 国产亚洲精品自拍| 久久精视频免费在线久久完整在线看| 午夜亚洲精品| 国产日本欧洲亚洲| 久久久久久亚洲精品杨幂换脸| 免费不卡在线观看av| 亚洲高清在线观看一区| 狂野欧美一区| 亚洲欧洲精品成人久久奇米网| 日韩视频在线你懂得| 欧美粗暴jizz性欧美20| 欧美日韩一区二区视频在线| 日韩亚洲欧美一区二区三区| 亚洲午夜激情网站| 国产精品久久久久影院亚瑟| 亚洲一区精品在线| 久久久免费精品| 亚洲片区在线| 国产精品v欧美精品∨日韩| 亚洲一区亚洲| 蜜臀久久99精品久久久久久9| 亚洲激情视频在线| 欧美调教vk| 久久久久欧美精品| 99精品久久久| 久久综合狠狠综合久久激情| 亚洲裸体在线观看| 国产麻豆91精品| 美女脱光内衣内裤视频久久影院| 亚洲精品一区二区三区不| 欧美一二三区在线观看| 亚洲国产精品久久久| 国产精品xxxxx| 久久久夜夜夜| 亚洲一区二区三区精品在线| 麻豆成人在线观看| 亚洲无人区一区| 在线观看视频亚洲| 国产精品第2页| 美女脱光内衣内裤视频久久网站| 亚洲精品欧美| 美腿丝袜亚洲色图| 午夜在线观看欧美| 99www免费人成精品| 国产专区欧美精品| 国产精品久久久对白| 欧美va亚洲va香蕉在线| 午夜日韩在线观看| 一区二区三区久久网| 欧美激情性爽国产精品17p| 亚洲欧美日韩国产中文| 亚洲精品美女在线| 伊人激情综合| 国产一区激情| 国产日韩一区二区| 欧美三级资源在线| 欧美久久一区| 欧美激情一区二区三区不卡| 久久久久久久久伊人| 欧美一区午夜精品|