最近在菜鸟教程上自学redis。看到Redis HyperLogLog的时候,对“基数”以及其它一些没接触过(或者是忘了)的东西产生了好奇。

  于是就去搜了“HyperLogLog”,从而引出了Cardinality Estimation算法,以及学习它时参考的一些文章:

  http://blog.codinglabs.org/articles/algorithms-for-cardinality-estimation-part-i.html

  从文章上看来,基数是指一个集合(这里的集合允许存在重复元素,与集合论对集合严格的定义略有不同,如不做特殊说明,本文中提到的集合均允许存在重复元素)中不同元素的个数。

  这就类似“求一个数组中不重复元素的个数”的算法。如数组a[10] = {1,2,3,4,1,2,3,4,5,6,7},那么不重复元素就是{1,2,3,4,5,6,7},一共7个。对于它的应用场景,比如一个网站要统计“一个人”的访问次数的时候,比如小明,那么就给对“小明”打上标记,当它下次来访问的时候,总访问次数不能加一。只有当不是“小明”的人,比如“小丽”来访问,对将总访问次数加一。

  这又好像之前做过的一题算法题:统计字符串“abcdaaabceeda”中不重复的字母的个数了。当然,最简单粗爆的方法就是去一次又一次地遍历,如:判断第n个字符是否有出现过,先对前n-1个字符进行遍历比较。这样的话也太浪费时间了。于是,当时我想了一个办法:字符串中只有字母,只要建一个长度为26的哈希表,然后遍历一次字符串,把读到的字符填进哈希表中,最后遍历哈希表就可以了:

hash.c

 #include <stdio.h>
#include <string.h> int main()
{
char str[] = "abcdaaabceeda";
int hash[] = {};
int size = strlen(str);
int i;
for(i = ; i < size; ++i)
{
int temp = str[i] - 'a';
++hash[temp];
}
int num = ;
for(i = ; i < ; ++i)
{
num += hash[i] > ? : ;
}
printf("num = %d\n", num);
}

  如果只统计26个小写字母,只需要26个int型空间。想到bitmap可以节约空间,于是也用它写了一个:

bitmap.c

 #include <stdio.h>
#include <string.h> int hamming_weight(unsigned int bitmap)
{
unsigned int temp = bitmap;
temp = (temp & 0x55555555) + ((temp & 0xaaaaaaaa) >> );
temp = (temp & 0x33333333) + ((temp & 0xcccccccc) >> );
temp = (temp & 0x0f0f0f0f) + ((temp & 0xf0f0f0f0) >> );
temp = (temp & 0x00ff00ff) + ((temp & 0xff00ff00) >> );
temp = (temp & 0x0000ffff) + ((temp & 0xffff0000) >> );
return temp;
} int main()
{
char str[] = "abcdaaabceeda";
unsigned int bitmap = ;
int size = strlen(str);
int i;
for(i = ; i < size; ++i)
{
int loc = str[i] - 'a';
int temp = << loc;
bitmap |= temp;
}
printf("num = %d\n", hamming_weight(bitmap));
}

  区别就是用hash还可以统计单个字符出现的次数,而bitmap可以用到hamming weight来统计总次数,且节省了大量空间。

  对于网站统计“小明”等人的访问次数的问题,其实相当于要把“小明”传入哈希函数,然后找到相应地址,标记为“已访问”。要统计的时候,根据哈希表的数据结构进行遍历,或是计算bitmap中1的个数等方法来统计。以上是我的个人见解,不涉及概率等实现问题。

萌新笔记——Cardinality Estimation算法学习(一)(了解基数计算的基本概念及回顾求字符串中不重复元素的个数的问题)的更多相关文章

  1. Cardinality Estimation算法学习(一)(了解基数计算的基本概念及回顾求字符串中不重复元素的个数的问题)

    最近在菜鸟教程上自学redis.看到Redis HyperLogLog的时候,对“基数”以及其它一些没接触过(或者是忘了)的东西产生了好奇. 于是就去搜了“HyperLogLog”,从而引出了Card ...

  2. 萌新笔记——Cardinality Estimation算法学习(二)(Linear Counting算法、最大似然估计(MLE))

    在上篇,我了解了基数的基本概念,现在进入Linear Counting算法的学习. 理解颇浅,还请大神指点! http://blog.codinglabs.org/articles/algorithm ...

  3. 萌新笔记——用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)

    前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成"* ...

  4. Cardinality Estimation算法学习(二)(Linear Counting算法、最大似然估计(MLE))

    在上篇,我了解了基数的基本概念,现在进入Linear Counting算法的学习. 理解颇浅,还请大神指点! http://blog.codinglabs.org/articles/algorithm ...

  5. 算法练习之x的平方根,爬楼梯,删除排序链表中的重复元素, 合并两个有序数组

    1.x的平方根 java (1)直接使用函数 class Solution { public int mySqrt(int x) { int rs = 0; rs = (int)Math.sqrt(x ...

  6. 萌新笔记——C++里创建 Trie字典树(中文词典)(三)(联想)

    萌新做词典第三篇,做得不好,还请指正,谢谢大佬! 今天把词典的联想做好了,也是比较low的,还改了之前的查询.遍历等代码.  Orz 一样地先放上运行结果: test1 ID : char : 件 w ...

  7. 萌新笔记——C++里创建 Trie字典树(中文词典)(二)(插入、查找、导入、导出)

    萌新做词典第二篇,做得不好,还请指正,谢谢大佬! 做好了插入与遍历功能之后,我发现最基本的查找功能没有实现,同时还希望能够把内存的数据存入文件保存下来,并可以从文件中导入词典.此外,数据的路径是存在配 ...

  8. 萌新笔记——C++里创建 Trie字典树(中文词典)(一)(插入、遍历)

    萌新做词典第一篇,做得不好,还请指正,谢谢大佬! 写了一个词典,用到了Trie字典树. 写这个词典的目的,一个是为了压缩一些数据,另一个是为了尝试搜索提示,就像在谷歌搜索的时候,打出某个关键字,会提示 ...

  9. 萌新笔记之堆(heap)

    前言(萌新感想): 以前用STL的queue啊stack啊priority_queue啊,一直很想懂原理,现在终于课上到了priority_queue,还有就是下周期中考,哈哈,所以写几篇blog总结 ...

随机推荐

  1. 气泡 弹出 bootstrap-popover的配置与灵活应用

    <script src="/assets/addons/bootstrap-select/bootstrap-select.min.js"></script> ...

  2. SQL Server-聚焦过滤索引提高查询性能(十)

    前言 这一节我们还是继续讲讲索引知识,前面我们讲了聚集索引.非聚集索引以及覆盖索引等,在这其中还有一个过滤索引,通过索引过滤我们也能提高查询性能,简短的内容,深入的理解,Always to revie ...

  3. ListView中item定位

    ListView 实现定位特定 item 最近在项目中需要使 ListView 能跳转到特定的 item,查阅文档后,发现 ListView 有以下几种方法可供使用: smoothScrollToPo ...

  4. cmder git bash 使用

    cmder 是一款 windows 下的命令集合软件,它可以集合各种系统下的命令,并且操作非常快速方便. 安装有两个版本,一个是简化版(4.27M),一个是完全版(75.7M),它们的唯一区别:完全版 ...

  5. DG gap sequence修复一例

    环境:Oracle 11.2.0.4 DG 故障现象: 客户在备库告警日志中发现GAP sequence提示信息: Mon Nov 21 09:53:29 2016 Media Recovery Wa ...

  6. OWIN与Katana详解

    前言 我胡汉三又回来了,!!!!, 最近忙成狗,实在没空写博文,实在对不起自己,博客园上逛了逛发现 我大微软还是很给力的 asp.net core 1.0 .net core 1.0 即将发布,虽然. ...

  7. WebAPI接收JSON参数注意事项

    运行环境:ASP.NET 4.5.2. 当我们向GlobalConfiguration.Configuration.MessageHandlers添加一个DelegatingHandler派生类后,很 ...

  8. mvc过滤器学习(1)

    mvc 过滤器结构图 AuthorizeAttribute AuthorizeAttribute是IAuthorizationFilter的默认实现,添加了Authorize特性的Action将对用户 ...

  9. C#——this关键字(2,3)(含求助贴)

    这次来看一看this关键字的第二个用法:将对象作为参数传递到其他方法 ----------------------------------------------------------------- ...

  10. Redis命令拾遗四(集合类型)—包含简单搜索筛选商品设计实例。

    本文版权,归博客园和作者吴双共同所有.转载和爬虫请注明博客园蜗牛Redis系列文章地址 http://www.cnblogs.com/tdws/tag/NoSql/ Redis数据类型之集合(Set) ...