search——Bloom Filter

详情,看这一篇博客

package mainimport ("fmt""math""strconv"
)type BloomFilter struct {*bitMapk      uint64  // hash function countm      uint64  // bits array lengthn      uint64  // insert n numberp      float64 // 失误率p_true float64 // 真是失误率
}func (b *BloomFilter) Insert(id uint64) {for i := 0; uint64(i) < b.k; i++ {b.bitMap.insert(getHash(strconv.Itoa(int(id)), uint64(i)) % b.bitMap.Size)}
}func (b *BloomFilter) IsExist(id uint64) bool {for i := 0; uint64(i) < b.k; i++ {if !b.bitMap.isExist(getHash(strconv.Itoa(int(id)), uint64(i)) % b.bitMap.Size) {return false}}return true
}func NewBloomFilter(p float64, n uint64) *BloomFilter {m := uint64(-(float64(n)*math.Log2(p))/(math.Ln2*math.Ln2) + 0.5)k := uint64(math.Ln2*(float64(m)/float64(n)) + 0.5)p_true := math.Pow(1-math.Pow(math.E, -(float64(n)*float64(k))/float64(m)), float64(k))bl := &BloomFilter{bitMap: newBitMap(m/64 + 1)}bl.m = m           // bits array lengthbl.n = n           // insert n numberbl.k = k           // hash function countbl.p = p           // 失误率bl.p_true = p_true // 真实失误率return bl
}func main() {bl := NewBloomFilter(0.00000001, 100)bl.Insert(10000)fmt.Println(bl.IsExist(10000))fmt.Println(bl.IsExist(10001))
}func main1() {p := 0.00000000001n := 100m := uint(-(float64(n)*math.Log2(p))/(math.Ln2*math.Ln2) + 0.5)fmt.Println(m/64 + 1)k := uint64(math.Ln2*(float64(m)/float64(n)) + 0.5)fmt.Println(m)fmt.Println(k)p_true := float64(0)p_true = math.Pow(1-math.Pow(math.E, -(float64(n)*float64(k))/float64(m)), float64(k))fmt.Println(p_true < p)}type bitMap struct {Map  []uint64Cap  uint64Size uint64
}func newBitMap(cap uint64) *bitMap {return &bitMap{make([]uint64, cap), cap, cap * 64}
}func (b *bitMap) insert(id uint64) {b.Map[id/64] |= 1 << (id % 64)
}func (b *bitMap) isExist(id uint64) bool {return (b.Map[id/64])&(1<<(id%64)) > 0
}func (b *bitMap) delete(id uint64) {b.Map[id/64] &^= 1 << (id % 64)
}func (b *bitMap) range_() (res []uint64) {for i := 0; uint64(i) < b.Cap; i++ {if b.Map[i] > 0 {for j, bits := 0, b.Map[i]; bits > 0; j, bits = j+1, bits>>1 {if bits&1 == 1 {res = append(res, uint64(i)*64+uint64(j))}}}}return res
}func getHash(str string, i uint64) uint64 {return hash(str) + i*hash1(str)
}func hash(str string) (res uint64) {factor := ")k+,p-m~90$#2(*&6q}ev73541]n{fl['?|c"str = str + factor[:16-(len(str)%16)]for start, end := 0, len(str)/16; end > 0; start, end = start+16, end-1 {h0 := uint64(0)for i := 15; i >= 0; i-- {h0 += uint64(str[start+i]-byte(i))*uint64(pow(36, i)) ^ uint64(factor[(i+start)%36])}h0 *= 0x12345res += (res >> 30) ^ h0<<34res += (res >> 32) | (h0 << 32) ^ uint64(start*start*start) ^ uint64(factor[start%36])res += (res>>16)&(h0<<48) ^ uint64(factor[35-start%36]) ^ uint64(start-end*end)res += (res >> 17) | (h0 << 47) ^ uint64(start*start)}res += 235791113<<32 | 1719232931>>32return res
}func hash1(str string) (res uint64) {factor := ")k+,p-m~90$#2(*&6q}ev73541]n{fl['?|c"str = str + factor[:16-(len(str)%16)]for start, end := 0, len(str)/16; end > 0; start, end = start+16, end-1 {h0 := uint64(0)for i := 15; i >= 0; i-- {h0 += uint64(str[start+i]-byte(i))*uint64(pow(36, i)) ^ uint64(factor[(i+start)%36])}h0 *= 0x54321res += (res >> 32) | (h0 << 32) ^ uint64(start*start*start) ^ uint64(factor[start%36])res += (res>>16)&(h0<<48) ^ uint64(factor[35-start%36]) ^ uint64(start-end*end)res += (res >> 17) | (h0 << 47) ^ uint64(start*start)res += (res >> 30) ^ h0<<34}res += 1719232931<<32 | 235791113>>32return res
}func pow(x, n int) int {if n == 0 {return 1} else {for (n & 1) == 0 {n, x = n>>1, x*x}}result := xn >>= 1for n != 0 {x *= xif n&1 == 1 {result *= x}n >>= 1}return result
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/634501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

递归组件怎么实现无线滚动

递归组件实现无限滚动的方法通常涉及到对数据的递归处理和组件的自我调用。以下是一个简单的示例&#xff0c;展示如何使用递归组件实现无限滚动&#xff1a; 首先&#xff0c;定义一个递归组件&#xff0c;该组件可以调用自己来渲染下一组数据。假设我们要展示一个滚动列表&a…

什么是vue的sync语法糖如何使用

Vue的sync语法糖是用于实现子组件修改父组件数据的双向绑定。在Vue中&#xff0c;默认是单向数据流&#xff0c;子组件不能直接修改父组件的数据。但是有些情况下&#xff0c;我们需要子组件能够修改父组件的数据&#xff0c;这时就可以使用sync语法糖。 使用sync语法糖的步骤…

第11章 GUI Page500~504 步骤三十二:打开画板文件02

各个图元类新增GetTypeName_Static()&#xff0c;并将原来的GetTypeName()改为调用静态方法实现&#xff1a; 直线&#xff1a; 圆&#xff1a; 十字&#xff1a; 矩形&#xff1a; 文字&#xff1a; tool_4_save_load.hpp添加两行 tool_4_save_load.cpp增加&#xff1a; 增加…

网络安全产品之认识入侵检测系统

随着计算机网络技术的快速发展和网络攻击的不断增多&#xff0c;单纯的防火墙策略已经无法满足对安全高度敏感的部门的需要&#xff0c;网络的防卫必须采用一种纵深的、多样的手段。因此&#xff0c;入侵检测系统作为新一代安全保障技术&#xff0c;成为了传统安全防护措施的必…

【资治通鉴】古代纪年法 ( 天干地支纪年法 | 木星纪年法 | 太岁纪年法 | 星次 | 天球 | 黄道带 | 四象二十八星宿 )

文章目录 一、天干地支纪年法二、木星纪年法1、星次2、天球3、黄道带 三、太岁纪年法四、四象二十八星宿1、四象与二十八星宿关联2、二十八星宿与星次关联3、西游记中的二十八星宿 2024 年 使用 天干地支纪年法是 甲辰年 , 使用 太岁纪年法是 阏逢执徐 ; 一、天干地支纪年法 天…

c 宏转字符串与拼接

C 用宏可以转字符串与拼接字符。 举例 #include <stdio.h> #define CON(a) (B##a) //concatenate #define STR

vim常见命令

目录 快捷键 常用命令 快捷键 i 切换插入模式 esc 退出插入模式 p 粘贴 常用命令 命令作用:q退出 vim 编辑器:q!不保存文件&#xff0c;直接退出 vim 编辑器:w只保存文件&#xff0c;但不退出 vim 编辑器:wq保存文件且退出 vim 编辑器ZZ保存文件且退出 vim 编辑器:start,…

建筑能源管理系统

建筑能源管理系统是一种集成了先进的监测、控制、分析和优化技术的智能化系统&#xff0c;旨在提高建筑能源效率&#xff0c;降低能源消耗&#xff0c;减少环境污染&#xff0c;并为用户提供舒适、安全的建筑环境。通过监测建筑内的各种能源消耗情况&#xff0c;如电力、热水、…

arthas(阿尔萨斯)日常java代码调优使用命令

官方项目文档&#xff1a;https://gitee.com/arthas/arthas &#xff08;最权威的教学还是得官网&#xff0c;这里仅作简单记录&#xff09; 1&#xff1a;启动 java -jar arthas-boot.jar 2&#xff1a;查看cpu占用排名前三 thread -3 3&#xff1a;查看指定id thread 203 4:查…

数据结构day1

1.思维导图 2.定义一个简单宏或宏函数&#xff0c;实现两个数交换。 3.定义字符类型指针&#xff0c;指针指向n个连续堆区内存&#xff0c;输入&#xff0c;计算字符串长度 定义函数&#xff0c;实现内存申请 定义函数&#xff0c;解释字符串长度 定义函数&#xff0c;释放内…

ACEeditor使用手册(一)

文章目录 ACEeditor使用手册引言简介ACEeditorACEeditor的应用场景为什么选择ACEeditor 1. ACEeditor基础1.1 安装与配置通过CDN引入使用npm/yarn安装配置基本选项 1.2 创建一个简单的编辑器在HTML中创建容器元素初始化ACEeditor实例 1.3 主题与样式内置主题列表自定义主题样式…

河南文旅火爆出圈,来了解小魔推短视频矩阵的魅力!

最近几天四川文旅的抖音账号&#xff0c;1天发视频六十多条&#xff0c;增长粉丝20w&#xff0c;另外河北文旅抖音账号&#xff0c;一天发视频七十多条&#xff0c;增长粉丝30w&#xff0c;更有河南文旅抖音账号&#xff0c;单日发布上百条视频&#xff0c;实现涨粉15w&#xf…

最长上升子序列模型(LIS)

最长上升子序列模型就像它的名字一样&#xff0c;用来从区间中找出最长上升的子序列。它主要用来处理区间中的挑选问题&#xff0c;可以处理上升序列也可以处理下降序列&#xff0c;原序列本身的顺序并不重要。 模型 895. 最长上升子序列&#xff08;活动 - AcWing&#xff0…

代码随想录算法训练营第六天| 242 有效的字母异位词 349 两个数组的交集 202 快乐数 1 两数之和

目录 242 有效的字母异位词 349 两个数组的交集 202 快乐数 1 两数之和 242 有效的字母异位词 排序 class Solution { public:bool isAnagram(string s, string t) {sort(s.begin(),s.end());sort(t.begin(),t.end());return t s;} }; 时间复杂度O(nlogn) 空间复杂度O(l…

Apache Flink 1.15正式发布

Apache Flink 核心概念之一是流 (无界数据) 批 (有界数据) 一体。 流批一体极大的降低了流批融合作业的开发复杂度。在过去的几个版本中&#xff0c;Flink 流批一体逐渐成熟&#xff0c;Flink 1.15 版本中流批一体更加完善&#xff0c;后面我们也将继续推动这一方向的进展。目…

mysql原理--事务的隔离级别与 MVCC

1.事前准备 为了故事的顺利发展&#xff0c;我们需要创建一个表&#xff1a; CREATE TABLE hero (number INT,name VARCHAR(100),country varchar(100),PRIMARY KEY (number) ) EngineInnoDB CHARSETutf8;然后向这个表里插入一条数据&#xff1a;INSERT INTO hero VALUES(1, 刘…

Nginx笔记

安装Nginx docker pull nginx # 下载nginx docker run \ --name nginx \ -p 80:80 \ -d \ nginx # 测试容器的运行 mkdir -p /data/nginx/conf mkdir -p /data/nginx/www mkdir -p /data/nginx/logs docker cp nginx:/etc/nginx/nginx.conf /data/nginx docker cp nginx:/e…

排序-冒泡排序

冒泡排序 ●第一步 从左到右&#xff0c;两两比较&#xff0c;将最大的数放在数组的最后一位(即下标n-1的位置) ●第二步 采用相同的方法&#xff0c;再次遍历&#xff0c;将第二大的数&#xff0c;放在数组倒数第二的位置(即n-2的位置)&#xff0c;以此类推,直至数组有序。 …

如何才能拥有比特币 - 01 ?

如何才能拥有BTC 在拥有 BTC 之前我们要先搞明白 BTC到底保存在哪里&#xff1f;我的钱是存在银行卡里的&#xff0c;那我的BTC是存在哪里的呢&#xff1f; BTC到底在哪里&#xff1f; 一句话概括&#xff0c;BTC是存储在BTC地址中&#xff0c;而且地址是公开的&#xff0c;…

【Python 千题 —— 基础篇】喜欢的水果

题目描述 题目描述 我们调查了班上的三名同学(Alan,Bob,Sandy)喜欢的水果,其中组成了以下键值对:‘Alan’: [‘apple’, ‘banana’, ‘orange’],‘Bob’: [‘banana’, ‘grapes’, ‘peach’],‘Sandy’: [‘apple’, ‘pear’, ‘strawberry’, ‘banana’]。 对…