Java高頻面試題之海量數(shù)據(jù)處理分析
前言
硬件擴(kuò)容是難滿足海量數(shù)據(jù)處理需要的,如何利用現(xiàn)有條件進(jìn)行海量信息處理
海量信息處理日益成為當(dāng)前程序員筆試面試中一個(gè)新的亮點(diǎn)
基本方法
通過(guò)查詢網(wǎng)上的方方面面知識(shí)點(diǎn),以及閱讀一些相關(guān)書(shū)籍
常見(jiàn)的方法有Hash法、Bit - map法、Bloom filter法、數(shù)據(jù)庫(kù)優(yōu)化法、倒排索引法、外排序法、Trie樹(shù)、堆、雙層桶法以及 MapRe-duce法等
1.1 哈希算法
也被叫做散列(映射關(guān)系)。數(shù)據(jù)元素中的關(guān)鍵字為key,按散列函數(shù)計(jì)算出hash ( key),也就是計(jì)算出它的存儲(chǔ)地址,從而對(duì)數(shù)據(jù)進(jìn)行一些操作
沖突指的就是兩個(gè)關(guān)鍵字對(duì)應(yīng)同一個(gè)函數(shù)值,也就是映射相同的地址
為了減少?zèng)_突,散列函數(shù)也很有講究。盡量簡(jiǎn)單,函數(shù)值域要在其范圍內(nèi),也要減少其沖突
在數(shù)據(jù)結(jié)構(gòu)這本書(shū)中也有提及
- 常用的構(gòu)造散列函數(shù)的方法主要有:直接尋址法(按照關(guān)鍵字的線性關(guān)系)、取模法、數(shù)字分析法、平方取中法等
- 常見(jiàn)的解決沖突的方法主要有:開(kāi)放地址法(遇到?jīng)_突的時(shí)候按照某種方法進(jìn)行探測(cè))、鏈地址法等等
1.2 位圖法
B使用位數(shù)組來(lái)表示某些元素是否存在(可用于查重,也可用于判斷某個(gè)數(shù)據(jù)是否存在)適用于海量數(shù)據(jù)的快速查找、判重、刪除等。
具體的操作是生成N位字符,如果有數(shù)字標(biāo)為1,沒(méi)數(shù)字標(biāo)為0。(用空間來(lái)?yè)Q取時(shí)間,其排序的時(shí)間復(fù)雜度為 O(n))

1.3 Bloom Filter
檢測(cè)一個(gè)元素是否屬于一個(gè)集合。犧牲正確率換取空間效率與時(shí)間效率的提高。
基本原理是位數(shù)組與Hash函數(shù)的結(jié)合,包含m位數(shù)組(初始化為0),定義k個(gè)不同的hash函數(shù)(每個(gè)函數(shù)映射到位數(shù)組的k個(gè)位置)聯(lián)合使用。向集合插入元素時(shí),根據(jù)k個(gè)Hash函數(shù)可以得到位數(shù)組中的k個(gè)位(設(shè)置為1),查詢查詢某個(gè)元素是否屬于集合,k個(gè)為1(存在),k個(gè)位不為1(不存在)。在插人其他元素時(shí),可能會(huì)將其他位置為1,產(chǎn)生了錯(cuò)誤。

1.4 數(shù)據(jù)庫(kù)優(yōu)化
可以通過(guò)數(shù)據(jù)庫(kù)的工具、數(shù)據(jù)分區(qū)、索引、緩存機(jī)制、優(yōu)化查詢、排序等
1.5 倒排索引法
根據(jù)關(guān)鍵字的某些值進(jìn)行排序從而建立索引
存儲(chǔ)在全文搜索下某個(gè)單詞在一個(gè)文檔或者一組文檔中的存儲(chǔ)位置的映射,它是文檔檢索系統(tǒng)中最常用的數(shù)據(jù)結(jié)構(gòu)
有兩種不同的反向索引形式:
- 第一種形式是一條記錄的水平反向索引(或者反向檔案索引)包含每個(gè)引用單詞的文檔的列表;
- 第二種形式是一個(gè)單詞的水平反向索引(或者完全反向索引)又包含每個(gè)單詞在一個(gè)文檔中的位置。
- 第二種形式提供了更多的兼容性(例如短語(yǔ)搜索),但是需要更多的時(shí)間和空間來(lái)創(chuàng)建。
一般情況下可以采用矩陣的方式存儲(chǔ)來(lái)存儲(chǔ),但會(huì)浪費(fèi)大量的空間
1.6 外排序法
定義:在內(nèi)存中不能一次處理過(guò)多的對(duì)象,須以文件形式外放。排序需一步步調(diào)入內(nèi)存處理(相對(duì)大文件,無(wú)法一次裝入內(nèi)存中,需多次交換數(shù)據(jù))
可采用歸并排序或者二路歸并排序的手法
適用于大數(shù)據(jù)的排序和查重,但是效率比較低,因?yàn)橐玫絠o的操作
1.7 字典樹(shù)
利用字符串的公共前綴來(lái)減少時(shí)空開(kāi)銷(空間換時(shí)間)。用于快速字符串檢索的多叉樹(shù)結(jié)構(gòu)
統(tǒng)計(jì)和排序大量的字符串(但不僅限于字符串),所以經(jīng)常被搜索引擎系統(tǒng)用于文本詞頻統(tǒng)計(jì)。
優(yōu)點(diǎn)是:最大限度地減少無(wú)謂的字符串比較,查詢效率比散列表高。
Trie樹(shù)一般具有3個(gè)基本特性:
- 根結(jié)點(diǎn)不包含字符,除根結(jié)點(diǎn)外每一個(gè)結(jié)點(diǎn)都只包含一個(gè)字符。
- 從根結(jié)點(diǎn)到某一結(jié)點(diǎn),路徑上經(jīng)過(guò)的字符連接起來(lái),為該結(jié)點(diǎn)對(duì)應(yīng)的字符串。
- 每個(gè)結(jié)點(diǎn)的所有子結(jié)點(diǎn)包含的字符都不相同。
2. 經(jīng)典問(wèn)題分析
2.1 top k問(wèn)題
頻率最高的k個(gè)數(shù)或者找出最大的k個(gè)數(shù)等,目前比較好的方法是分治+Trie樹(shù)/hash +小頂堆。
- hash方法分解成多個(gè)小數(shù)據(jù)集(如果有重復(fù)的數(shù)字的話,通過(guò)去重減少很多的數(shù)據(jù)集)
- Trie樹(shù)或者h(yuǎn)ash統(tǒng)計(jì)每個(gè)小數(shù)據(jù)集中的query詞頻
- 小頂堆求出每個(gè)數(shù)據(jù)集中出頻率最高的前K個(gè)數(shù)
- 最后在所有top K中求出最終的top K
在實(shí)際應(yīng)用中,可能有足夠大的內(nèi)存,那么直接將數(shù)據(jù)扔到內(nèi)存中一次性處理即可,也可能機(jī)器有多個(gè)核,這樣可以采用多線程處理整個(gè)數(shù)據(jù)集。
2.2 重復(fù)問(wèn)題
該問(wèn)題可通過(guò)位圖法進(jìn)行,此方法最優(yōu)
具體的執(zhí)行代碼可看書(shū)籍中的展示,此為該書(shū)籍的展示代碼



2.3 排序問(wèn)題
數(shù)據(jù)庫(kù)排序(要求數(shù)據(jù)庫(kù)的規(guī)格比較好)
分治法(雖然縮小內(nèi)存,但是編碼復(fù)雜,速度變慢)
位圖法
到此這篇關(guān)于Java高頻面試題之海量數(shù)據(jù)處理分析的文章就介紹到這了,更多相關(guān)Java海量數(shù)據(jù)處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot中的@ConditionalOnBean注解詳細(xì)解讀
這篇文章主要介紹了Springboot中的@ConditionalOnBean注解詳細(xì)解讀,@ConditionalOnMissingBean注解兩個(gè)類,一個(gè)Computer類,一個(gè)配置類,想要完成;如果容器中沒(méi)有Computer類,就注入備用電腦Computer類,如果有Computer就不注入,需要的朋友可以參考下2023-11-11
Spring Cloud入門(mén)教程之Zuul實(shí)現(xiàn)API網(wǎng)關(guān)與請(qǐng)求過(guò)濾
這篇文章主要給大家介紹了關(guān)于Spring Cloud入門(mén)教程之Zuul實(shí)現(xiàn)API網(wǎng)關(guān)與請(qǐng)求過(guò)濾的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-05-05
windows系統(tǒng)使用mvn命令打包并指定jdk路徑方式
這篇文章主要介紹了windows系統(tǒng)使用mvn命令打包并指定jdk路徑方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
SpringBoot中MyBatis-Flex的集成和使用實(shí)現(xiàn)
MyBatis-Flex是一個(gè)基于MyBatis的數(shù)據(jù)訪問(wèn)框架,MyBatis-Flex能夠極大地提高我們的開(kāi)發(fā)效率和開(kāi)發(fā)體驗(yàn),本文主要介紹了SpringBoot中MyBatis-Flex的集成和使用實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
mybatis-plus QueryWrapper and or 連用并且實(shí)現(xiàn)分
這篇文章主要介紹了mybatis-plus QueryWrapper and or 連用并且實(shí)現(xiàn)分頁(yè),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
java方法重寫(xiě)時(shí)需要注意的問(wèn)題
大家好,本篇文章主要講的是java方法重寫(xiě)時(shí)需要注意的問(wèn)題,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12
如何去掉IntelliJ IDEA中mybatis對(duì)應(yīng)的xml文件警告
這篇文章主要介紹了如何去掉IntelliJ IDEA中mybatis對(duì)應(yīng)的xml文件警告問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
教你怎么實(shí)現(xiàn)java語(yǔ)言的在線編譯
這篇文章主要介紹了教你怎么實(shí)現(xiàn)java語(yǔ)言的在線編譯,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04
spring security獲取用戶信息的實(shí)現(xiàn)代碼
這篇文章主要介紹了spring security獲取用戶信息的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12

