最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

C語言實(shí)現(xiàn)HyperLogLog

2023-06-25 13:21 作者:機(jī)器朗讀  | 我要投稿


#include <stdio.h>
#include <stdlib.h>
#include <math.h> // gcc -lm for log() 

#define REGISTER_SIZE 16 ? ?// 寄存器的位數(shù),默認(rèn)為16位
#define ARRAY_SIZE (1 << REGISTER_SIZE) ? ?// 寄存器數(shù)組的大小

typedef struct {
 ? ?unsigned int* registers; ? ?// 寄存器數(shù)組
 ? ?int size; ? ?// 寄存器數(shù)組的大小
 ? ?int b; ? ?// 每個(gè)哈希值的前導(dǎo)零位數(shù)
} HyperLogLog;

// 使用djb2哈希算法
unsigned int hash_function(const char* data) {
 ? ?unsigned int hash = 5381;
 ? ?int c;

 ? ?while ((c = *data++)) {
 ? ? ? ?hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
 ? ?}

 ? ?return hash;
}

// 創(chuàng)建并初始化HyperLogLog數(shù)據(jù)結(jié)構(gòu)
HyperLogLog* hyperloglog_create() {
 ? ?HyperLogLog* hll = (HyperLogLog*)malloc(sizeof(HyperLogLog));
 ? ?hll->registers = (unsigned int*)calloc(ARRAY_SIZE, sizeof(unsigned int));
 ? ?hll->size = ARRAY_SIZE;
 ? ?hll->b = REGISTER_SIZE;

 ? ?return hll;
}

// 釋放HyperLogLog數(shù)據(jù)結(jié)構(gòu)的內(nèi)存
void hyperloglog_destroy(HyperLogLog* hll) {
 ? ?free(hll->registers);
 ? ?free(hll);
}

// 計(jì)算哈希值的前導(dǎo)零位數(shù)
int leading_zeros(unsigned int value, int max_bits) {
 ? ?int count = 0;
 ? ?while ((value & 0x80000000) == 0 && count < max_bits) {
 ? ? ? ?value <<= 1;
 ? ? ? ?count++;
 ? ?}
 ? ?return count;
}

// 更新HyperLogLog數(shù)據(jù)結(jié)構(gòu)的寄存器
void hyperloglog_update(HyperLogLog* hll, const char* data) {
 ? ?unsigned int hash = hash_function(data); ? ?// 哈希函數(shù)需要根據(jù)實(shí)際情況實(shí)現(xiàn)
 ? ?unsigned int index = hash & (hll->size - 1);
 ? ?unsigned int value = hash >> REGISTER_SIZE;
 ? ?int count = leading_zeros(value, 32 - REGISTER_SIZE) + 1;
 ? ?if (count > hll->registers[index]) {
 ? ? ? ?hll->registers[index] = count;
 ? ?}
}

// 估計(jì)基數(shù)
double hyperloglog_estimate(HyperLogLog* hll) {
 ? ?double alpha = 0.7213 / (1 + 1.079 / hll->size);
 ? ?double estimate = 0;
 ? ?double sum = 0;

 ? ?for (int i = 0; i < hll->size; i++) {
 ? ? ? ?sum += 1.0 / (1 << hll->registers[i]);
 ? ?}

 ? ?estimate = alpha * hll->size * hll->size / sum;

 ? ?// 根據(jù)哈希函數(shù)的不同,可能需要進(jìn)行修正
 ? ?if (estimate <= 2.5 * hll->size) {
 ? ? ? ?int zero_count = 0;
 ? ? ? ?for (int i = 0; i < hll->size; i++) {
 ? ? ? ? ? ?if (hll->registers[i] == 0) {
 ? ? ? ? ? ? ? ?zero_count++;
 ? ? ? ? ? ?}
 ? ? ? ?}
 ? ? ? ?if (zero_count != 0) {
 ? ? ? ? ? ?estimate = hll->size * log((double)hll->size / zero_count);
 ? ? ? ?}
 ? ?} else if (estimate > (1.0 / 30.0) * pow(2, 32)) {
 ? ? ? ?estimate = -pow(2, 32) * log(1 - estimate / pow(2, 32));
 ? ?}

 ? ?return estimate;
}

int main() {
 ? ?HyperLogLog* hll = hyperloglog_create();

 ? ?// 更新寄存器
 ? ?hyperloglog_update(hll, "data1");
 ? ?hyperloglog_update(hll, "data2");
 ? ?hyperloglog_update(hll, "data3");

 ? ?// 估計(jì)基數(shù)
 ? ?double estimate = hyperloglog_estimate(hll);
 ? ?printf("Estimated cardinality: %.0f\n", estimate);

 ? ?hyperloglog_destroy(hll);
 ? ?return 0;
}


C語言實(shí)現(xiàn)HyperLogLog的評論 (共 條)

分享到微博請遵守國家法律
南木林县| 漳州市| 梅河口市| 新邵县| 北流市| 莱西市| 洛宁县| 松江区| 固原市| 保山市| 电白县| 吕梁市| 凤阳县| 云和县| 蛟河市| 柏乡县| 宿松县| 溧阳市| 武穴市| 阿鲁科尔沁旗| 东光县| 大新县| 金堂县| 宣恩县| 牡丹江市| 临潭县| 新河县| 济南市| 即墨市| 涿鹿县| 伊川县| 广河县| 彭泽县| 山东省| 武山县| 澄城县| 玉门市| 蒙城县| 绥阳县| 绥滨县| 龙海市|