blob: 1bbb8ee21a3df200fce6a80f704a468dcf060138 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc (1.8.0_162) on Thu Mar 14 13:13:08 PDT 2019 -->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>UniqueCountMap (com.yahoo.datasketches:sketches-core 0.13.1-SNAPSHOT API)</title>
<meta name="date" content="2019-03-14">
<link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
<script type="text/javascript" src="../../../../script.js"></script>
</head>
<body>
<script type="text/javascript"><!--
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="UniqueCountMap (com.yahoo.datasketches:sketches-core 0.13.1-SNAPSHOT API)";
}
}
catch(err) {
}
//-->
var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
var tableTab = "tableTab";
var activeTableTab = "activeTableTab";
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
<a name="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="class-use/UniqueCountMap.html">Use</a></li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../index-all.html">Index</a></li>
<li><a href="../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li>Prev&nbsp;Class</li>
<li>Next&nbsp;Class</li>
</ul>
<ul class="navList">
<li><a href="../../../../index.html?com/yahoo/sketches/hllmap/UniqueCountMap.html" target="_top">Frames</a></li>
<li><a href="UniqueCountMap.html" target="_top">No&nbsp;Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a name="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
<div class="subTitle">com.yahoo.sketches.hllmap</div>
<h2 title="Class UniqueCountMap" class="title">Class UniqueCountMap</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
<li><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</a></li>
<li>
<ul class="inheritance">
<li>com.yahoo.sketches.hllmap.UniqueCountMap</li>
</ul>
</li>
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
<hr>
<br>
<pre>public class <span class="typeNameLabel">UniqueCountMap</span>
extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
<div class="block">This is a real-time, key-value HLL mapping sketch that tracks approximate unique counts of
identifiers (the values) associated with each key. An example might be tracking the number of
unique user identifiers associated with each IP address. This map has been specifically designed
for the use-case where the number of keys is quite large (many millions) and the distribution of
identifiers per key is very skewed. A typical distribution where this works well is a
power-law distribution of identifiers per key of the form <i>y = Cx<sup>-&alpha;</sup></i>,
where <i>&alpha;</i> &lt; 0.5, and <i>C</i> is roughly <i>y<sub>max</sub></i>.
For example, with 100M keys, over 75% of the keys would have only
one identifier, 99% of the keys would have less than 20 identifiers, 99.9% would have less than
200 identifiers, and a very tiny fraction might have identifiers in the thousands.
<p>The space consumed by this map is quite sensitive to the actual distribution of identifiers
per key, so you should characterize and or experiment with your typical input streams.
Nonetheless, our experiments on live streams of over 100M keys required about 1.4GB of space.
<p>Given such highly-skewed distributions, using this map is far more efficient space-wise than
the alternative of dedicating an HLL sketch per key. Based on our use cases, after
subtracting the space required for key storage, the average bytes per key required for unique
count estimation (<a href="../../../../com/yahoo/sketches/hllmap/UniqueCountMap.html#getAverageSketchMemoryPerKey--"><code>getAverageSketchMemoryPerKey()</code></a>) is about 10.
<p>Internally, this map is implemented as a hierarchy of internal hash maps with progressively
increasing storage allocated for unique count estimation. As a key acquires more identifiers it
is "promoted" up to a higher internal map. The final map of keys is a map of compact HLL
sketches.
<p>The unique values in all the internal maps, except the final HLL map, are stored in a special
form called a coupon. A coupon is a 16-bit value that fully describes a k=1024 HLL bin.
It contains 10 bits of address and a 6-bit HLL value.
<p>All internal maps use a prime number size and Knuth's Open Addressing Double Hash (OADH)
search algorithm.
<p>The internal base map holds all the keys and each key is associated with one 16-bit value.
Initially, the value is a single coupon. Once the key is promoted, this 16-bit field contains a
reference to the internal map where the key is still active.
<p>The intermediate maps between the base map and the final HLL map are of two types.
The first few of these are called traverse maps where the coupons are
stored as unsorted arrays. After the traverse maps are the coupon hash maps, where the coupons
are stored in small OASH hash tables.
<p>All the intermediate maps support deletes and can dynamically grow and shrink as required by
the input stream.
<p>The sketch estimator algorithms are unbiased with a Relative Standard Error (RSE)
of about 2.6% with 68% confidence, or equivalently, about 5.2% with a 95% confidence.
<p>In a parallel package in the sketches-misc repository, there are 2 classes that can be used
from the command line to feed this mapping sketch piped from standard-in for experimental
evaluation. The first is ProcessIpStream, which processes simple IP/ID pairs and the second,
ProcessDistributionStream, which processes pairs that describe a distribution.
In this same package is the VariousMapRSETest class that was used to generate the error plots
for the web site. Please refer to the javadocs for those classes for more information.</div>
<dl>
<dt><span class="simpleTagLabel">Author:</span></dt>
<dd>Lee Rhodes, Alexander Saydakov, Kevin Lang</dd>
</dl>
</li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<ul class="blockList">
<li class="blockList"><a name="constructor.summary">
<!-- -->
</a>
<h3>Constructor Summary</h3>
<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructor Summary table, listing constructors, and an explanation">
<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colOne" scope="col">Constructor and Description</th>
</tr>
<tr class="altColor">
<td class="colOne"><code><span class="memberNameLink"><a href="../../../../com/yahoo/sketches/hllmap/UniqueCountMap.html#UniqueCountMap-int-">UniqueCountMap</a></span>(int&nbsp;keySizeBytes)</code>
<div class="block">Constructs a UniqueCountMap with an initial capacity of one million entries.</div>
</td>
</tr>
<tr class="rowColor">
<td class="colOne"><code><span class="memberNameLink"><a href="../../../../com/yahoo/sketches/hllmap/UniqueCountMap.html#UniqueCountMap-int-int-">UniqueCountMap</a></span>(int&nbsp;initialNumEntries,
int&nbsp;keySizeBytes)</code>
<div class="block">Constructs a UniqueCountMap with a given initial number of entries.</div>
</td>
</tr>
</table>
</li>
</ul>
<!-- ========== METHOD SUMMARY =========== -->
<ul class="blockList">
<li class="blockList"><a name="method.summary">
<!-- -->
</a>
<h3>Method Summary</h3>
<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colLast" scope="col">Method and Description</th>
</tr>
<tr id="i0" class="altColor">
<td class="colFirst"><code>int</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../com/yahoo/sketches/hllmap/UniqueCountMap.html#getActiveEntries--">getActiveEntries</a></span>()</code>
<div class="block">Returns the number of active, unique keys across all internal maps</div>
</td>
</tr>
<tr id="i1" class="rowColor">
<td class="colFirst"><code>double</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../com/yahoo/sketches/hllmap/UniqueCountMap.html#getAverageSketchMemoryPerKey--">getAverageSketchMemoryPerKey</a></span>()</code>
<div class="block">Returns the average memory storage per key that is dedicated to sketching the unique counts.</div>
</td>
</tr>
<tr id="i2" class="altColor">
<td class="colFirst"><code>double</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../com/yahoo/sketches/hllmap/UniqueCountMap.html#getEstimate-byte:A-">getEstimate</a></span>(byte[]&nbsp;key)</code>
<div class="block">Retrieves the current estimate of unique count for a given key.</div>
</td>
</tr>
<tr id="i3" class="rowColor">
<td class="colFirst"><code>long</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../com/yahoo/sketches/hllmap/UniqueCountMap.html#getKeyMemoryUsageBytes--">getKeyMemoryUsageBytes</a></span>()</code>
<div class="block">Returns total bytes used for key storage</div>
</td>
</tr>
<tr id="i4" class="altColor">
<td class="colFirst"><code>double</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../com/yahoo/sketches/hllmap/UniqueCountMap.html#getLowerBound-byte:A-">getLowerBound</a></span>(byte[]&nbsp;key)</code>
<div class="block">Returns the lower bound cardinality with respect to <a href="../../../../com/yahoo/sketches/hllmap/UniqueCountMap.html#getEstimate-byte:A-"><code>getEstimate(byte[])</code></a> associated
with the given key.</div>
</td>
</tr>
<tr id="i5" class="rowColor">
<td class="colFirst"><code>long</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../com/yahoo/sketches/hllmap/UniqueCountMap.html#getMemoryUsageBytes--">getMemoryUsageBytes</a></span>()</code>
<div class="block">Returns total bytes used by all internal maps</div>
</td>
</tr>
<tr id="i6" class="altColor">
<td class="colFirst"><code>double</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../com/yahoo/sketches/hllmap/UniqueCountMap.html#getUpperBound-byte:A-">getUpperBound</a></span>(byte[]&nbsp;key)</code>
<div class="block">Returns the upper bound cardinality with respect to <a href="../../../../com/yahoo/sketches/hllmap/UniqueCountMap.html#getEstimate-byte:A-"><code>getEstimate(byte[])</code></a> associated
with the given key.</div>
</td>
</tr>
<tr id="i7" class="rowColor">
<td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../com/yahoo/sketches/hllmap/UniqueCountMap.html#toString--">toString</a></span>()</code>
<div class="block">Returns a string with a human-readable summary of the UniqueCountMap and all the internal maps</div>
</td>
</tr>
<tr id="i8" class="altColor">
<td class="colFirst"><code>double</code></td>
<td class="colLast"><code><span class="memberNameLink"><a href="../../../../com/yahoo/sketches/hllmap/UniqueCountMap.html#update-byte:A-byte:A-">update</a></span>(byte[]&nbsp;key,
byte[]&nbsp;identifier)</code>
<div class="block">Updates the map with a given key and identifier and returns the estimate of the number of
unique identifiers encountered so far for the given key.</div>
</td>
</tr>
</table>
<ul class="blockList">
<li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
<!-- -->
</a>
<h3>Methods inherited from class&nbsp;java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></h3>
<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
<div class="details">
<ul class="blockList">
<li class="blockList">
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<ul class="blockList">
<li class="blockList"><a name="constructor.detail">
<!-- -->
</a>
<h3>Constructor Detail</h3>
<a name="UniqueCountMap-int-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>UniqueCountMap</h4>
<pre>public&nbsp;UniqueCountMap(int&nbsp;keySizeBytes)</pre>
<div class="block">Constructs a UniqueCountMap with an initial capacity of one million entries.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>keySizeBytes</code> - must be at least 4 bytes to have sufficient entropy.</dd>
</dl>
</li>
</ul>
<a name="UniqueCountMap-int-int-">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>UniqueCountMap</h4>
<pre>public&nbsp;UniqueCountMap(int&nbsp;initialNumEntries,
int&nbsp;keySizeBytes)</pre>
<div class="block">Constructs a UniqueCountMap with a given initial number of entries.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>initialNumEntries</code> - The initial number of entries provides a tradeoff between
wasted space, if too high, and wasted time resizing the table, if too low.</dd>
<dd><code>keySizeBytes</code> - must be at least 4 bytes to have sufficient entropy</dd>
</dl>
</li>
</ul>
</li>
</ul>
<!-- ============ METHOD DETAIL ========== -->
<ul class="blockList">
<li class="blockList"><a name="method.detail">
<!-- -->
</a>
<h3>Method Detail</h3>
<a name="update-byte:A-byte:A-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>update</h4>
<pre>public&nbsp;double&nbsp;update(byte[]&nbsp;key,
byte[]&nbsp;identifier)</pre>
<div class="block">Updates the map with a given key and identifier and returns the estimate of the number of
unique identifiers encountered so far for the given key.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>key</code> - the given key</dd>
<dd><code>identifier</code> - the given identifier for unique counting associated with the key</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the estimate of the number of unique identifiers encountered so far for the given key.</dd>
</dl>
</li>
</ul>
<a name="getEstimate-byte:A-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getEstimate</h4>
<pre>public&nbsp;double&nbsp;getEstimate(byte[]&nbsp;key)</pre>
<div class="block">Retrieves the current estimate of unique count for a given key.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>key</code> - given key</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>estimate of unique count so far</dd>
</dl>
</li>
</ul>
<a name="getUpperBound-byte:A-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getUpperBound</h4>
<pre>public&nbsp;double&nbsp;getUpperBound(byte[]&nbsp;key)</pre>
<div class="block">Returns the upper bound cardinality with respect to <a href="../../../../com/yahoo/sketches/hllmap/UniqueCountMap.html#getEstimate-byte:A-"><code>getEstimate(byte[])</code></a> associated
with the given key.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>key</code> - the given key</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the upper bound cardinality with respect to <a href="../../../../com/yahoo/sketches/hllmap/UniqueCountMap.html#getEstimate-byte:A-"><code>getEstimate(byte[])</code></a> associated
with the given key.</dd>
</dl>
</li>
</ul>
<a name="getLowerBound-byte:A-">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getLowerBound</h4>
<pre>public&nbsp;double&nbsp;getLowerBound(byte[]&nbsp;key)</pre>
<div class="block">Returns the lower bound cardinality with respect to <a href="../../../../com/yahoo/sketches/hllmap/UniqueCountMap.html#getEstimate-byte:A-"><code>getEstimate(byte[])</code></a> associated
with the given key.</div>
<dl>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>key</code> - the given key</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the lower bound cardinality with respect to <a href="../../../../com/yahoo/sketches/hllmap/UniqueCountMap.html#getEstimate-byte:A-"><code>getEstimate(byte[])</code></a> associated
with the given key.</dd>
</dl>
</li>
</ul>
<a name="getActiveEntries--">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getActiveEntries</h4>
<pre>public&nbsp;int&nbsp;getActiveEntries()</pre>
<div class="block">Returns the number of active, unique keys across all internal maps</div>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the number of active, unique keys across all internal maps</dd>
</dl>
</li>
</ul>
<a name="getMemoryUsageBytes--">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getMemoryUsageBytes</h4>
<pre>public&nbsp;long&nbsp;getMemoryUsageBytes()</pre>
<div class="block">Returns total bytes used by all internal maps</div>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>total bytes used by all internal maps</dd>
</dl>
</li>
</ul>
<a name="getKeyMemoryUsageBytes--">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getKeyMemoryUsageBytes</h4>
<pre>public&nbsp;long&nbsp;getKeyMemoryUsageBytes()</pre>
<div class="block">Returns total bytes used for key storage</div>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>total bytes used for key storage</dd>
</dl>
</li>
</ul>
<a name="getAverageSketchMemoryPerKey--">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getAverageSketchMemoryPerKey</h4>
<pre>public&nbsp;double&nbsp;getAverageSketchMemoryPerKey()</pre>
<div class="block">Returns the average memory storage per key that is dedicated to sketching the unique counts.</div>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>the average memory storage per key that is dedicated to sketching the unique counts.</dd>
</dl>
</li>
</ul>
<a name="toString--">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>toString</h4>
<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;toString()</pre>
<div class="block">Returns a string with a human-readable summary of the UniqueCountMap and all the internal maps</div>
<dl>
<dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>human-readable summary</dd>
</dl>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<!-- ========= END OF CLASS DATA ========= -->
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
<a name="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="class-use/UniqueCountMap.html">Use</a></li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../index-all.html">Index</a></li>
<li><a href="../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li>Prev&nbsp;Class</li>
<li>Next&nbsp;Class</li>
</ul>
<ul class="navList">
<li><a href="../../../../index.html?com/yahoo/sketches/hllmap/UniqueCountMap.html" target="_top">Frames</a></li>
<li><a href="UniqueCountMap.html" target="_top">No&nbsp;Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a name="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
<p class="legalCopy"><small>Copyright &#169; 2015&#x2013;2019. All rights reserved.</small></p>
</body>
</html>