Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menulis algoritma penapis Bloom menggunakan C#

Bagaimana untuk menulis algoritma penapis Bloom menggunakan C#

WBOY
WBOYasal
2023-09-21 10:24:27572semak imbas

Bagaimana untuk menulis algoritma penapis Bloom menggunakan C#

Cara menggunakan C# untuk menulis algoritma penapis Bloom

Penapis Bloom ialah struktur data yang sangat cekap ruang yang boleh digunakan untuk menentukan sama ada sesuatu elemen tergolong dalam set. Idea asasnya ialah untuk memetakan elemen ke dalam tatasusunan bit melalui pelbagai fungsi cincang bebas dan menandakan bit tatasusunan bit yang sepadan sebagai 1. Apabila menilai sama ada elemen tergolong dalam set, anda hanya perlu menilai sama ada bit tatasusunan bit yang sepadan adalah kesemuanya 1. Jika mana-mana bit adalah 0, ia boleh dinilai bahawa elemen itu tiada dalam set. Penapis Bloom mempunyai ciri pertanyaan pantas dan pendudukan ruang kecil, dan telah digunakan secara meluas dalam banyak senario.

Artikel ini akan memperkenalkan cara menulis algoritma penapis Bloom menggunakan C# dan memberikan contoh kod khusus.

Pertama, kita perlu mentakrifkan kelas penapis Bloom dan mengisytiharkan beberapa pembolehubah dan kaedah yang diperlukan. Berikut ialah takrif kelas penapis Bloom yang mudah:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Security.Cryptography;

public class BloomFilter
{
    private BitArray _bits;
    private int _hashFunctionsCount;

    public BloomFilter(int capacity, double falsePositiveRate)
    {
        int bitsCount = GetBitsCount(capacity, falsePositiveRate);
        _bits = new BitArray(bitsCount);
        _hashFunctionsCount = GetHashFunctionsCount(bitsCount, capacity);
    }

    public void Add(string item)
    {
        foreach (int hash in GetHashes(item))
        {
            _bits.Set(Math.Abs(hash % _bits.Length), true);
        }
    }

    public bool Contains(string item)
    {
        foreach (int hash in GetHashes(item))
        {
            if (!_bits[Math.Abs(hash % _bits.Length)])
            {
                return false;
            }
        }
        return true;
    }

    private IEnumerable<int> GetHashes(string item)
    {
        using (SHA256 sha256 = SHA256.Create())
        {
            byte[] hashBytes = sha256.ComputeHash(System.Text.Encoding.UTF8.GetBytes(item));
            for (int i = 0; i < _hashFunctionsCount; i++)
            {
                yield return BitConverter.ToInt32(hashBytes, i * 4);
            }
        }
    }

    private int GetBitsCount(int capacity, double falsePositiveRate)
    {
        return (int)Math.Ceiling(capacity * Math.Log(falsePositiveRate) / Math.Log(1 / Math.Pow(2, Math.Log(2))));
    }

    private int GetHashFunctionsCount(int bitsCount, int capacity)
    {
        return (int)Math.Round((double)(bitsCount / capacity) * Math.Log(2));
    }
}

Kod di atas mentakrifkan kelas BloomFilter, yang mengandungi pembina, kaedah Tambah dan Mengandungikaedah. Pembina menerima dua parameter: kapasiti dan kadar positif palsu Berdasarkan dua parameter ini, saiz tatasusunan bit yang diperlukan dan bilangan fungsi cincangan dikira. Kaedah <code>Tambah digunakan untuk menambah elemen pada penapis Bloom, memetakan elemen ke dalam tatasusunan bit melalui berbilang fungsi cincangan dan menandai bit tatasusunan bit yang sepadan sebagai 1. Kaedah Contains digunakan untuk menentukan sama ada unsur wujud dalam penapis Bloom, memetakan elemen kepada tatasusunan bit melalui berbilang fungsi cincang dan menentukan sama ada bit tatasusunan bit yang sepadan adalah kesemuanya 1. BloomFilter类,其中包含了构造函数、Add方法和Contains方法。构造函数接收两个参数:容量和误判率,根据这两个参数计算出需要的位数组大小和哈希函数个数。Add方法用于向布隆过滤器中添加元素,将元素通过多个哈希函数映射到位数组中,并将对应位数组的位标记为1。Contains方法用于判断一个元素是否存在于布隆过滤器中,通过多个哈希函数将元素映射到位数组中,并判断对应位数组的位是否都为1。

接下来,我们可以使用布隆过滤器类进行测试。以下是一个简单的示例:

using System;

public class Program
{
    public static void Main(string[] args)
    {
        BloomFilter bloomFilter = new BloomFilter(100000, 0.01);

        bloomFilter.Add("apple");
        bloomFilter.Add("banana");
        bloomFilter.Add("orange");

        Console.WriteLine(bloomFilter.Contains("apple")); // 输出:True
        Console.WriteLine(bloomFilter.Contains("banana")); // 输出:True
        Console.WriteLine(bloomFilter.Contains("orange")); // 输出:True
        Console.WriteLine(bloomFilter.Contains("watermelon")); // 输出:False
    }
}

以上示例代码创建了一个布隆过滤器对象,并向其中添加了三个元素("apple", "banana", "orange")。然后,通过Contains

Seterusnya, kita boleh menggunakan kelas penapis bloom untuk ujian. Berikut ialah contoh mudah:

rrreee

Kod contoh di atas mencipta objek penapis mekar dan menambah tiga elemen ("epal", "pisang", "oren") padanya. Kemudian, gunakan kaedah Contains untuk menentukan sama ada unsur wujud dalam penapis Bloom.

Perlu diambil perhatian bahawa memandangkan penapis Bloom mempunyai kadar salah penilaian tertentu, salah penilaian mungkin berlaku apabila menilai sama ada unsur berada dalam penapis Bloom. Oleh itu, penapis Bloom sesuai terutamanya untuk senario yang boleh bertolak ansur dengan kadar salah penilaian tertentu, seperti menentukan sama ada URL telah dilawati. 🎜🎜Untuk meringkaskan, artikel ini memperkenalkan cara menulis algoritma penapis Bloom menggunakan C# dan menyediakan contoh kod yang berkaitan. Sebagai struktur data yang cekap, penapis Bloom mempunyai nilai aplikasi yang penting dalam beberapa senario tertentu. Saya harap artikel ini dapat membantu dalam memahami dan menggunakan algoritma penapis Bloom. 🎜

Atas ialah kandungan terperinci Bagaimana untuk menulis algoritma penapis Bloom menggunakan C#. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn