成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何判斷一個元素是否在億級數(shù)據(jù)是否存在

開發(fā) 開發(fā)工具
前幾天看到強哥(“純潔的微笑”)轉(zhuǎn)載的一篇文章《如何判斷一個元素是否在億級數(shù)據(jù)是否存在》。對其中的解決思路有一些不一樣的想法。

前幾天看到強哥(“純潔的微笑”)轉(zhuǎn)載的一篇文章《如何判斷一個元素是否在億級數(shù)據(jù)是否存在》。對其中的解決思路有一些不一樣的想法,先闡述一下問題:

現(xiàn)在有一個非常龐大的數(shù)據(jù),假設全是 int 類型。給出一個數(shù),判斷這個數(shù)是否在其中(盡可能的高效)。

題目要求

文章給出了思路:首先想到的是 Hash 算法,它的時間復雜度是 O(1),在常量時間判斷出數(shù)據(jù)是否存在。文章給出的辦法是直接使用了 Java 的集合對象 HashSet(內(nèi)部用 HashMap 實現(xiàn))。文章給出的結(jié)論是裝載數(shù)據(jù)太慢,直接討論了后面的一種方法—— Bloom Filter。***發(fā)現(xiàn) Bloom Filter 也不可能***解決這個問題,有“誤判”。

總結(jié)一下題目的要求:

  • 裝載數(shù)據(jù)盡可能的快
  • 查詢速度盡可能的塊
  • 數(shù)據(jù)判斷不存在誤判

算法復雜度上考慮,***的是 O(1)在常量級時間內(nèi)完成查找,以及基于 Hash 算法。所以我的解決思路也是采用 Hash。

現(xiàn)代 CPU 多流水線完成 1000W 次循環(huán)是非常快的,所以理論上是“裝載數(shù)據(jù)”應該是非常塊的。上面文章中提到的裝載數(shù)據(jù)太慢其實是由于HashSet 的 put 方法里面有復雜的邏輯——畢竟 HashSet 是一個通用的 Hash 算法。

新思路

1000W 條數(shù)據(jù),我們可以用 1000W 個二進制位表示,初始化為全 0 如果某個數(shù)據(jù)存在,就置為 1。。Java 中沒有辦法直接操作一大塊連續(xù)內(nèi)存空間,我用一個 int 類型的數(shù)組表示,每個數(shù)組元素可以表示 32 個元素。比如分別裝載 5、13、29(注意:字節(jié)順序)。

裝載

這些數(shù)據(jù)都小于 32,放在***個數(shù)組元素就可以了。代碼如下:

裝載

1000W 條數(shù)據(jù)有可能是在 1-100 以內(nèi)取,只需要 100 個 bit 就可以了;也可能是在 1-1000W 以內(nèi)取,此時需要 1000W 個 bit。所以單獨用一個變量boundOfData表示數(shù)據(jù)的上限,需要的 bit 數(shù)量則是 boundOfData,每個 int 是 32 個 bit ,計算需要的數(shù)組數(shù)量是boundOfData/32 后向上取整。

數(shù)據(jù)除32 商是數(shù)組下標,余數(shù)是相應的 bit 位置。比如 10,它應該在***個數(shù)組元素的,第 10 個 bit 位,定位到位置后只要通過位運算設置為 1 就行了。判斷的時候只要按同樣的算法定位到數(shù)組位置,判斷某個 bit 為是否為 1。

我們測試一下速度,某次執(zhí)行結(jié)果

裝載

分析一下算法:

裝載數(shù)據(jù)部分是 O(N)——即線性復雜度,這個是沒有辦法避免的。查詢部分是 O(1)——常量級。當然這里肯定不會存在“誤判”,因為每個數(shù)據(jù)都會被準確的 Hash。

看一下空間復雜度,1000W 的數(shù)據(jù)需要 312500 個 int 類型的數(shù)據(jù)大概是 1.1M 內(nèi)存空間。

我嘗試了 1 一條數(shù)據(jù),大概 13 秒;如果不用隨機數(shù)(直接用下標)大概是 200 ms。

總結(jié)

其實面試問題很多情況下不是考察你是否知道答案,而是解題過程。希望在信息爆炸的今天,我們能夠靜下心來分析一個問題,仔細思考它的答案。

答案是什么?誰還在乎這個,我們思考的過程才是最有價值的部分。

【本文是51CTO專欄作者“邢森”的原創(chuàng)文章,轉(zhuǎn)載請聯(lián)系作者本人獲取授權(quán)】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2018-12-14 09:32:06

億級數(shù)據(jù)存在

2020-08-24 08:07:32

Node.js文件函數(shù)

2021-01-04 09:12:31

集合變量

2022-10-24 08:17:29

API算法元素

2020-12-11 11:19:54

區(qū)塊鏈資金投資

2011-05-25 10:46:39

Javascript

2018-11-01 13:23:02

網(wǎng)關(guān)APIHTTP

2020-10-14 06:18:20

Golang字符串數(shù)組

2023-09-19 23:21:48

Python列表

2017-10-10 14:41:38

Linux

2018-11-26 08:06:24

API網(wǎng)關(guān)億級

2024-08-22 14:16:08

2019-05-27 09:56:00

數(shù)據(jù)庫高可用架構(gòu)

2019-05-28 09:31:05

Elasticsear億級數(shù)據(jù)ES

2019-01-28 09:43:21

IP地址子網(wǎng)掩碼

2019-03-05 10:16:54

數(shù)據(jù)分區(qū)表SQLserver

2024-11-14 08:31:02

2015-09-07 13:38:41

數(shù)據(jù)分析

2011-03-03 10:32:07

Mongodb億級數(shù)據(jù)量

2021-06-29 08:12:22

MySQL數(shù)據(jù)分頁數(shù)據(jù)庫
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产超碰人人爽人人做人人爱 | 欧美国产一区二区三区 | 91精品国产综合久久精品 | 国产精品久久久久久久久免费樱桃 | 天堂在线免费视频 | 成人h动漫亚洲一区二区 | 免费欧美视频 | 韩日在线视频 | 97国产精品| 色婷婷av一区二区三区软件 | 中文字幕亚洲欧美 | 高清国产一区二区 | 一道本不卡视频 | cao在线 | 久久婷婷av | 国产日韩欧美激情 | 日本三级在线网站 | 亚洲精品456 | 欧美日韩亚洲国产 | 国产婷婷精品av在线 | 中文字幕在线一区二区三区 | 色婷婷一区二区三区四区 | 国产在线观看av | 中国一级特黄真人毛片 | 一级a性色生活片久久毛片波多野 | 国产毛片在线看 | 一区二区三区在线免费观看 | 欧美精品一区二区三区在线播放 | 欧美一区二区三区在线视频 | 999观看免费高清www | 亚洲免费精品 | 日韩一区二区三区在线视频 | 亚洲三区在线观看 | 日本黄色片免费在线观看 | 亚洲精品中文字幕 | 亚洲精品一 | 欧美黄色片 | 亚洲黄色一级毛片 | 天天操网 | 亚洲小说图片 | 国产精品99久久久久久宅男 |