goolge.sparse*系列容器依赖关系:
- sparsetable
- sparsehashtable
- sparse_hash_map
- sparse_hash_set
与现有的一些“标准”实现不同,sparsehash
table 使用二次探测法,而不是链接,来解决hash冲突。
sparse
table 就更奇特了,它是一个两级结构,第一级使用直接索引法,而第二级使用的是顺序查找
。
不过,第二级的尺寸比较小,可以放入cpucache,并且它的顺序查找使用的是popcount(bitmap[i]=count of (j < i and bitmap[j]==1))。在实现中它使用的是字节直接索引法,速度还行。第二级索引使用位图实现,如果值存在,bitmap[i]被置为1,否则为0,当值不存在时,不会消耗内存。具体说:
sparsetable::operator[i]是这样执行的:
// google 的代码比较长,并且不够直接
// 用这个直接且较短的代码来表示
value_type& sparsetable::operator[](int i)
{
int j = i % GroupSize;
sparsegroup* group = m_groups[i / GroupSize];
unsigned char* bitmap = group->bitmap;
if (bitmap[j/8] & 1 << j%8) {
// value existed
int valueIndex = popcount(bitmap, j);
return group->values[valueIndex];
}
return s_default_value;
}
还有一个顺序查找/插入的地方:group->values是一个value_type数组,它的插入、删除是O(n),当然,在这里,因为n<=GroupSize,而GroupSize是一个编译时常量,并且不太大,google说它是O(1)也不算错。
google.GroupSize的默认值是48, 是为了更好地对齐sparsegroup结构,在64位系统上,sizeof(sparsegroup)==sizeof(void*)+(GroupSize+7)/8 + 2 == 16).。
其实,在intel 和 amd 的新cpu的SSE4.2指令集中,有一个popcnt指令,其它一些cpu中也有popcount指令。并且,在icc/msvc/gcc的新版中都有 intrinsic 支持,这比软件实现要快得多。理想上,google应该在检测有cpu支持时就直接用硬件popcount。
gcc 有以下内建函数(相当于msvc/icc的intrinsic),并且可以用于所有实现了popcount指令的cpu
int __builtin_popcount (unsigned int);
int __builtin_popcountl (unsigned long);
int __builtin_popcountll (unsigned long long);
根据我的测试: Intel Xeon 64bit
,64bit popcount, cycle unroll 8
硬件popcount比 google 的软件算法快了30倍,而 sparsetable 查询时最慢的地方就在这里,事实上现在大部分主流cpu都支持硬件popcount,希望google可以改进。
要开启gcc硬件popcount,加编译选项 -mpopcnt。
分享到:
相关推荐
4. **简单集成**:对于基于Maven的项目,只需将`com.google.code.kaptcha:2.3.2`添加到项目的`pom.xml`文件中,就可以轻松地引入这个依赖,实现验证码功能。 5. **安全性**:Kaptcha生成的验证码具有一定的安全特性...
在Java编程领域,Google提供了一系列强大的工具集,其中就包括`com.google.common.collect`包,它为Java开发者提供了丰富的集合操作和数据结构,极大地提高了开发效率。本文将围绕`google-collect-1.0-rc1.jar`这个...
在Java编程领域,`com.google.common.collect`是一个非常重要的包,它是Google的Guava库的一部分。Guava是一个广泛使用的开源库,提供了许多实用的集合框架、缓存、原生类型支持、并发工具、字符串处理等功能。`...
在Java SE环境中,ZXing的客户端组件`com.google.zxing.client.j2se.jar`扮演了关键角色,是开发者实现条码处理功能的重要工具。 1. **ZXing库简介** ZXing库由Google开发,最初是为了Android平台设计,但后来发展...
java 工具包com.google.common.jar
三种方法对web-Google.txt进行pagerank计算,1.python以稀疏矩阵方法实现单机计算谷歌网页数据计算pageRank值2.调用networkx库3.调用networkx库,其中pagerank自己实现。
截止至2016-12-23,github上com.google.gson.Gson 最新的2.8.0jar包。强大的json字符串解析功能及将字符串转换为json格式。才发现需要这么多分,大家也可以去网盘下载: ...
谷歌拼音输入法安卓版是谷歌官方推出适用于专为android安卓系统制订的手机输入法。全新谷歌手机输入法具有视觉上质感样式的输入法界面,去掉了键帽的设计,没有了分割的线条,给人一种更加简单、纯粹、统一的感觉,...
截止至2018-11-27,github上com.google.gson.Gson 最新的2.8.5jar包。强大的json字符串解析功能及将字符串转换为json格式。我16年上传的免费下载的2.8.0版本不知道为什么变成下载需要50分了
标题中的"com.google.zxing两个jar包"指的是Google开源项目ZXing(Zebra Crossing)的两个Java类库文件。ZXing是一个多格式的一维/二维条码图像处理库,主要用于读取、解码多种条码格式,如QR码、DataMatrix、UPC-A...
74.125.128.138 kh.google.com 74.125.128.138 www.google.com 72.14.203.101 www.panoramio.com 74.125.39.99 www.google.com 74.125.39.99 kh.google.com 完毕,直接关闭记事本页面即可。 重新启动谷歌地球就可以...
google TTS jar包 google语音包,com.google.tts google语音工具包 google TTS jar包 google语音包,com.google.tts
google-maps-api-threejs-layer, 谷歌地图 API层,使用 Three.js 实现超快速动画 用于 谷歌地图 API的 Three.js-层谷歌地图 API层,使用 Three.js 实现超快速动画。用法new ThreejsLayer(options, completeCallback)...
android tts 语音包 apk
Android webview apk 版本:115.0.5790.138,兼容32/64位。
要生成二维码,主要涉及`com.google.zxing.client.j2se.MatrixToImageWriter`和`com.google.zxing.common.BitMatrix`两个类。首先,创建一个`BitMatrix`对象,将要编码的数据和格式设置好,然后使用`...
Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] ...
java服务端实现谷歌动态密码验证,包含二唯码字段,阿里身份宝的下载路径为:..._used=&channel=WEB&fdh=no&id_file=012200c6-9b29-11e6-95c0-00163ed833e7&instance=softonic_en&type=PROGRAM&url=...
table固定左侧多列,画面中可对多个table进行固定,谷歌、ie都试过没问题;之前实在是网上找不到好的,就自己整合弄了一个,质量没的说,肯定胜过90%其他的;调用简单: 例子是:html+jquery+FixedTable.js $("#...
"google.map.plugin.js" 文件很可能是这个插件的核心脚本,包含了实现这些功能的JavaScript代码。 在使用谷歌地图插件时,首先需要在你的项目中引入 "google.map.plugin.js" 文件。这通常通过在HTML文件中添加`...