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

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

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

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

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

題目要求

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

總結一下題目的要求:

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

算法復雜度上考慮,***的是 O(1)在常量級時間內完成查找,以及基于 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ù)內存空間,我用一個 int 類型的數(shù)組表示,每個數(shù)組元素可以表示 32 個元素。比如分別裝載 5、13、29(注意:字節(jié)順序)。

裝載

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

裝載

1000W 條數(shù)據(jù)有可能是在 1-100 以內取,只需要 100 個 bit 就可以了;也可能是在 1-1000W 以內取,此時需要 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í)行結果

裝載

分析一下算法:

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

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

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

總結

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

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

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

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

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2018-12-14 09:32:06

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

2020-08-24 08:07:32

Node.js文件函數(shù)

2022-10-24 08:17:29

API算法元素

2021-01-04 09:12:31

集合變量

2020-12-11 11:19:54

區(qū)塊鏈資金投資

2011-05-25 10:46:39

Javascript

2018-11-01 13:23:02

網(wǎng)關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)關億級

2019-05-28 09:31:05

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

2024-08-22 14:16:08

2019-05-27 09:56:00

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

2024-11-14 08:31:02

2019-01-28 09:43:21

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

2019-03-05 10:16:54

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

2015-09-07 13:38:41

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

2010-09-28 15:13:10

SQL語句

2010-11-11 12:06:39

SQL自增列
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一级片 | 欧美日韩在线一区二区 | 成年人黄色小视频 | 亚洲一区二区视频 | 天天干天天干 | 欧美成人精品一区二区男人看 | 国产日韩欧美在线观看 | 一区二区三区福利视频 | 一区二区av | 国产91综合 | 亚洲精品美女在线观看 | 一区二区三区在线观看视频 | 一区二区三区欧美 | 波多野吉衣久久 | av资源中文在线天堂 | 日韩一级免费看 | 国内激情av片 | 99久久免费精品国产男女高不卡 | 亚洲欧美中文日韩在线v日本 | 欧美日韩电影一区 | 国产人成在线观看 | 男女午夜激情视频 | 日韩福利片 | 精品一区二区三区在线观看国产 | 91精品国产综合久久久久久丝袜 | 欧美一级大片免费看 | 日韩av在线一区二区 | 国产精品日日夜夜 | 国产第1页 | 91久久久久| 日韩视频一区在线观看 | 黄色一级大片视频 | 国产精品夜夜夜一区二区三区尤 | 三级视频网站 | 一区 | 天天色综网 | 麻豆国产一区二区三区四区 | 国产视频福利一区 | 在线视频日韩精品 | 嫩草视频在线看 | 久久久久成人精品亚洲国产 |