CMU-15445(2024fall)——PROJECT#0

題目介紹

這是題目原文。
注意:在拉取項目的時候需要注意拉取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 參數…