CMU15-445 24fall Primer HyperLogLog

news/2025/2/8 23:40:44/文章来源:https://www.cnblogs.com/Phrink734/p/18705597

P1 HyperLogLog注意事项

1.Hyperloglog.cpp/.h

1. 防止内存溢出有关的错误

  • 在默认的构造函数中需要定义寄存器的大小

  • //hyperloglog.h
    /** @todo (student) can add their data structures that support HyperLogLog */
    int16_t n_bits_;                  // b
    int32_t num_registers_;           // m=2^b
    std::vector<uint8_t> registers_;  // m registers or m buckets
    std::mutex mtx;
    std::shared_mutex shlock_;
    
  • //.cpp 定义大小
    template <typename KeyType>
    HyperLogLog<KeyType>::HyperLogLog(int16_t n_bits) {cardinality_ = 0;if (n_bits < 0) n_bits = 0;n_bits_ = n_bits;num_registers_ = (1 << n_bits);registers_.resize(num_registers_, 0);
    }
    

2.bitset的存储问题 和计算问题

  • 以下是对bitset的介绍

  • bitset<9> bit_(9);
    这是他的二进制:000001001
    index:	  876543210
    数值位:	000001001
    也就是说他和普通的数组不一样 不是从低到高 而是从高到低
    因此PositionOfLeftmostOne函数要求的计算从左到右的1需要倒着计算
    
  • 我在计算Position时传入的是完整的 bitset 因此他的大小是BITSET_CAPACITY

  • //计算position
    template <typename KeyType>
    auto HyperLogLog<KeyType>::PositionOfLeftmostOne(const std::bitset<BITSET_CAPACITY> &bset) const -> uint64_t {/** @TODO(student) Implement this function! *///取消掉前面的nbits_位 直接从有效位开始计算for (int64_t i = BITSET_CAPACITY - 1 - n_bits_; i >= 0; --i) {if (bset[i] == 1) return static_cast<uint64_t>(BITSET_CAPACITY - n_bits_ - i);}return BITSET_CAPACITY - n_bits_ + 1;
    }
    
  • 虽然bitset是从高位到地位进行的存储 但是前面的n_bits_位依然是当前寄存器的 index,如何计算呢? 我们考虑位运算的左移右移 也就是

  • uint64_t j = (binary >> (BITSET_CAPACITY - n_bits_)).to_ullong();  //桶的编号
    //binary是哈希后的64位bitset
    //to_ullong()是转换为10进制的函数
    binary >> (BITSET_CAPACITY - n_bits_)
    //一共有BITSET_CAPACITY位 出去n_bits_位 剩下的就是有效位    我们把 有效位右移 剩下的就是n_bits_位
    

3.添加遇到的问题

  • 有基本的互斥锁的知识了解到,AddElem是一个写入资源的操作 因此我们需要一个互斥锁保护线程 提前在.h文件添加std::mutex mtx;成员即可,记得引入头文件#include <mutex>

  • 整个文件都会经常用到强制类型转换的操作 static_cast<TYPE>(Value)的操作必不可少 registers_[j] = std::max(registers_[j], static_cast<uint8_t>(p)) 更是重要

  • template <typename KeyType>
    auto HyperLogLog<KeyType>::AddElem(KeyType val) -> void {/** @TODO(student) Implement this function! */hash_t hash = CalculateHash(val);auto binary = ComputeBinary(hash);//保留n_bits 位 即 桶的编号uint64_t j = (binary >> (BITSET_CAPACITY - n_bits_)).to_ullong();  //桶的编号uint64_t p = PositionOfLeftmostOne(binary);                        //计算1的位置//他的前面的n_bits_位是记录他的寄存器的位置 xstd::lock_guard<std::mutex> lock(mtx);//写入操作registers_[j] = std::max(registers_[j], static_cast<uint8_t>(p));
    }
    

4.计算遇到的问题

  • ComputeCardinality是一个典型的读操作 需要一个std::shared_mutex来保护,自然的使用 std::shared_lock<std::shared_mutex> guard(shlock_),在成员里添加std::shared_mutex shlock_;即可 不过注意需要引入#include <shared_mutex>的头文件 ,shared_mutexcpp17的东西

  • 注意寄存器的数量不能为0 和为负数

  • //注意强制类型转换和浮点数取整的问题
    template <typename KeyType>
    auto HyperLogLog<KeyType>::ComputeCardinality() -> void {/** @TODO(student) Implement this function! *///读操作std::shared_lock<std::shared_mutex> guard(shlock_);double sum = 0.0;if (num_registers_ == 0) return;for (int32_t j = 0; j < num_registers_; ++j) {sum += 1.00 / std::pow(2, static_cast<double>(registers_[j]));}double E = CONSTANT * num_registers_ * num_registers_ / sum;cardinality_ = static_cast<size_t>(std::floor(E));
    }
    

以上的所有注意事项都给出了参考和实现

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

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

相关文章

手把手教你如何用飞书实现betterGI消息推送

在平时,我们一般会使用betterGI的一条龙系统来完成体力的刷取,有的人可能需要知道啥时候刷完体力方便远程关闭电脑啥的,这里给大家如何通过飞书实现BetterGI消息推送的方法 1、支持的事件提醒 事件列表 notify.test : 测试通知 domain.reward : 自动秘境奖励 domain.start :…

2025【重庆联通】活动

2025年2月8日更新 扫码显示详情及办理 扫码显示详情及办理 套餐资费和活动内容均来源于重庆联通【10010人工客服可查,中国联通app官方客服可查】 这里是下面的54个活动的办理名称,请确认【点击也可直接跳转到相应位置】1.云创安全组合包10元(CQ)-立即生效 2.云创数字人名片权…

LLVM+CMAKE+VScode

在mac上使用vscode+CMAKE+LLVM 配置C++环境 仅供参考,请多谅解 原先的vscode官方推荐插件intellisense实在是太慢,以至于在很多大型项目(ns3,OS)等进行静态检查的速度奇慢无比,并且大量消耗资源。于是尝试在mac上使用llvm+clangd进行配置。由于采用的是homebrew安装clang…

FastAPI for Machine Learning: Live coding an ML web application

FastAPI for Machine Learning: Live coding an ML web application https://www.bilibili.com/video/BV1kC411b7Se/?spm_id_from=333.788.videopod.sections&vd_source=57e261300f39bf692de396b55bf8c41b翻译:FastAPI用于机器学习:现场编码一个ML Web应用程序。欢迎!加…

08_LaTeX之自定义LaTeX命令和功能

本章的内容将让你能编写可重复利用的模块——宏包和文档类,并在其中自己定义命令和环境。08_\(\LaTeX{}\) 之自定义\(\LaTeX{}\)命令和功能 目录08_\(\LaTeX{}\) 之自定义\(\LaTeX{}\)命令和功能自定义命令和环境定义新命令定义环境xparse 宏包简介编写自己的宏包和文档类编写…

2024FJ省队集训 - 笔记 游记

Day 0 火车上写了两道可爱小清新数学题。题没写多少bug还一堆。 我们住的是福建省团校,据说是福州有演唱会导致各种酒店房间紧张。 和 wzh,zzp 口胡了一些题目就去睡觉了。 团校的住宿条件确实不错,睡得挺香。 Day 1 T1 提交答案题就是依托美味的构式,你T2T3费劲心思骗个五分…

Stern-Brocot 树

Stern-Brocot 树由两个初始值 \(0\over 1\) 和 \(1\over0\),由两个相邻的数 \(a\over b\) 和 \(c\over d\) 会生成数 \(a + c\over b + d\)。这由图片可以非常直观地看出。形态类似于一棵树。 每个点上有一个"三元组"\((a,b,c)\),\(\left(\dfrac{0}{1},\dfrac{1}{1…

电影解析之虾米解析

我们通常会因为看电影但是需要vip却没有足够生活费去支持的困扰 我就在想有没有白嫖的方法呢(bushi 就在我苦恼的时候我发现了一个方法————就是被称为:解析 的技术这玩意就是最好的选择 但是可能部分人在刚刚接触的时候不会用的于是我就写了一个小软件来支持(只支持wind…

【AI+安全】基于大模型在流量分析领域应用的实践

一、内容概要 随着网络攻击手段的不断进化,流量分析已经成为确保网络安全的关键环节。传统的基于规则和机器学习的方法在一定程度上帮助我们识别和防范攻击,但随着网络攻击形式的多样化和复杂性增加,如何利用更强大的技术手段来分析网络流量,成为了当今网络安全领域的研究热…

RocketMQ实战—7.生产集群部署和生产参数

大纲 1.RocketMQ生产集群部署和生产参数分析 2.RocketMQ生产集群10wTPS压测 3.RocketMQ生产级故障案例1.RocketMQ生产集群部署和生产参数分析 (1)服务器数量 4C8G阿⾥云⾼配服务器共四台,公⽹IP假设如下: 139.224.217.92,106.15.250.248,47.102.152.14,139.224.212.58 (2)…

十二、MyBatis分页插件

十二、MyBatis分页插件@目录十二、分页插件12.1 分页插件使用步骤12.2 分页插件的使用12.3 测试案例本人其他相关文章链接 十二、分页插件 12.1 分页插件使用步骤 1. 添加依赖 <dependency><groupId>com.github.pagehelper</groupId><artifactId>page…

htb Nunchucks walkthrough ssti + shebang绕过apparmor限制

注册发现注册失败扫描子域名 ffuf -u https://nunchucks.htb/ -w /usr/share/dirb/wordlists/common.txt -H "Host: FUZZ.nunchucks.htb" -fs 30589访问看看有啥随便输入个邮箱抓包看看 尝试ssti 注入发现确实存在在hacktrick上搜索payload https://book.hacktricks.…