题目介绍

这是题目原文。
注意:在拉取项目的时候需要注意拉取2024fallTag,本人血泪教训!

本题是关于HyperLogLog的具体实现,其介绍可以看这个视频进行了解。简单来说HyperLogLog可以在一个非常小的固定内存下(一般为十几KB)非常快速地估算出大量数据的唯一元素数量,并且其可以分别对多个数据库独立估算,还不会损失精度。

比如要统计访问网站的唯一用户数,如果用精确算法,需要对数据库中的所有数据进行比对,这会占用非常大的内存且非常耗时,尤其是在分布式存储的情况下。但我们在绝大多数的时候并不需要一个精确的值,因此可以使用HLL对其进行估算(虽说是估算,但其误差也非常小)。

这道题主要检查了学生的C++基础,以及对C++项目的开发和调试能力。

文章末尾有本人的项目代码地址,文章内容主要讲述思路和一些细节不会出现代码,大家各取所需。

Task#1

Task#1是实现基本的HLL算法。

所需修改的文件目录为:
src/include/primer/hyperloglog.h
src/primer/hyperloglog.cpp

测试文件的目录为:
test/primer/hyperloglog_test.cpp

原始代码中已经给出了一些变量和方法的定义及实现,需要我们进行完善和补全。

hyperloglog.h中的变量部分给出了最终的结果cardinality_和计算常量CONSTANT,缺少了题目中所提及的bmpbp可以设置为uint8_t类型的参数,因为其值的范围在0到63之间,m可以设置为uint8_t的数组,原因同上。

  • CalculateHash():将传入的值转换为哈希值的方法。
  • GetCardinality():返回最终结果。

hyperloglog.cpp是该算法主要的函数实现。以下是各个方法的简介:

  • HyperLogLog(inital_bits):构造函数,需要我们根据传入的b初始化我们内部的bm
  • AddElem(val):计算出传入值的p并将其存在m中(最主要方法)。
  • ComputeCardinality():根据公式计算最终结果。
  • ComputeBinary():将哈希值转换为64位二进制流。
  • PositionOfLeftmostOne():计算出p值(二进制流中最左侧 1 的位置)。

我这里添加了一个函数GetBucketValue(),用来计算p应该存在m的哪个位置中。

接下来我会大概说一下我的解答中每个方法的实现。

HyperLogLog(inital_bits)

根据传入的b初始化我们内部的bm。需要对b的值进行判断,看是否是小于0的值,如果小于0则直接return,否则对我们内部的b进行赋值。同时需要根据b重新设置我们m的大小。
注意: 如果将b设置为size_t或者unit_t类型,需要注意其数值不会小于0,容易因此产生bug。

ComputeBinary()

可以直接使用std::bitsize<64>()方法,将传入的哈希值转换为64位二进制流。需注意,这里转换后的值第0位是低位,第63位是高位,不要搞反了。

GetBucketValue()

我们需要从后往前获取b位二进制流的内容,计算这个二进制数在十进制下是几。可以通过位操作符<<进行计算。

PositionOfLeftmostOne()

由于Task#1是计算高位1的位置,高位的前b位又被用来计算插入位置。所以我们需要从第63 - b位开始,从高到低查找二进制流第一个1的位置。

AddElem(val)

有了前面几个方法,这个方法实现起来就比较简单了。分别调用前面的几个方法,得到参数的哈希值、64位二进制流、插入m的位置、高位1的位置p,就只需将当前pm上的值比较一下大小,将大的存入就可以了。

ComputeCardinality()

根据公式计算最终结果,可以先算出分母的总数,再计算整个公式,可以使用static_cast<size_t>()方法保留结果的整数部分。进行幂计算时可以使用1.0 / std::pow(2, num)进行计算。

Task#2

要求我们实现HyperLogLog算法的密集布局,整体与Task#1类似,不过这里是从低位开始计算0的数量,并且如果数量超过15,需要将其拆分成高3位和低4位分别进行存储。

所需修改的文件目录为:
src/include/primer/hyperloglog_presto.h
src/primer/hyperloglog_presto.cpp

hyperloglog_presto.h文件多出了dense_bucket_overflow_bucket_两个参数,前者和前面的m基本相同,后者是在发生溢出时存储高3位的桶。

整体思路没有什么变化,只有以下几点需要变化:

  1. PositionOfLeftmostOne()方法需要改为从低到高计算0的个数。
  2. 获取到0的个数p后,需将其拆分为高3位和低4位。可以使用与操作符&进行处理。
  3. 在对比p和插入位置的值,以及计算最终结果时,要将dense_bucket_overflow_bucket_中相应位置的值进行合并,转换为十进制进行比较。转换为十进制可以使用to_ulong()方法,合并操作可以使用或操作符|

测试

先将test/primer/hyperloglog_test.cpp中的测试函数第二个参数的DIABLE_去掉。

mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Debug ..
make -j$(nproc) hyperloglog_test
./test/hyperloglog_test

正常应该如图所示:
在这里插入图片描述

提交

cd ..
mkdir build_rel && cd build_rel
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j$(nproc)
make format
make check-clang-tidy-p0
make submit-p0

如果有格式问题clang-tidy会报错。我这里本地没有报错,但是提交到平台上就会报格式错误,可能是工具版本的问题。

执行完成后会在根目录生成一个压缩包,上传该压缩包等待平台打分。

正常如图所示:
在这里插入图片描述
代码地址:https://github.com/GCW-kuku/bustub

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

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

相关文章

使用微信免费的图像处理接口,来开发图片智能裁剪和二维码/条码识别功能,爽歪歪

大家好&#xff0c;我是小悟。 1、图片智能裁剪 我们先来了解一下图片智能裁剪。图片智能裁剪聚焦于数字图像的智能化处理。AI技术的引入彻底改变了传统依赖人工框选的裁剪模式。 通过深度学习模型自动识别图像主体&#xff08;人物、商品等&#xff09;&#xff0c;能在极短时…

【代码随想录】+ leetcode hot100:栈与队列算法专题总结、单调栈

大家好&#xff0c;我是此林。 今天分享的是【代码随想录】栈与队列算法专题总结&#xff0c;分享刷算法的心得体会。 1. 用栈实现队列、用队列实现栈 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09;…

《5分钟开发订单微服务!飞算JavaAI实战:IDEA插件安装→空指针修复→K8s部署全流程》

目录 40倍提升开发效能的秘密武器 一、为什么选择飞算JavaAI&#xff1f;​编辑 二、IDEA插件安装三步曲&#xff08;极简版&#xff09; 步骤1&#xff1a;安装插件&#xff08;30秒完成&#xff09; 步骤2&#xff1a;账号登录&#xff08;2种方式任选&#xff09; 方式…

SQL注入基础尝试

进入网址&#xff0c;测试正常回显和出错画面http://1bcf75af-6e69-4f78-ac71-849fb8cde1b5.node5.buuoj.cn/Less-2/? id1用特殊符号判断注入点判断其类型类型为数字型&#xff0c;order by判断列数当数字为4时候报错而3不报错&#xff0c;由此推断列数为3&#xff0c;接着测试…

[Dify] -进阶4-在 Dify 中实现 PDF 文档问答功能全流程

随着业务需求增加,AI 应用常遇到让模型“读懂”PDF并回答问题的场景。借助 Dify 的 RAG(Retrieval‑Augmented Generation)能力,我们可以构建一个“ChatPDF”式的互动问答机器人。本文详细讲解从环境搭建、PDF 上传、文本抽取、向量检索到问答部署的完整流程。 一、技术栈与…

【EPLAN 2.9】许可证xx成功却显示红色叉,无法启动

问题现象&#xff1a; 无法启动。 原因&#xff1a;通过mstsc远程桌面连接会占用显卡&#xff0c;导致调用显卡的软件无法成功。参考&#xff1a;Windows自带远程桌面(mstsc)在远程时无法启动&#xff08;打开&#xff09;某些应用&#xff08;软件&#xff09;的解决办法 编写…

Oracle ADG 一键自动化搭建脚本

前言在 Oracle 数据库高可用架构中&#xff0c;Active Data Guard (ADG) 是保障数据安全和业务连续性的核心方案。然而传统 ADG 搭建涉及数十项复杂配置&#xff08;监听、TNSNAMES、参数文件、密码文件、日志传输、应用服务等&#xff09;&#xff0c;步骤繁琐且易错&#xff…

某邮生活旋转验证码识别

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 本文识别已同步上线至OCR识别网站: http://yxlocr.nat300.top/ocr/other/30 旋转验证码数据集如下: 看起来很像顶象的,都有着绿边干扰,那其实思路也能简单了,…

基于Android的景点旅游信息系统App

项目介绍用户分为普通用户和管理员两种角色。 1.管理员有用户管理、景点管理、评论管理功能。 2.用户管理包括查看已注册用户列表、删除用户&#xff1b; 3.景点管理包括增加景点信息、修改景点信息、删除景点信息、将景点设为推荐&#xff1b; 4.评论管理包括查看评论内容、删…

Python----NLP自然语言处理(词向量与词嵌入)

一、词向量与词嵌入将文本语料分词后&#xff0c;接下来就可以让计算机学习这些词&#xff0c;理解这些词的含义。我们可以直接将文本数据输入到计算机中让计算机学习吗&#xff1f;不可以&#xff0c;计算机只能看懂数字&#xff0c;看不懂文字。所以我们需要将词语转成一串数…

八、DMSP/OLS、NPP/VIIRS等夜间灯光数据能源碳排放空间化——碳排放空间分级、空间自相关

一、前言 前面已经将反演后能源碳排放提取、增长率、Slope趋势法分析做了介绍,本节就是给大家介绍如何制作碳排放空间分级和空间自相关的一些具体操作步骤,其实网上也有比较多的各类学习资源,但是质量就层次不齐。这里就给大家详细从头到尾说明白解释清楚如何获取下图这些成…

【电脑】鼠标的基础知识

下面是一些关于鼠标的详细知识&#xff1a;鼠标的基本结构外壳&#xff1a;通常由塑料或金属制成&#xff0c;提供手握的地方。滚轮&#xff1a;位于中央&#xff0c;用于滚动页面。有些高端型号的滚轮可以自定义功能。按键&#xff1a;最常见的是左键、右键和中键&#xff08;…

A33-vstar笔记及资料分享:搭建交叉编译环境

前言 本篇主要是介绍博主在构建A33-vstar开发板镜像时的步骤&#xff0c;也踩了一些坑&#xff0c;才整理出来&#xff0c;如果有错误&#xff0c;还请指正。 A33-vstar开发板的资料&#xff1a; 通过网盘分享的文件&#xff1a;A33-Vstar开发板资料合集 链接: https://pan.bai…

基于51单片机智能家居监控系统设计

摘 要 智能家居是以住宅为平台&#xff0c;利用综合布线技术、网络通信技术、安全防范技术、自动控制技术、音视频技术将家居生活有关的设施集成&#xff0c;构建高效的住宅设施与家庭日程事务的管理系统&#xff0c;提升家居安全性、便利性、舒适性、艺术性&#xff0c;并实现…

在 OpenSUSE Tumbleweed 和 Leap 上安装 VirtualBox

OpenSUSE 是一款特别适合工作站、服务器及虚拟化环境(如 VirtualBox 和 VMware)的 Linux 发行版。虽然知名度不及 Ubuntu,但实际使用中我发现它比 CentOS、RedHat 甚至 Ubuntu 更易理解、安装和使用。当然,Ubuntu 庞大的社区支持确实使其更受欢迎。 该系统预装了 LibreOff…

Ansible AWX 自动化运维

Ansible & AWX 自动化运维一、概述1. Ansible 简介定义Ansible 是一款由 Michael DeHaan 创建的开源自动化工具&#xff0c;它基于 Python 语言开发&#xff0c;旨在简化复杂的 IT 任务&#xff0c;如配置管理、应用部署、任务编排和云资源管理等。其核心设计理念是“无代理…

如何解决服务器频繁重启的问题?

高防CDN和香港高防服务器是两种常见的网络安全解决方案&#xff0c;用于应对DDoS攻击和其他恶意流量。但它们的工作原理、应用场景和特点有所不同。以下是详细的对比分析&#xff1a;1. 什么是高防CDN和香港高防服务器&#xff1f;1.1 高防CDN高防CDN (Content Delivery Networ…

docker安装、启动jenkins服务,创建接口自动化定时任务(mac系统)

前提&#xff1a;安装Docker。 1、Docker拉取镜像、启动服务 &#xff08;可参考Jenkins官网教程&#xff1a;安装Jenkins&#xff09; 1. 从Docker Hub下载最新的Jenkins LTS&#xff08;长期支持&#xff09;镜像&#xff1a; docker pull jenkins/jenkins:lts2. 使用Doc…

板凳-------Mysql cookbook学习 (十一--------12)

第16章&#xff1a;使用存储例程、触发器和事件 16.0 引言 mysql> -- 首先设置分隔符&#xff08;避免分号被解释为语句结束&#xff09; mysql> DELIMITER // mysql> mysql> -- 创建第一个存储过程 mysql> CREATE PROCEDURE get_time()-> BEGIN-> SE…

linux端口监听命令

端口监听命令&#xff1a; netstat -nlp&#xff5c;grep 86886 netstat -nlp&#xff5c;grep 8686 netstat -nlp&#xff5c;grep 8686 netstat -nl&#xff5c;grep 8686 netstat -n&#xff5c;grep 8686各命令的含义与区别&#xff1a; 1. netstat -nlp | grep 86886 参数…