最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# 位圖BitArray的使用

 更新時(shí)間:2021年06月28日 11:04:07   作者:有態(tài)度的馬甲  
如果我們著重處理一個(gè)以位為單位的數(shù)據(jù)時(shí),就可以考慮使用位數(shù)組。本文就介紹了C# 位圖BitArray的使用,感興趣的可以了解一下

前面聊了布隆過(guò)濾器,回歸認(rèn)識(shí)一下位圖BitMap,閱讀前文的同學(xué)應(yīng)該發(fā)現(xiàn)了布隆過(guò)濾器本身就是基于位圖,是位圖的一種改進(jìn)。

位圖

先看一個(gè)問(wèn)題, 假如有1千萬(wàn)個(gè)整數(shù),整數(shù)范圍在1到1億之間,如何快速確定某個(gè)整數(shù)是否在這個(gè)1千萬(wàn)個(gè)整數(shù)中呢?

乍一看是一個(gè)查找問(wèn)題,循環(huán)、二分查找都是常規(guī)思路。

一個(gè)好的答案是存儲(chǔ)結(jié)構(gòu)和算法的完美結(jié)合, 基于題干上的特征和條件,我們是否有其他思路。

對(duì)于題干我們使用高中排列組合的思維:有1億個(gè)有編號(hào)的空籃子,我們拿出這1千萬(wàn)個(gè)有數(shù)字的球,放進(jìn)對(duì)應(yīng)的籃子。

最后,所有的籃子有兩種狀態(tài):有球/無(wú)球,我們要確定某個(gè)數(shù)字是否存在,就看對(duì)應(yīng)籃子是否為空。

什么是位圖?每一位存放某種狀態(tài),適用于海量數(shù)據(jù),通常用于判斷數(shù)據(jù)是否存在。位圖的空間由數(shù)據(jù)的最大值決定。

位圖這種數(shù)據(jù)結(jié)構(gòu)來(lái)大大節(jié)省內(nèi)存的使用量。

我們只需要構(gòu)造一個(gè)長(zhǎng)度為1億的bit數(shù)組,將有球位置標(biāo)記為1,無(wú)球位置默認(rèn)記為0; 這樣我們就將數(shù)字轉(zhuǎn)換成了一個(gè)被壓縮緊致的數(shù)組索引,1億bit數(shù)組不到16M空間。

確定某位置有球,只需要O(1)的時(shí)間復(fù)雜度。

常用屬性

Count BitArray中包含實(shí)例的個(gè)數(shù)

IsReadOnly 獲取一個(gè)值,該值指示BitArray是否為只讀

Item 獲取或設(shè)置BitArray中特定位置的值

Length 獲取或設(shè)置BitArray中元素的數(shù)目

常用的方法

And 和指定的BitArray中相應(yīng)的元素做and運(yùn)算

Or 按位或運(yùn)算

Xor 按位異或運(yùn)算

Not 取反所有元素

Get 獲取特定位置處的值

Set 設(shè)定特定位置處的值

SetAll 將BitArray中所有的元素設(shè)定為指定的值 

public sealed class BitArray : ICollection, IEnumerable, ICloneable
{
    public BitArray(BitArray bits); //用已有的BitArray給新的BitArray初始化
    
    public BitArray(bool[] values); //用布爾數(shù)組初始化
    
    public BitArray(byte[] bytes);  //用字節(jié)數(shù)組初始化
    
    public BitArray(int length);    //初始化并設(shè)置位數(shù)值,此值會(huì)在使用中自動(dòng)增長(zhǎng)
    
    public BitArray(int[] values);  //用int數(shù)組初始化
    
    public BitArray(int length, bool defaultValue); //初始化并設(shè)置默認(rèn)值
    
    public int Count { get; }   //位數(shù)組中現(xiàn)存的位的個(gè)數(shù)
    
    public bool IsReadOnly { get; } //確定位數(shù)組是否只讀

    public bool IsSynchronized { get; } //是否同步對(duì)此BitArray的操作,用在線程安全上
    
    public int Length { get; set; }   //位數(shù)組的位數(shù)

    public object SyncRoot { get; }
    
    public bool this[int index] { get; set; } //索引器,利用索引讀位值
    
    public BitArray And(BitArray value);  //按位與

    public object Clone();  //創(chuàng)建BitArray 的淺表副本。
    
    public void CopyTo(Array array, int index);  //將BitArray拷貝到其他數(shù)組中
    
    public bool Get(int index);    //按下標(biāo)讀取位值

    public IEnumerator GetEnumerator(); //返回循環(huán)訪問(wèn)BitArray 的枚舉數(shù)

    public BitArray Not();  //按位非

    public BitArray Or(BitArray value);  //按位或
    
    public void Set(int index, bool value);  //按位設(shè)置值
    
    public void SetAll(bool value); //設(shè)置所有位為指定值

    public BitArray Xor(BitArray value);  //按位異或
}

C# 有專業(yè)的位圖數(shù)組:BitArray

using System;
using System.Collections;

namespace Bitmap
{
    class Program
    {
        static void Main(string[] args)
        {
            var input = Console.ReadLine();
            var num = int.Parse(input);
            var bitmap = InitBitMap();
            if (bitmap.Get(num))
            {
                Console.WriteLine($"找到數(shù)字{num}");
            }
            else
            {
                Console.WriteLine($"未找到數(shù)字{num}");
            }
        }
        public static BitArray InitBitMap()
        {
            var myBA1 = new BitArray(10000);
            var arr1 = new int[] { 1, 2, 4, 6, 77, 77, 88, 99, 100, 500, 600, 700, 999, 8888 };
            foreach (int element in arr1)
            {
                myBA1[element] = true;
            }
            return myBA1;
        }
    }
}

BitArray是管理位值的緊湊數(shù)組,用布爾值表示,其中true表示位是開啟的(1),false表示位是關(guān)閉的(0), 是引用類型,位于System.Collections命名空間。

以上只是小試牛刀,我們針對(duì)原題再發(fā)散一下,如何找到以上1千萬(wàn)數(shù)字中重復(fù)的數(shù)字?

還是籃子中放球的思路,這次我們要兩排籃子,也就是兩個(gè)BitMap,利用位AND運(yùn)算(同時(shí)為True,結(jié)果才是True)找到兩排籃子中均有球的位置。

using System;
using System.Collections;

namespace Bitmap
{
    class Program
    {
        static void Main(string[] args)
        {
            var bitmap = InitBitMap();
            for (int i = 0; i < bitmap.Length; i++)
            {
                if(bitmap[i] == true)
                {
                    Console.WriteLine(i);
                }
            }
        }
        public static BitArray InitBitMap()
        {
            var myBA1 = new BitArray(10000);
            var myBA2 = new BitArray(10000);
            var arr1 = new int[] { 1, 2, 4, 6, 77, 77, 88, 99, 100, 500, 600, 700, 999, 8888 };
            foreach (int element in arr1)
            {
                if (myBA1[element] == false)
                {
                    myBA1[element] = true;
                }
                else
                {
                    myBA2[element] = true;
                }
            }
            myBA1 = myBA1.And(myBA2);
            return myBA1;
        }
    }
}

最后提醒各位:寶藏組件Redis天然支持位圖

到此這篇關(guān)于C# 位圖BitArray的使用的文章就介紹到這了,更多相關(guān)C# 位圖BitArray內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#串口連接的讀取和發(fā)送詳解

    C#串口連接的讀取和發(fā)送詳解

    這篇文章主要給大家介紹了關(guān)于C#串口連接的讀取和發(fā)送的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • C#學(xué)習(xí)筆記——基本語(yǔ)法

    C#學(xué)習(xí)筆記——基本語(yǔ)法

    本文給大家詳細(xì)介紹了C#的基本語(yǔ)法知識(shí)以及一些基礎(chǔ)知識(shí)的匯總,非常的簡(jiǎn)單基礎(chǔ),有需要的小伙伴可以參考下
    2017-02-02
  • 詳解c# 接口IDisposable的用法

    詳解c# 接口IDisposable的用法

    這篇文章主要介紹了詳解c# 接口IDisposable的用法,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下
    2020-10-10
  • 淺談C#基礎(chǔ)之類的訪問(wèn)修飾符

    淺談C#基礎(chǔ)之類的訪問(wèn)修飾符

    淺談C#基礎(chǔ)之類的訪問(wèn)修飾符,需要的朋友可以參考一下
    2013-03-03
  • 在C#中g(shù)lobal關(guān)鍵字的作用及其用法

    在C#中g(shù)lobal關(guān)鍵字的作用及其用法

    global 是 C# 2.0 中新增的關(guān)鍵字,理論上說(shuō),如果代碼寫得好的話,根本不需要用到它,但是不排除一些特別的情況,比如修改別人的代碼,本文僅舉例說(shuō)明。
    2016-03-03
  • Unity實(shí)現(xiàn)旋轉(zhuǎn)扭曲圖像特效

    Unity實(shí)現(xiàn)旋轉(zhuǎn)扭曲圖像特效

    這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)旋轉(zhuǎn)扭曲圖像特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • C#折線圖控件使用方法詳解

    C#折線圖控件使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了C#折線圖控件的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 詳解C# Socket異步通信實(shí)例

    詳解C# Socket異步通信實(shí)例

    本篇文章主要介紹了C# Socket異步通信,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • C# wpf常用窗口特效的實(shí)現(xiàn)代碼

    C# wpf常用窗口特效的實(shí)現(xiàn)代碼

    在C# WPF應(yīng)用程序開發(fā)中,窗口特效是提升用戶體驗(yàn)的重要手段,本文將介紹幾種常用的窗口特效及其實(shí)現(xiàn)方法,包括動(dòng)畫、陰影、模糊效果等,希望對(duì)大家有所幫助
    2024-11-11
  • C#中如何把dll打包到exe

    C#中如何把dll打包到exe

    這篇文章主要介紹了C#中如何把dll打包到exe問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06

最新評(píng)論

天全县| 甘泉县| 兴国县| 会理县| 灵丘县| 鄢陵县| 青田县| 海盐县| 五常市| 运城市| 咸阳市| 宣威市| 磴口县| 鄯善县| 永昌县| 仁寿县| 佛冈县| 嘉祥县| 通海县| 大英县| 肥城市| 沈丘县| 晋中市| 涟源市| 玉田县| 兴安县| 博客| 江油市| 额尔古纳市| 浦东新区| 札达县| 伊春市| 上思县| 留坝县| 东乡| 长葛市| 台南县| 东乡县| 乡宁县| 上栗县| 加查县|