哈希表—點陣圖

来源:https://www.cnblogs.com/zhonglongbo/archive/2018/03/03/8495699.html
-Advertisement-
Play Games

原文鏈接 :http://blog.csdn.net/qq_38646470/article/details/79427038 `[1.什麼是點陣圖? 2.點陣圖的用處? 3.點陣圖的結構 4.點陣圖題目操練 5.總結(優缺點分析)]` 1.什麼是點陣圖? 點陣圖就是bitmap的縮寫。所謂bitmap,就是用 ...


原文鏈接http://blog.csdn.net/qq_38646470/article/details/79427038
[1.什麼是點陣圖? 2.點陣圖的用處? 3.點陣圖的結構 4.點陣圖題目操練 5.總結(優缺點分析)]
1.什麼是點陣圖?
點陣圖就是bitmap的縮寫。所謂bitmap,就是用每一位來存放某種狀態,適用於大規模數據,但數據狀態又不是很多的情況。通常是用來判斷某個數據存不存在的。在STL中有一個bitset容器,其實就是點陣圖。

所以我們可以瞭解到,點陣圖就是一個只用每一位來保存數的狀態的結構。

2.點陣圖的用處?
點陣圖主要用於海量數據處理,索引,數據壓縮等方面有廣泛應用
3.點陣圖的結構
關於點陣圖的結構,類似於哈希,點陣圖就是一個用每一位的0,1來表示一個數的狀態。

比如,我們現在有一個文件,這個文件中有數 1,5,4294967295。我們就把第1位,第5位,第4294967295位改為狀態1。
點陣圖結構

4.點陣圖題目操練
給4 0 億個不重覆的無符號整數,沒排過序。給一個無符號整數,如何快速判斷一個數是否在這4 0 億個數中。

題目分析:這是一道關於海量數據查找的題,其實這道題,我們就可以和哈希表聯繫在一起,為何說是海量數據呢,對於一個40億整數,我們如果要存的話,按照無符號整數來存儲,那麼下來,大概就需要40億*4這麼些位元組,下來大概就是16G的 記憶體。

對於現在的64位機,普遍標配記憶體也就是4-8G的記憶體,顯而易見,16G是沒有辦法一次性處理的。那麼我們如何是好?進行拆分?這樣顯然也是不好的,怎麼拆,還有效率問題。
所以在這裡我們採取一種新的思路,這種思路就是點陣圖。
點陣圖結構定義

typedef struct BitMap
{
    size_t* _bits;
    size_t _range;
}BitMap;

點陣圖相關介面

void BitMapInit(BitMap *bm,size_t range) //初始化
{
    assert(bm);
    bm->_bits = NULL;
    bm->_range = range;
    bm->_bits = (size_t *)malloc(sizeof(char)*bm->_range/8);
    assert(bm->_bits);
    memset(bm->_bits,0,sizeof(char)*bm->_range/8);
}

void BitMapSet(BitMap *bm,size_t x)//標記相應位
{
    size_t num = x>>5;
    size_t bit = x%32;

    bm->_bits[num] |=(1<<bit);
}

void BitMapReset(BitMap *bm,size_t x)//恢復相應位
{
    size_t num = x>>5;
    size_t bit = x%32;

    bm->_bits[num] &= (~(1<<bit));
}

int BitMapTest(BitMap *bm,size_t x)
{
    size_t num = x>>5;
    size_t bit = x%32;

    if ((1<<bit)&bm->_bits[num])
        return 0;
    return -1;
}

測試案例及結果截圖:

void TestBitMap()
{
    BitMap bm;
    BitMapInit(&bm,-1);
    BitMapSet(&bm,5);
    BitMapSet(&bm,6);
    BitMapSet(&bm,7);
    BitMapSet(&bm,8);
    BitMapSet(&bm,-1);


    printf("%d\n",BitMapTest(&bm,4));
    printf("%d\n",BitMapTest(&bm,5));
    printf("%d\n",BitMapTest(&bm,6));
    printf("%d\n",BitMapTest(&bm,7));
    printf("%d\n",BitMapTest(&bm,8));
    printf("%d\n",BitMapTest(&bm,-1));
}

點陣圖測試
這道題中點陣圖結構代碼不難,註意理解思路,必須熟練掌握位運算。

5.總結
優缺點:
(1)可讀性差
(2)點陣圖存儲的元素個數雖然比一般做法多,但是存儲的元素大小受限於存儲空間的大小。點陣圖存儲性質:存儲的元素個數等於元素的最大值。比如, 1K 位元組記憶體,能存儲 8K 個值大小上限為 8K 的元素。(元素值上限為 8K ,這個局限性很大!)比如,要存儲值為 65535 的數,就必須要 65535/8=8K 位元組的記憶體。要就導致了點陣圖法根本不適合存 unsigned int 類型的數(大約需要 2^32/8=5 億位元組的記憶體)。
(3)點陣圖對有符號類型數據的存儲,需要 2 位來表示一個有符號元素。這會讓點陣圖能存儲的元素個數,元素值大小上限減半。 比如 8K 位元組記憶體空間存儲 short 類型數據只能存 8K*4=32K 個,元素值大小範圍為 -32K~32K 。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 頁面HTML: css代碼: ...
  • 如題,以前都是給客戶提供安卓和iOS兩個二維碼,實在覺得麻煩,就是一勞永逸了一下。不會傳附件,需要相關素材的可以私我。 ...
  • 在大多數的瀏覽器中都有實現網頁全屏顯示的功能,並且大部分瀏覽器實現全屏顯示和退出全屏顯示的快捷鍵通常是F11和Esc兩個按鍵。如今,W3C已經制定了關於網頁全屏顯示的API,利用這個API 可以實現網頁的全屏顯示,並且還能將某個特定的元素設置為全屏顯示,在各瀏覽器的相容性:google chrome... ...
  • 看了網上很多資料,對vue的computed講解自己看的都不是很清晰,今天忙裡抽閑,和同事們又閑聊起來,對computed這個屬性才有了一個稍微比較清晰的認識,下麵的文章有一部分是轉自: https://www.w3cplus.com/vue/vue-computed-intro.html © w3 ...
  • 趕緊完結這個系列咯,webpack4都已經出正式版了。 之前的代碼搜索到js文件的對應loader,並添加到了對象中返回,流程如下: 這個對象的request將入口文件的路徑與loader拼接起來並用!分割,所有的屬性基本上都與路徑相關。 after-resolve事件流 這裡會觸發after-re ...
  • 因為JS可以多層嵌套代碼可能下麵還可以再嵌一個方法引用this就會變成子方法控制的對象如果需要上級的對象在沒有參數的情況下前面前提做了一個臨時變數_this可以保存上級對象子方法中就可以用_this來調用了,這才是目的。摘自百度問答:https://zhidao.baidu.com/question ...
  • 什麼是DOM? DOM(Document Object Model)文檔對象模型,是 語言和平臺的中立介面。。 允許程式和腳本動態地訪問和更新文檔的內容 。 為什麼要使用DOM? Dom技術使得 用戶頁面可以動態地變化,如可以動態地顯示或隱藏一個元素,改變它們的屬性,增加一個元素等 ,Dom技術使得 ...
  • 一、JS中for迴圈遍歷測試 for迴圈遍歷有兩種 第一種:是有條件的那種,例如 for(var i = 0;i<ele.length;i++){} 第二種:for (var i in li ){} 現在我們來說一下測試一下第二種(數組和obj的) 1 <!DOCTYPE html> 2 <html ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...