Add 'deps/cmph/' from commit 'a250982ade093f4eed0552bbdd22dd7b0432007f'
git-subtree-dir: deps/cmph git-subtree-mainline:5040f4007bgit-subtree-split:a250982ade
This commit is contained in:
140
deps/cmph/tex/bdz/bdz.bib
vendored
Executable file
140
deps/cmph/tex/bdz/bdz.bib
vendored
Executable file
@@ -0,0 +1,140 @@
|
||||
@inproceedings{bpz07,
|
||||
author = {F.C. Botelho and R. Pagh and N. Ziviani},
|
||||
title = {Simple and Space-Efficient Minimal Perfect Hash Functions},
|
||||
booktitle = {Proceedings of the 10th Workshop on Algorithms and Data Structures (WADs'07)},
|
||||
publisher = {Springer LNCS vol. 4619},
|
||||
pages = {139-150},
|
||||
Moth = August,
|
||||
location = {Halifax, Canada},
|
||||
year = 2007,
|
||||
key = {author}
|
||||
}
|
||||
|
||||
@PhdThesis{b08,
|
||||
author = {F. C. Botelho},
|
||||
title = {Near-Optimal Space Perfect Hashing Algorithms},
|
||||
school = {Federal University of Minas Gerais},
|
||||
year = {2008},
|
||||
OPTkey = {},
|
||||
OPTtype = {},
|
||||
OPTaddress = {},
|
||||
month = {September},
|
||||
note = {Supervised by Nivio Ziviani, \url{http://www.dcc.ufmg.br/pos/cursos/defesas/255D.PDF}},
|
||||
OPTannote = {},
|
||||
OPTurl = {http://www.dcc.ufmg.br/pos/cursos/defesas/255D.PDF},
|
||||
OPTdoi = {},
|
||||
OPTissn = {},
|
||||
OPTlocalfile = {},
|
||||
OPTabstract = {}
|
||||
}
|
||||
|
||||
@Article{mwhc96,
|
||||
author = {B.S. Majewski and N.C. Wormald and G. Havas and Z.J. Czech},
|
||||
title = {A family of perfect hashing methods},
|
||||
journal = {The Computer Journal},
|
||||
year = {1996},
|
||||
volume = {39},
|
||||
number = {6},
|
||||
pages = {547-554},
|
||||
key = {author}
|
||||
}
|
||||
|
||||
@inproceedings{ckrt04,
|
||||
author = {B. Chazelle and J. Kilian and R. Rubinfeld and A. Tal},
|
||||
title = {The Bloomier Filter: An Efficient Data Structure for Static Support Lookup Tables},
|
||||
booktitle = {Proceedings of the 15th annual ACM-SIAM symposium on Discrete algorithms (SODA'04)},
|
||||
year = {2004},
|
||||
isbn = {0-89871-558-X},
|
||||
pages = {30--39},
|
||||
location = {New Orleans, Louisiana},
|
||||
publisher = {Society for Industrial and Applied Mathematics},
|
||||
address = {Philadelphia, PA, USA},
|
||||
optpublisher = {Society for Industrial and Applied Mathematics}
|
||||
}
|
||||
|
||||
@Article{j97,
|
||||
author = {B. Jenkins},
|
||||
title = {Algorithm Alley: Hash Functions},
|
||||
journal = {Dr. Dobb's Journal of Software Tools},
|
||||
volume = {22},
|
||||
number = {9},
|
||||
month = {september},
|
||||
year = {1997},
|
||||
note = {Extended version available at \url{http://burtleburtle.net/bob/hash/doobs.html}}
|
||||
}
|
||||
|
||||
|
||||
@Article{e87,
|
||||
author = {J. Ebert},
|
||||
title = {A Versatile Data Structure for Edges Oriented Graph Algorithms},
|
||||
journal = {Communication of The ACM},
|
||||
year = {1987},
|
||||
OPTkey = {},
|
||||
OPTvolume = {},
|
||||
number = {30},
|
||||
pages = {513-519},
|
||||
OPTmonth = {},
|
||||
OPTnote = {},
|
||||
OPTannote = {}
|
||||
}
|
||||
|
||||
@article {dict-jour,
|
||||
AUTHOR = {R. Pagh},
|
||||
TITLE = {Low Redundancy in Static Dictionaries with Constant Query Time},
|
||||
OPTJOURNAL = sicomp,
|
||||
JOURNAL = fsicomp,
|
||||
VOLUME = {31},
|
||||
YEAR = {2001},
|
||||
NUMBER = {2},
|
||||
PAGES = {353--363},
|
||||
}
|
||||
|
||||
|
||||
@inproceedings{sg06,
|
||||
author = {K. Sadakane and R. Grossi},
|
||||
title = {Squeezing succinct data structures into entropy bounds},
|
||||
booktitle = {Proceedings of the 17th annual ACM-SIAM symposium on Discrete algorithms (SODA'06)},
|
||||
year = {2006},
|
||||
pages = {1230--1239}
|
||||
}
|
||||
|
||||
@inproceedings{gn06,
|
||||
author = {R. Gonzalez and
|
||||
G. Navarro},
|
||||
title = {Statistical Encoding of Succinct Data Structures},
|
||||
booktitle = {Proceedings of the 19th Annual Symposium on Combinatorial Pattern Matching (CPM'06)},
|
||||
year = {2006},
|
||||
pages = {294--305}
|
||||
}
|
||||
|
||||
@inproceedings{fn07,
|
||||
author = {K. Fredriksson and
|
||||
F. Nikitin},
|
||||
title = {Simple Compression Code Supporting Random Access and Fast
|
||||
String Matching},
|
||||
booktitle = {Proceedings of the 6th International Workshop on Efficient and Experimental Algorithms (WEA'07)},
|
||||
year = {2007},
|
||||
pages = {203--216}
|
||||
}
|
||||
|
||||
@inproceedings{os07,
|
||||
author = {D. Okanohara and K. Sadakane},
|
||||
title = {Practical Entropy-Compressed Rank/Select Dictionary},
|
||||
booktitle = {Proceedings of the Workshop on Algorithm Engineering and
|
||||
Experiments (ALENEX'07)},
|
||||
year = {2007},
|
||||
location = {New Orleans, Louisiana, USA}
|
||||
}
|
||||
|
||||
|
||||
@inproceedings{rrr02,
|
||||
author = {R. Raman and V. Raman and S. S. Rao},
|
||||
title = {Succinct indexable dictionaries with applications to encoding k-ary trees and multisets},
|
||||
booktitle = {Proceedings of the thirteenth annual ACM-SIAM symposium on Discrete algorithms (SODA'02)},
|
||||
year = {2002},
|
||||
isbn = {0-89871-513-X},
|
||||
pages = {233--242},
|
||||
location = {San Francisco, California},
|
||||
publisher = {Society for Industrial and Applied Mathematics},
|
||||
address = {Philadelphia, PA, USA},
|
||||
}
|
||||
70
deps/cmph/tex/bdz/bdz.tex
vendored
Executable file
70
deps/cmph/tex/bdz/bdz.tex
vendored
Executable file
@@ -0,0 +1,70 @@
|
||||
\documentclass[12pt]{article}
|
||||
\usepackage{graphicx}
|
||||
|
||||
\usepackage{latexsym}
|
||||
\usepackage{url}
|
||||
|
||||
\usepackage{a4wide}
|
||||
\usepackage{amsmath}
|
||||
\usepackage{amssymb}
|
||||
\usepackage{amsfonts}
|
||||
\usepackage{graphicx}
|
||||
\usepackage{listings}
|
||||
\usepackage{fancyhdr}
|
||||
\usepackage{graphics}
|
||||
\usepackage{multicol}
|
||||
\usepackage{epsfig}
|
||||
\usepackage{textcomp}
|
||||
\usepackage{url}
|
||||
|
||||
% \usepackage{subfigure}
|
||||
% \usepackage{subfig}
|
||||
% \usepackage{wrapfig}
|
||||
|
||||
|
||||
\bibliographystyle{plain}
|
||||
% \bibliographystyle{sbc}
|
||||
% \bibliographystyle{abnt-alf}
|
||||
% \bibliographystyle{abnt-num}
|
||||
|
||||
\begin{document}
|
||||
|
||||
\sloppy
|
||||
|
||||
% \renewcommand{\baselinestretch}{1.24}\normalsize % set the space between lines to 1.24
|
||||
|
||||
% set headings
|
||||
% \pagestyle{fancy}
|
||||
% \lhead[\fancyplain{}{\footnotesize\thepage}]
|
||||
% {\fancyplain{}{\footnotesize\rightmark}}
|
||||
% \rhead[\fancyplain{}{\footnotesize\leftmark}]
|
||||
% {\fancyplain{}{\footnotesize\thepage}}
|
||||
%
|
||||
% \cfoot{}
|
||||
|
||||
\lstset{
|
||||
language=C,
|
||||
basicstyle=\fontsize{8}{8}\selectfont,
|
||||
captionpos=t,
|
||||
aboveskip=0mm,
|
||||
belowskip=0mm,
|
||||
abovecaptionskip=0.5mm,
|
||||
belowcaptionskip=0.5mm,
|
||||
% numbers = left,
|
||||
mathescape=true,
|
||||
escapechar=@,
|
||||
extendedchars=true,
|
||||
showstringspaces=false,
|
||||
% columns=fixed,
|
||||
basewidth=0.515em,
|
||||
frame=single,
|
||||
framesep=1mm,
|
||||
xleftmargin=1mm,
|
||||
xrightmargin=1mm,
|
||||
framerule=0pt
|
||||
}
|
||||
|
||||
\include{introduction} % Introducao
|
||||
\bibliography{bdz}
|
||||
|
||||
\end{document}
|
||||
783
deps/cmph/tex/bdz/figs/overviewinternal3g.eps
vendored
Normal file
783
deps/cmph/tex/bdz/figs/overviewinternal3g.eps
vendored
Normal file
@@ -0,0 +1,783 @@
|
||||
%!PS-Adobe-2.0 EPSF-2.0
|
||||
%%Title: overviewinternal3g.fig
|
||||
%%Creator: fig2dev Version 3.2 Patchlevel 5
|
||||
%%CreationDate: Fri May 29 11:09:04 2009
|
||||
%%For: fbotelho@fbotelho-laptop (Fabiano C. Botelho,,,)
|
||||
%%BoundingBox: 0 0 342 128
|
||||
%Magnification: 1.0000
|
||||
%%EndComments
|
||||
%%BeginProlog
|
||||
/MyAppDict 100 dict dup begin def
|
||||
/$F2psDict 200 dict def
|
||||
$F2psDict begin
|
||||
$F2psDict /mtrx matrix put
|
||||
/col-1 {0 setgray} bind def
|
||||
/col0 {0.000 0.000 0.000 srgb} bind def
|
||||
/col1 {0.000 0.000 1.000 srgb} bind def
|
||||
/col2 {0.000 1.000 0.000 srgb} bind def
|
||||
/col3 {0.000 1.000 1.000 srgb} bind def
|
||||
/col4 {1.000 0.000 0.000 srgb} bind def
|
||||
/col5 {1.000 0.000 1.000 srgb} bind def
|
||||
/col6 {1.000 1.000 0.000 srgb} bind def
|
||||
/col7 {1.000 1.000 1.000 srgb} bind def
|
||||
/col8 {0.000 0.000 0.560 srgb} bind def
|
||||
/col9 {0.000 0.000 0.690 srgb} bind def
|
||||
/col10 {0.000 0.000 0.820 srgb} bind def
|
||||
/col11 {0.530 0.810 1.000 srgb} bind def
|
||||
/col12 {0.000 0.560 0.000 srgb} bind def
|
||||
/col13 {0.000 0.690 0.000 srgb} bind def
|
||||
/col14 {0.000 0.820 0.000 srgb} bind def
|
||||
/col15 {0.000 0.560 0.560 srgb} bind def
|
||||
/col16 {0.000 0.690 0.690 srgb} bind def
|
||||
/col17 {0.000 0.820 0.820 srgb} bind def
|
||||
/col18 {0.560 0.000 0.000 srgb} bind def
|
||||
/col19 {0.690 0.000 0.000 srgb} bind def
|
||||
/col20 {0.820 0.000 0.000 srgb} bind def
|
||||
/col21 {0.560 0.000 0.560 srgb} bind def
|
||||
/col22 {0.690 0.000 0.690 srgb} bind def
|
||||
/col23 {0.820 0.000 0.820 srgb} bind def
|
||||
/col24 {0.500 0.190 0.000 srgb} bind def
|
||||
/col25 {0.630 0.250 0.000 srgb} bind def
|
||||
/col26 {0.750 0.380 0.000 srgb} bind def
|
||||
/col27 {1.000 0.500 0.500 srgb} bind def
|
||||
/col28 {1.000 0.630 0.630 srgb} bind def
|
||||
/col29 {1.000 0.750 0.750 srgb} bind def
|
||||
/col30 {1.000 0.880 0.880 srgb} bind def
|
||||
/col31 {1.000 0.840 0.000 srgb} bind def
|
||||
|
||||
end
|
||||
|
||||
% This junk string is used by the show operators
|
||||
/PATsstr 1 string def
|
||||
/PATawidthshow { % cx cy cchar rx ry string
|
||||
% Loop over each character in the string
|
||||
{ % cx cy cchar rx ry char
|
||||
% Show the character
|
||||
dup % cx cy cchar rx ry char char
|
||||
PATsstr dup 0 4 -1 roll put % cx cy cchar rx ry char (char)
|
||||
false charpath % cx cy cchar rx ry char
|
||||
/clip load PATdraw
|
||||
% Move past the character (charpath modified the
|
||||
% current point)
|
||||
currentpoint % cx cy cchar rx ry char x y
|
||||
newpath
|
||||
moveto % cx cy cchar rx ry char
|
||||
% Reposition by cx,cy if the character in the string is cchar
|
||||
3 index eq { % cx cy cchar rx ry
|
||||
4 index 4 index rmoveto
|
||||
} if
|
||||
% Reposition all characters by rx ry
|
||||
2 copy rmoveto % cx cy cchar rx ry
|
||||
} forall
|
||||
pop pop pop pop pop % -
|
||||
currentpoint
|
||||
newpath
|
||||
moveto
|
||||
} bind def
|
||||
/PATcg {
|
||||
7 dict dup begin
|
||||
/lw currentlinewidth def
|
||||
/lc currentlinecap def
|
||||
/lj currentlinejoin def
|
||||
/ml currentmiterlimit def
|
||||
/ds [ currentdash ] def
|
||||
/cc [ currentrgbcolor ] def
|
||||
/cm matrix currentmatrix def
|
||||
end
|
||||
} bind def
|
||||
% PATdraw - calculates the boundaries of the object and
|
||||
% fills it with the current pattern
|
||||
/PATdraw { % proc
|
||||
save exch
|
||||
PATpcalc % proc nw nh px py
|
||||
5 -1 roll exec % nw nh px py
|
||||
newpath
|
||||
PATfill % -
|
||||
restore
|
||||
} bind def
|
||||
% PATfill - performs the tiling for the shape
|
||||
/PATfill { % nw nh px py PATfill -
|
||||
PATDict /CurrentPattern get dup begin
|
||||
setfont
|
||||
% Set the coordinate system to Pattern Space
|
||||
PatternGState PATsg
|
||||
% Set the color for uncolored pattezns
|
||||
PaintType 2 eq { PATDict /PColor get PATsc } if
|
||||
% Create the string for showing
|
||||
3 index string % nw nh px py str
|
||||
% Loop for each of the pattern sources
|
||||
0 1 Multi 1 sub { % nw nh px py str source
|
||||
% Move to the starting location
|
||||
3 index 3 index % nw nh px py str source px py
|
||||
moveto % nw nh px py str source
|
||||
% For multiple sources, set the appropriate color
|
||||
Multi 1 ne { dup PC exch get PATsc } if
|
||||
% Set the appropriate string for the source
|
||||
0 1 7 index 1 sub { 2 index exch 2 index put } for pop
|
||||
% Loop over the number of vertical cells
|
||||
3 index % nw nh px py str nh
|
||||
{ % nw nh px py str
|
||||
currentpoint % nw nh px py str cx cy
|
||||
2 index oldshow % nw nh px py str cx cy
|
||||
YStep add moveto % nw nh px py str
|
||||
} repeat % nw nh px py str
|
||||
} for
|
||||
5 { pop } repeat
|
||||
end
|
||||
} bind def
|
||||
|
||||
% PATkshow - kshow with the current pattezn
|
||||
/PATkshow { % proc string
|
||||
exch bind % string proc
|
||||
1 index 0 get % string proc char
|
||||
% Loop over all but the last character in the string
|
||||
0 1 4 index length 2 sub {
|
||||
% string proc char idx
|
||||
% Find the n+1th character in the string
|
||||
3 index exch 1 add get % string proc char char+1
|
||||
exch 2 copy % strinq proc char+1 char char+1 char
|
||||
% Now show the nth character
|
||||
PATsstr dup 0 4 -1 roll put % string proc chr+1 chr chr+1 (chr)
|
||||
false charpath % string proc char+1 char char+1
|
||||
/clip load PATdraw
|
||||
% Move past the character (charpath modified the current point)
|
||||
currentpoint newpath moveto
|
||||
% Execute the user proc (should consume char and char+1)
|
||||
mark 3 1 roll % string proc char+1 mark char char+1
|
||||
4 index exec % string proc char+1 mark...
|
||||
cleartomark % string proc char+1
|
||||
} for
|
||||
% Now display the last character
|
||||
PATsstr dup 0 4 -1 roll put % string proc (char+1)
|
||||
false charpath % string proc
|
||||
/clip load PATdraw
|
||||
neewath
|
||||
pop pop % -
|
||||
} bind def
|
||||
% PATmp - the makepattern equivalent
|
||||
/PATmp { % patdict patmtx PATmp patinstance
|
||||
exch dup length 7 add % We will add 6 new entries plus 1 FID
|
||||
dict copy % Create a new dictionary
|
||||
begin
|
||||
% Matrix to install when painting the pattern
|
||||
TilingType PATtcalc
|
||||
/PatternGState PATcg def
|
||||
PatternGState /cm 3 -1 roll put
|
||||
% Check for multi pattern sources (Level 1 fast color patterns)
|
||||
currentdict /Multi known not { /Multi 1 def } if
|
||||
% Font dictionary definitions
|
||||
/FontType 3 def
|
||||
% Create a dummy encoding vector
|
||||
/Encoding 256 array def
|
||||
3 string 0 1 255 {
|
||||
Encoding exch dup 3 index cvs cvn put } for pop
|
||||
/FontMatrix matrix def
|
||||
/FontBBox BBox def
|
||||
/BuildChar {
|
||||
mark 3 1 roll % mark dict char
|
||||
exch begin
|
||||
Multi 1 ne {PaintData exch get}{pop} ifelse % mark [paintdata]
|
||||
PaintType 2 eq Multi 1 ne or
|
||||
{ XStep 0 FontBBox aload pop setcachedevice }
|
||||
{ XStep 0 setcharwidth } ifelse
|
||||
currentdict % mark [paintdata] dict
|
||||
/PaintProc load % mark [paintdata] dict paintproc
|
||||
end
|
||||
gsave
|
||||
false PATredef exec true PATredef
|
||||
grestore
|
||||
cleartomark % -
|
||||
} bind def
|
||||
currentdict
|
||||
end % newdict
|
||||
/foo exch % /foo newlict
|
||||
definefont % newfont
|
||||
} bind def
|
||||
% PATpcalc - calculates the starting point and width/height
|
||||
% of the tile fill for the shape
|
||||
/PATpcalc { % - PATpcalc nw nh px py
|
||||
PATDict /CurrentPattern get begin
|
||||
gsave
|
||||
% Set up the coordinate system to Pattern Space
|
||||
% and lock down pattern
|
||||
PatternGState /cm get setmatrix
|
||||
BBox aload pop pop pop translate
|
||||
% Determine the bounding box of the shape
|
||||
pathbbox % llx lly urx ury
|
||||
grestore
|
||||
% Determine (nw, nh) the # of cells to paint width and height
|
||||
PatHeight div ceiling % llx lly urx qh
|
||||
4 1 roll % qh llx lly urx
|
||||
PatWidth div ceiling % qh llx lly qw
|
||||
4 1 roll % qw qh llx lly
|
||||
PatHeight div floor % qw qh llx ph
|
||||
4 1 roll % ph qw qh llx
|
||||
PatWidth div floor % ph qw qh pw
|
||||
4 1 roll % pw ph qw qh
|
||||
2 index sub cvi abs % pw ph qs qh-ph
|
||||
exch 3 index sub cvi abs exch % pw ph nw=qw-pw nh=qh-ph
|
||||
% Determine the starting point of the pattern fill
|
||||
%(px, py)
|
||||
4 2 roll % nw nh pw ph
|
||||
PatHeight mul % nw nh pw py
|
||||
exch % nw nh py pw
|
||||
PatWidth mul exch % nw nh px py
|
||||
end
|
||||
} bind def
|
||||
|
||||
% Save the original routines so that we can use them later on
|
||||
/oldfill /fill load def
|
||||
/oldeofill /eofill load def
|
||||
/oldstroke /stroke load def
|
||||
/oldshow /show load def
|
||||
/oldashow /ashow load def
|
||||
/oldwidthshow /widthshow load def
|
||||
/oldawidthshow /awidthshow load def
|
||||
/oldkshow /kshow load def
|
||||
|
||||
% These defs are necessary so that subsequent procs don't bind in
|
||||
% the originals
|
||||
/fill { oldfill } bind def
|
||||
/eofill { oldeofill } bind def
|
||||
/stroke { oldstroke } bind def
|
||||
/show { oldshow } bind def
|
||||
/ashow { oldashow } bind def
|
||||
/widthshow { oldwidthshow } bind def
|
||||
/awidthshow { oldawidthshow } bind def
|
||||
/kshow { oldkshow } bind def
|
||||
/PATredef {
|
||||
MyAppDict begin
|
||||
{
|
||||
/fill { /clip load PATdraw newpath } bind def
|
||||
/eofill { /eoclip load PATdraw newpath } bind def
|
||||
/stroke { PATstroke } bind def
|
||||
/show { 0 0 null 0 0 6 -1 roll PATawidthshow } bind def
|
||||
/ashow { 0 0 null 6 3 roll PATawidthshow }
|
||||
bind def
|
||||
/widthshow { 0 0 3 -1 roll PATawidthshow }
|
||||
bind def
|
||||
/awidthshow { PATawidthshow } bind def
|
||||
/kshow { PATkshow } bind def
|
||||
} {
|
||||
/fill { oldfill } bind def
|
||||
/eofill { oldeofill } bind def
|
||||
/stroke { oldstroke } bind def
|
||||
/show { oldshow } bind def
|
||||
/ashow { oldashow } bind def
|
||||
/widthshow { oldwidthshow } bind def
|
||||
/awidthshow { oldawidthshow } bind def
|
||||
/kshow { oldkshow } bind def
|
||||
} ifelse
|
||||
end
|
||||
} bind def
|
||||
false PATredef
|
||||
% Conditionally define setcmykcolor if not available
|
||||
/setcmykcolor where { pop } {
|
||||
/setcmykcolor {
|
||||
1 sub 4 1 roll
|
||||
3 {
|
||||
3 index add neg dup 0 lt { pop 0 } if 3 1 roll
|
||||
} repeat
|
||||
setrgbcolor - pop
|
||||
} bind def
|
||||
} ifelse
|
||||
/PATsc { % colorarray
|
||||
aload length % c1 ... cn length
|
||||
dup 1 eq { pop setgray } { 3 eq { setrgbcolor } { setcmykcolor
|
||||
} ifelse } ifelse
|
||||
} bind def
|
||||
/PATsg { % dict
|
||||
begin
|
||||
lw setlinewidth
|
||||
lc setlinecap
|
||||
lj setlinejoin
|
||||
ml setmiterlimit
|
||||
ds aload pop setdash
|
||||
cc aload pop setrgbcolor
|
||||
cm setmatrix
|
||||
end
|
||||
} bind def
|
||||
|
||||
/PATDict 3 dict def
|
||||
/PATsp {
|
||||
true PATredef
|
||||
PATDict begin
|
||||
/CurrentPattern exch def
|
||||
% If it's an uncolored pattern, save the color
|
||||
CurrentPattern /PaintType get 2 eq {
|
||||
/PColor exch def
|
||||
} if
|
||||
/CColor [ currentrgbcolor ] def
|
||||
end
|
||||
} bind def
|
||||
% PATstroke - stroke with the current pattern
|
||||
/PATstroke {
|
||||
countdictstack
|
||||
save
|
||||
mark
|
||||
{
|
||||
currentpoint strokepath moveto
|
||||
PATpcalc % proc nw nh px py
|
||||
clip newpath PATfill
|
||||
} stopped {
|
||||
(*** PATstroke Warning: Path is too complex, stroking
|
||||
with gray) =
|
||||
cleartomark
|
||||
restore
|
||||
countdictstack exch sub dup 0 gt
|
||||
{ { end } repeat } { pop } ifelse
|
||||
gsave 0.5 setgray oldstroke grestore
|
||||
} { pop restore pop } ifelse
|
||||
newpath
|
||||
} bind def
|
||||
/PATtcalc { % modmtx tilingtype PATtcalc tilematrix
|
||||
% Note: tiling types 2 and 3 are not supported
|
||||
gsave
|
||||
exch concat % tilingtype
|
||||
matrix currentmatrix exch % cmtx tilingtype
|
||||
% Tiling type 1 and 3: constant spacing
|
||||
2 ne {
|
||||
% Distort the pattern so that it occupies
|
||||
% an integral number of device pixels
|
||||
dup 4 get exch dup 5 get exch % tx ty cmtx
|
||||
XStep 0 dtransform
|
||||
round exch round exch % tx ty cmtx dx.x dx.y
|
||||
XStep div exch XStep div exch % tx ty cmtx a b
|
||||
0 YStep dtransform
|
||||
round exch round exch % tx ty cmtx a b dy.x dy.y
|
||||
YStep div exch YStep div exch % tx ty cmtx a b c d
|
||||
7 -3 roll astore % { a b c d tx ty }
|
||||
} if
|
||||
grestore
|
||||
} bind def
|
||||
/PATusp {
|
||||
false PATredef
|
||||
PATDict begin
|
||||
CColor PATsc
|
||||
end
|
||||
} bind def
|
||||
|
||||
% crosshatch30
|
||||
11 dict begin
|
||||
/PaintType 1 def
|
||||
/PatternType 1 def
|
||||
/TilingType 1 def
|
||||
/BBox [0 0 1 1] def
|
||||
/XStep 1 def
|
||||
/YStep 1 def
|
||||
/PatWidth 1 def
|
||||
/PatHeight 1 def
|
||||
/Multi 2 def
|
||||
/PaintData [
|
||||
{ clippath } bind
|
||||
{ 32 16 true [ 32 0 0 -16 0 16 ]
|
||||
{<033003300c0c0c0c30033003c000c000300330030c0c0c0c
|
||||
0330033000c000c0033003300c0c0c0c30033003c000c000
|
||||
300330030c0c0c0c0330033000c000c0>}
|
||||
imagemask } bind
|
||||
] def
|
||||
/PaintProc {
|
||||
pop
|
||||
exec fill
|
||||
} def
|
||||
currentdict
|
||||
end
|
||||
/P3 exch def
|
||||
|
||||
/cp {closepath} bind def
|
||||
/ef {eofill} bind def
|
||||
/gr {grestore} bind def
|
||||
/gs {gsave} bind def
|
||||
/sa {save} bind def
|
||||
/rs {restore} bind def
|
||||
/l {lineto} bind def
|
||||
/m {moveto} bind def
|
||||
/rm {rmoveto} bind def
|
||||
/n {newpath} bind def
|
||||
/s {stroke} bind def
|
||||
/sh {show} bind def
|
||||
/slc {setlinecap} bind def
|
||||
/slj {setlinejoin} bind def
|
||||
/slw {setlinewidth} bind def
|
||||
/srgb {setrgbcolor} bind def
|
||||
/rot {rotate} bind def
|
||||
/sc {scale} bind def
|
||||
/sd {setdash} bind def
|
||||
/ff {findfont} bind def
|
||||
/sf {setfont} bind def
|
||||
/scf {scalefont} bind def
|
||||
/sw {stringwidth} bind def
|
||||
/tr {translate} bind def
|
||||
/tnt {dup dup currentrgbcolor
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add
|
||||
4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
|
||||
bind def
|
||||
/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
|
||||
4 -2 roll mul srgb} bind def
|
||||
/DrawEllipse {
|
||||
/endangle exch def
|
||||
/startangle exch def
|
||||
/yrad exch def
|
||||
/xrad exch def
|
||||
/y exch def
|
||||
/x exch def
|
||||
/savematrix mtrx currentmatrix def
|
||||
x y tr xrad yrad sc 0 0 1 startangle endangle arc
|
||||
closepath
|
||||
savematrix setmatrix
|
||||
} def
|
||||
|
||||
/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
|
||||
/$F2psEnd {$F2psEnteredState restore end} def
|
||||
|
||||
/pageheader {
|
||||
save
|
||||
newpath 0 128 moveto 0 0 lineto 342 0 lineto 342 128 lineto closepath clip newpath
|
||||
-40.3 230.6 translate
|
||||
1 -1 scale
|
||||
$F2psBegin
|
||||
10 setmiterlimit
|
||||
0 slj 0 slc
|
||||
0.06299 0.06299 sc
|
||||
} bind def
|
||||
/pagefooter {
|
||||
$F2psEnd
|
||||
restore
|
||||
} bind def
|
||||
%%EndProlog
|
||||
pageheader
|
||||
%
|
||||
% Fig objects follow
|
||||
%
|
||||
%
|
||||
% here starts figure with depth 53
|
||||
% Polyline
|
||||
0 slj
|
||||
0 slc
|
||||
7.500 slw
|
||||
n 757 1980 m 652 1980 652 2640 105 arcto 4 {pop} repeat
|
||||
652 2745 1155 2745 105 arcto 4 {pop} repeat
|
||||
1260 2745 1260 2085 105 arcto 4 {pop} repeat
|
||||
1260 1980 757 1980 105 arcto 4 {pop} repeat
|
||||
cp gs col0 s gr
|
||||
% here ends figure;
|
||||
%
|
||||
% here starts figure with depth 51
|
||||
% Polyline
|
||||
0 slj
|
||||
0 slc
|
||||
7.500 slw
|
||||
gs clippath
|
||||
5215 2261 m 5264 2278 l 5278 2235 l 5229 2219 l 5229 2219 l 5251 2250 l 5215 2261 l cp
|
||||
eoclip
|
||||
n 4399 1969 m
|
||||
5257 2252 l gs col7 1.00 shd ef gr gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 5215 2261 m 5251 2250 l 5229 2219 l 5215 2261 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
gs clippath
|
||||
5223 2432 m 5272 2449 l 5286 2406 l 5237 2390 l 5237 2390 l 5259 2421 l 5223 2432 l cp
|
||||
eoclip
|
||||
n 4407 2140 m
|
||||
5265 2423 l gs col7 1.00 shd ef gr gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 5223 2432 m 5259 2421 l 5237 2390 l 5223 2432 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
gs clippath
|
||||
5216 2650 m 5267 2647 l 5264 2602 l 5213 2605 l 5213 2605 l 5245 2626 l 5216 2650 l cp
|
||||
eoclip
|
||||
n 4398 2687 m
|
||||
5251 2626 l gs col7 1.00 shd ef gr gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 5216 2650 m 5245 2626 l 5213 2605 l 5216 2650 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
n 5362 2523 m 5752 2523 l 5752 2696 l 5362 2696 l
|
||||
cp gs col7 1.00 shd ef gr gs col0 s gr
|
||||
% Polyline
|
||||
n 5362 2165 m 5752 2165 l 5752 2338 l 5362 2338 l
|
||||
cp gs col7 1.00 shd ef gr gs col0 s gr
|
||||
% Polyline
|
||||
0.000 slw
|
||||
n 720 2070 m 900 2070 l 900 2160 l 720 2160 l
|
||||
cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
|
||||
15.00 15.00 sc P3 [16 0 0 -8 48.00 138.00] PATmp PATsp ef gr PATusp
|
||||
% Polyline
|
||||
n 720 2565 m 900 2565 l 900 2655 l 720 2655 l
|
||||
cp gs col7 0.00 shd ef gr
|
||||
% Polyline
|
||||
7.500 slw
|
||||
n 4245 2415 m 4425 2415 l 4425 2595 l 4245 2595 l
|
||||
cp gs col7 1.00 shd ef gr gs col0 s gr
|
||||
% Polyline
|
||||
n 4245 2235 m 4425 2235 l 4425 2415 l 4245 2415 l
|
||||
cp gs col7 1.00 shd ef gr gs col0 s gr
|
||||
% Polyline
|
||||
n 5362 2343 m 5752 2343 l 5752 2516 l 5362 2516 l
|
||||
cp gs col7 1.00 shd ef gr gs col0 s gr
|
||||
% Polyline
|
||||
n 2835 3150 m 3330 3150 l 3330 3465 l 2835 3465 l
|
||||
cp gs col7 1.00 shd ef gr gs col0 s gr
|
||||
% Polyline
|
||||
0.000 slw
|
||||
n 2880 3330 m 3015 3330 l 3015 3420 l 2880 3420 l
|
||||
cp gs col7 0.00 shd ef gr
|
||||
% Polyline
|
||||
7.500 slw
|
||||
n 2340 3150 m 2835 3150 l 2835 3465 l 2340 3465 l
|
||||
cp gs col7 1.00 shd ef gr gs col0 s gr
|
||||
% Polyline
|
||||
n 1845 3150 m 2340 3150 l 2340 3465 l 1845 3465 l
|
||||
cp gs col7 1.00 shd ef gr gs col0 s gr
|
||||
% Polyline
|
||||
0.000 slw
|
||||
n 2385 3330 m 2520 3330 l 2520 3420 l 2385 3420 l
|
||||
cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
|
||||
15.00 15.00 sc P3 [16 0 0 -8 159.00 222.00] PATmp PATsp ef gr PATusp
|
||||
% Polyline
|
||||
n 2602 3017 m 2605 2425 l 2792 2423 l 2788 3044 l 2588 3030 l
|
||||
cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
|
||||
15.00 15.00 sc P3 [16 0 0 -8 172.53 161.53] PATmp PATsp ef gr PATusp
|
||||
% Polyline
|
||||
n 2609 2477 m 2612 1885 l 2799 1883 l 2795 2504 l 2595 2490 l
|
||||
cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def
|
||||
15.00 15.00 sc P3 [16 0 0 -8 173.00 125.53] PATmp PATsp ef gr PATusp
|
||||
% Polyline
|
||||
7.500 slw
|
||||
n 4245 1890 m 4425 1890 l 4425 2070 l 4245 2070 l
|
||||
cp gs col7 0.85 shd ef gr gs col0 s gr
|
||||
% Polyline
|
||||
n 4245 2063 m 4425 2063 l 4425 2243 l 4245 2243 l
|
||||
cp gs col7 0.85 shd ef gr gs col0 s gr
|
||||
% Polyline
|
||||
n 4245 2595 m 4425 2595 l 4425 2775 l 4245 2775 l
|
||||
cp gs col7 0.85 shd ef gr gs col0 s gr
|
||||
% Polyline
|
||||
n 4247 2748 m 4427 2748 l 4427 2928 l 4247 2928 l
|
||||
cp gs col7 1.00 shd ef gr gs col0 s gr
|
||||
% Polyline
|
||||
0.000 slw
|
||||
n 2657 3060 m 2111 2491 l 2244 2360 l 2786 2937 l
|
||||
cp gs col7 0.00 shd ef gr
|
||||
% Polyline
|
||||
n 2111 2402 m 2660 1838 l 2797 1966 l 2242 2527 l
|
||||
cp gs col7 0.55 shd ef gr
|
||||
% Polyline
|
||||
n 2115 3017 m 2118 2425 l 2305 2423 l 2301 3044 l 2101 3030 l
|
||||
cp gs col7 0.55 shd ef gr
|
||||
% Polyline
|
||||
n 1890 3330 m 2025 3330 l 2025 3420 l 1890 3420 l
|
||||
cp gs col7 0.55 shd ef gr
|
||||
% Polyline
|
||||
n 720 2340 m 900 2340 l 900 2430 l 720 2430 l
|
||||
cp gs col7 0.55 shd ef gr
|
||||
% Polyline
|
||||
n 2113 2439 m 2116 1847 l 2303 1845 l 2299 2466 l 2099 2452 l
|
||||
cp gs col7 0.00 shd ef gr
|
||||
/Times-Italic ff 142.88 scf sf
|
||||
2835 2474 m
|
||||
gs 1 -1 sc (h \(x\)) col0 sh gr
|
||||
/Times-Roman ff 111.13 scf sf
|
||||
2916 2520 m
|
||||
gs 1 -1 sc (1) col0 sh gr
|
||||
/Times-Italic ff 142.88 scf sf
|
||||
2835 3030 m
|
||||
gs 1 -1 sc (h \(x\)) col0 sh gr
|
||||
/Times-Roman ff 111.13 scf sf
|
||||
2916 3076 m
|
||||
gs 1 -1 sc (2) col0 sh gr
|
||||
/Times-Italic ff 142.88 scf sf
|
||||
2835 1950 m
|
||||
gs 1 -1 sc (h \(x\)) col0 sh gr
|
||||
/Times-Roman ff 111.13 scf sf
|
||||
2916 1996 m
|
||||
gs 1 -1 sc (0) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
4095 2025 m
|
||||
gs 1 -1 sc (0) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
4095 2205 m
|
||||
gs 1 -1 sc (1) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
4095 2385 m
|
||||
gs 1 -1 sc (2) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
4095 2565 m
|
||||
gs 1 -1 sc (3) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
4095 2745 m
|
||||
gs 1 -1 sc (4) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
4095 2925 m
|
||||
gs 1 -1 sc (5) col0 sh gr
|
||||
/Times-Italic ff 142.88 scf sf
|
||||
4320 1800 m
|
||||
gs 1 -1 sc (g) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
5220 2115 m
|
||||
gs 1 -1 sc (Hash Table ) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
5265 2475 m
|
||||
gs 1 -1 sc (1) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
5265 2655 m
|
||||
gs 1 -1 sc (2) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
5265 2295 m
|
||||
gs 1 -1 sc (0) col0 sh gr
|
||||
/Times-Roman ff 158.75 scf sf
|
||||
1575 1755 m
|
||||
gs 1 -1 sc (\(a\)) col0 sh gr
|
||||
/Times-Roman ff 158.75 scf sf
|
||||
3465 1755 m
|
||||
gs 1 -1 sc (\(b\)) col0 sh gr
|
||||
/Times-Roman ff 158.75 scf sf
|
||||
4680 1755 m
|
||||
gs 1 -1 sc (\(c\)) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
3015 3645 m
|
||||
gs 1 -1 sc (2) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
2565 3645 m
|
||||
gs 1 -1 sc (1) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
2070 3645 m
|
||||
gs 1 -1 sc (0) col0 sh gr
|
||||
/ZapfChancery-MediumItalic ff 174.63 scf sf
|
||||
3420 3375 m
|
||||
gs 1 -1 sc (L) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
2865 3277 m
|
||||
gs 1 -1 sc ({0,2,5}) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
2370 3277 m
|
||||
gs 1 -1 sc ({1,3,5}) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
1895 3277 m
|
||||
gs 1 -1 sc ({1,2,4}) col0 sh gr
|
||||
% here ends figure;
|
||||
%
|
||||
% here starts figure with depth 45
|
||||
% Polyline
|
||||
0 slj
|
||||
0 slc
|
||||
7.500 slw
|
||||
gs clippath
|
||||
1944 2497 m 1995 2497 l 1995 2452 l 1944 2452 l 1944 2452 l 1974 2475 l 1944 2497 l cp
|
||||
eoclip
|
||||
n 1357 2475 m
|
||||
1980 2475 l gs col7 1.00 shd ef gr gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 1944 2497 m 1974 2475 l 1944 2452 l 1944 2497 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Polyline
|
||||
gs clippath
|
||||
3879 2497 m 3930 2497 l 3930 2452 l 3879 2452 l 3879 2452 l 3909 2475 l 3879 2497 l cp
|
||||
eoclip
|
||||
n 3292 2475 m
|
||||
3915 2475 l gs col7 1.00 shd ef gr gs col0 s gr gr
|
||||
|
||||
% arrowhead
|
||||
n 3879 2497 m 3909 2475 l 3879 2452 l 3879 2497 l cp gs 0.00 setgray ef gr col0 s
|
||||
% Ellipse
|
||||
n 2704 2448 101 101 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr
|
||||
|
||||
% Ellipse
|
||||
n 2209 2448 101 101 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr
|
||||
|
||||
% Ellipse
|
||||
n 2704 2988 101 101 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr
|
||||
|
||||
% Ellipse
|
||||
n 2209 1908 101 101 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr
|
||||
|
||||
% Ellipse
|
||||
n 2704 1908 101 101 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr
|
||||
|
||||
% Ellipse
|
||||
n 2209 2988 101 101 0 360 DrawEllipse gs col7 1.00 shd ef gr gs col0 s gr
|
||||
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
5423 2663 m
|
||||
gs 1 -1 sc (band) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
5460 2304 m
|
||||
gs 1 -1 sc (the) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
1418 2430 m
|
||||
gs 1 -1 sc (Mapping) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
3285 2430 m
|
||||
gs 1 -1 sc (Assigning) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
2674 2485 m
|
||||
gs 1 -1 sc (3) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
2179 2485 m
|
||||
gs 1 -1 sc (2) col0 sh gr
|
||||
/Times-Italic ff 142.88 scf sf
|
||||
945 1935 m
|
||||
gs 1 -1 sc (S) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
967 2160 m
|
||||
gs 1 -1 sc (who) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
960 2430 m
|
||||
gs 1 -1 sc (band) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
1005 2655 m
|
||||
gs 1 -1 sc (the) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
4305 2378 m
|
||||
gs 1 -1 sc (3) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
5422 2482 m
|
||||
gs 1 -1 sc (who) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
4545 2430 m
|
||||
gs 1 -1 sc (Ranking) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
3060 3420 m
|
||||
gs 1 -1 sc (the) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
2539 3420 m
|
||||
gs 1 -1 sc (who) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
2045 3420 m
|
||||
gs 1 -1 sc (band) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
2179 1945 m
|
||||
gs 1 -1 sc (0) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
2674 1945 m
|
||||
gs 1 -1 sc (1) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
2179 3025 m
|
||||
gs 1 -1 sc (4) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
2674 3025 m
|
||||
gs 1 -1 sc (5) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
4300 2875 m
|
||||
gs 1 -1 sc (3) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
4305 2548 m
|
||||
gs 1 -1 sc (3) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
4305 2715 m
|
||||
gs 1 -1 sc (2) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
4299 2190 m
|
||||
gs 1 -1 sc (0) col0 sh gr
|
||||
/Times-Roman ff 142.88 scf sf
|
||||
4299 2033 m
|
||||
gs 1 -1 sc (0) col0 sh gr
|
||||
% here ends figure;
|
||||
pagefooter
|
||||
showpage
|
||||
%%Trailer
|
||||
end
|
||||
%EOF
|
||||
156
deps/cmph/tex/bdz/figs/overviewinternal3g.fig
vendored
Normal file
156
deps/cmph/tex/bdz/figs/overviewinternal3g.fig
vendored
Normal file
@@ -0,0 +1,156 @@
|
||||
#FIG 3.2 Produced by xfig version 3.2.5
|
||||
Landscape
|
||||
Center
|
||||
Metric
|
||||
A4
|
||||
100.00
|
||||
Single
|
||||
-2
|
||||
1200 2
|
||||
6 5355 2520 5760 2700
|
||||
6 5400 2520 5715 2700
|
||||
4 0 0 45 -1 0 9 0.0000 4 105 285 5423 2663 band\001
|
||||
-6
|
||||
2 2 0 1 0 7 50 -1 20 0.000 0 0 7 0 0 5
|
||||
5362 2523 5752 2523 5752 2696 5362 2696 5362 2523
|
||||
-6
|
||||
6 5355 2162 5760 2342
|
||||
2 2 0 1 0 7 50 -1 20 0.000 0 0 7 0 0 5
|
||||
5362 2165 5752 2165 5752 2338 5362 2338 5362 2165
|
||||
4 0 0 45 -1 0 9 0.0000 4 105 195 5460 2304 the\001
|
||||
-6
|
||||
6 1350 2340 1980 2520
|
||||
6 1350 2340 1980 2520
|
||||
2 1 0 1 0 7 45 -1 20 0.000 0 0 7 1 0 2
|
||||
1 1 1.00 45.00 30.00
|
||||
1357 2475 1980 2475
|
||||
4 0 0 45 -1 0 9 0.0000 4 135 555 1418 2430 Mapping\001
|
||||
-6
|
||||
-6
|
||||
6 3285 2340 3915 2520
|
||||
6 3285 2340 3915 2520
|
||||
2 1 0 1 0 7 45 -1 20 0.000 0 0 7 1 0 2
|
||||
1 1 1.00 45.00 30.00
|
||||
3292 2475 3915 2475
|
||||
4 0 0 45 -1 0 9 0.0000 4 135 630 3285 2430 Assigning\001
|
||||
-6
|
||||
-6
|
||||
6 2603 2347 2805 2549
|
||||
1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2704 2448 101 101 2704 2448 2749 2538
|
||||
4 0 0 45 -1 0 9 0.0000 4 105 75 2674 2485 3\001
|
||||
-6
|
||||
6 2108 2347 2310 2549
|
||||
1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2209 2448 101 101 2209 2448 2254 2538
|
||||
4 0 0 45 -1 0 9 0.0000 4 105 75 2179 2485 2\001
|
||||
-6
|
||||
6 2835 2340 3150 2520
|
||||
4 0 0 50 -1 1 9 0.0000 4 135 300 2835 2474 h (x)\001
|
||||
4 0 0 50 -1 0 7 0.0000 4 75 60 2916 2520 1\001
|
||||
-6
|
||||
6 2835 2925 3150 3105
|
||||
4 0 0 50 -1 1 9 0.0000 4 135 300 2835 3030 h (x)\001
|
||||
4 0 0 50 -1 0 7 0.0000 4 75 60 2916 3076 2\001
|
||||
-6
|
||||
6 2835 1845 3135 1996
|
||||
4 0 0 50 -1 1 9 0.0000 4 135 300 2835 1950 h (x)\001
|
||||
4 0 0 50 -1 0 7 0.0000 4 75 60 2916 1996 0\001
|
||||
-6
|
||||
1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2704 2988 101 101 2704 2988 2749 3078
|
||||
1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2209 1908 101 101 2209 1908 2254 1998
|
||||
1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2704 1908 101 101 2704 1908 2749 1998
|
||||
1 3 0 1 0 7 45 -1 20 0.000 1 0.0000 2209 2988 101 101 2209 2988 2254 3078
|
||||
2 4 0 1 0 7 53 -1 -1 0.000 0 0 7 0 0 5
|
||||
1260 2745 1260 1980 652 1980 652 2745 1260 2745
|
||||
2 2 0 0 0 7 50 -1 43 0.000 0 0 -1 0 0 5
|
||||
720 2070 900 2070 900 2160 720 2160 720 2070
|
||||
2 2 0 0 0 7 50 -1 0 0.000 0 0 7 0 0 5
|
||||
720 2565 900 2565 900 2655 720 2655 720 2565
|
||||
2 2 0 1 0 7 50 -1 20 0.000 0 0 7 0 0 5
|
||||
4245 2415 4425 2415 4425 2595 4245 2595 4245 2415
|
||||
2 2 0 1 0 7 50 -1 20 0.000 0 0 7 0 0 5
|
||||
4245 2235 4425 2235 4425 2415 4245 2415 4245 2235
|
||||
2 1 0 1 0 7 51 -1 20 0.000 0 0 7 1 0 2
|
||||
1 1 1.00 45.00 30.00
|
||||
4399 1969 5257 2252
|
||||
2 2 0 1 0 7 50 -1 20 0.000 0 0 7 0 0 5
|
||||
5362 2343 5752 2343 5752 2516 5362 2516 5362 2343
|
||||
2 1 0 1 0 7 51 -1 20 0.000 0 0 7 1 0 2
|
||||
1 1 1.00 45.00 30.00
|
||||
4407 2140 5265 2423
|
||||
2 1 0 1 0 7 51 -1 20 0.000 0 0 7 1 0 2
|
||||
1 1 1.00 45.00 30.00
|
||||
4398 2687 5251 2626
|
||||
2 2 0 1 0 7 50 -1 20 0.000 0 0 7 0 0 5
|
||||
2835 3150 3330 3150 3330 3465 2835 3465 2835 3150
|
||||
2 2 0 0 0 7 50 -1 0 0.000 0 0 7 0 0 5
|
||||
2880 3330 3015 3330 3015 3420 2880 3420 2880 3330
|
||||
2 2 0 1 0 7 50 -1 20 0.000 0 0 7 0 0 5
|
||||
2340 3150 2835 3150 2835 3465 2340 3465 2340 3150
|
||||
2 2 0 1 0 7 50 -1 20 0.000 0 0 7 0 0 5
|
||||
1845 3150 2340 3150 2340 3465 1845 3465 1845 3150
|
||||
2 2 0 0 0 7 50 -1 43 0.000 0 0 7 0 0 5
|
||||
2385 3330 2520 3330 2520 3420 2385 3420 2385 3330
|
||||
2 3 0 0 0 7 50 -1 43 0.000 0 0 7 0 0 6
|
||||
2602 3017 2605 2425 2792 2423 2788 3044 2588 3030 2602 3017
|
||||
2 3 0 0 0 7 50 -1 43 0.000 0 0 7 0 0 6
|
||||
2609 2477 2612 1885 2799 1883 2795 2504 2595 2490 2609 2477
|
||||
2 2 0 1 0 7 50 -1 17 0.000 0 0 7 0 0 5
|
||||
4245 1890 4425 1890 4425 2070 4245 2070 4245 1890
|
||||
2 2 0 1 0 7 50 -1 17 0.000 0 0 7 0 0 5
|
||||
4245 2063 4425 2063 4425 2243 4245 2243 4245 2063
|
||||
2 2 0 1 0 7 50 -1 17 0.000 0 0 7 0 0 5
|
||||
4245 2595 4425 2595 4425 2775 4245 2775 4245 2595
|
||||
2 2 0 1 0 7 50 -1 20 0.000 0 0 7 0 0 5
|
||||
4247 2748 4427 2748 4427 2928 4247 2928 4247 2748
|
||||
2 3 0 0 0 7 50 -1 0 0.000 0 0 7 0 0 5
|
||||
2657 3060 2111 2491 2244 2360 2786 2937 2657 3060
|
||||
2 3 0 0 0 7 50 -1 11 0.000 0 0 7 0 0 5
|
||||
2111 2402 2660 1838 2797 1966 2242 2527 2111 2402
|
||||
2 3 0 0 0 7 50 -1 11 0.000 0 0 7 0 0 6
|
||||
2115 3017 2118 2425 2305 2423 2301 3044 2101 3030 2115 3017
|
||||
2 2 0 0 0 7 50 -1 11 0.000 0 0 7 0 0 5
|
||||
1890 3330 2025 3330 2025 3420 1890 3420 1890 3330
|
||||
2 2 0 0 0 7 50 -1 11 0.000 0 0 7 0 0 5
|
||||
720 2340 900 2340 900 2430 720 2430 720 2340
|
||||
2 3 0 0 0 7 50 -1 0 0.000 0 0 7 0 0 6
|
||||
2113 2439 2116 1847 2303 1845 2299 2466 2099 2452 2113 2439
|
||||
4 0 0 45 -1 1 9 0.0000 4 105 75 945 1935 S\001
|
||||
4 0 0 45 -1 0 9 0.0000 4 105 270 967 2160 who\001
|
||||
4 0 0 45 -1 0 9 0.0000 4 105 285 960 2430 band\001
|
||||
4 0 0 45 -1 0 9 0.0000 4 105 195 1005 2655 the\001
|
||||
4 0 0 50 -1 0 9 0.0000 4 105 75 4095 2025 0\001
|
||||
4 0 0 50 -1 0 9 0.0000 4 105 75 4095 2205 1\001
|
||||
4 0 0 50 -1 0 9 0.0000 4 105 75 4095 2385 2\001
|
||||
4 0 0 50 -1 0 9 0.0000 4 105 75 4095 2565 3\001
|
||||
4 0 0 50 -1 0 9 0.0000 4 105 75 4095 2745 4\001
|
||||
4 0 0 50 -1 0 9 0.0000 4 105 75 4095 2925 5\001
|
||||
4 0 0 50 -1 1 9 0.0000 4 120 60 4320 1800 g\001
|
||||
4 0 0 45 -1 0 9 0.0000 4 105 75 4305 2378 3\001
|
||||
4 0 0 50 -1 0 9 0.0000 4 105 810 5220 2115 Hash Table \001
|
||||
4 0 0 45 -1 0 9 0.0000 4 105 270 5422 2482 who\001
|
||||
4 0 0 50 -1 0 9 0.0000 4 105 75 5265 2475 1\001
|
||||
4 0 0 50 -1 0 9 0.0000 4 105 75 5265 2655 2\001
|
||||
4 0 0 50 -1 0 9 0.0000 4 105 75 5265 2295 0\001
|
||||
4 0 0 50 -1 0 10 0.0000 4 135 180 1575 1755 (a)\001
|
||||
4 0 0 50 -1 0 10 0.0000 4 135 195 3465 1755 (b)\001
|
||||
4 0 0 50 -1 0 10 0.0000 4 135 180 4680 1755 (c)\001
|
||||
4 0 0 45 -1 0 9 0.0000 4 135 510 4545 2430 Ranking\001
|
||||
4 0 0 50 -1 0 9 0.0000 4 105 75 3015 3645 2\001
|
||||
4 0 0 50 -1 0 9 0.0000 4 105 75 2565 3645 1\001
|
||||
4 0 0 50 -1 0 9 0.0000 4 105 75 2070 3645 0\001
|
||||
4 0 0 50 -1 33 11 0.0000 4 135 90 3420 3375 L\001
|
||||
4 0 0 50 -1 0 9 0.0000 4 135 435 2865 3277 {0,2,5}\001
|
||||
4 0 0 45 -1 0 9 0.0000 4 105 195 3060 3420 the\001
|
||||
4 0 0 50 -1 0 9 0.0000 4 135 435 2370 3277 {1,3,5}\001
|
||||
4 0 0 45 -1 0 9 0.0000 4 105 270 2539 3420 who\001
|
||||
4 0 0 45 -1 0 9 0.0000 4 105 285 2045 3420 band\001
|
||||
4 0 0 50 -1 0 9 0.0000 4 135 435 1895 3277 {1,2,4}\001
|
||||
4 0 0 45 -1 0 9 0.0000 4 105 75 2179 1945 0\001
|
||||
4 0 0 45 -1 0 9 0.0000 4 105 75 2674 1945 1\001
|
||||
4 0 0 45 -1 0 9 0.0000 4 105 75 2179 3025 4\001
|
||||
4 0 0 45 -1 0 9 0.0000 4 105 75 2674 3025 5\001
|
||||
4 0 0 45 -1 0 9 0.0000 4 105 75 4300 2875 3\001
|
||||
4 0 0 45 -1 0 9 0.0000 4 105 75 4305 2548 3\001
|
||||
4 0 0 45 -1 0 9 0.0000 4 105 75 4305 2715 2\001
|
||||
4 0 0 45 -1 0 9 0.0000 4 105 75 4299 2190 0\001
|
||||
4 0 0 45 -1 0 9 0.0000 4 105 75 4299 2033 0\001
|
||||
371
deps/cmph/tex/bdz/introduction.tex
vendored
Executable file
371
deps/cmph/tex/bdz/introduction.tex
vendored
Executable file
@@ -0,0 +1,371 @@
|
||||
\section{Introduction} \label{sec:introduction}
|
||||
|
||||
The BDZ algorithm was designed by Fabiano C. Botelho, Djamal Belazzougui, Rasmus Pagh and Nivio Ziviani.
|
||||
It is a simple, efficient, near-optimal space and practical
|
||||
algorithm to generate a family $\cal F$ of PHFs and MPHFs.
|
||||
It is also referred to as BPZ algorithm because the work presented
|
||||
by Botelho, Pagh and Ziviani in \cite{bpz07}.
|
||||
In the Botelho's PhD. dissertation \cite{b08} it is also referred to as RAM algorithm
|
||||
because it is more suitable for key sets that can be handled in internal memory.
|
||||
|
||||
The BDZ algorithm uses $r$-uniform random hypergraphs
|
||||
given by function values of $r$
|
||||
uniform random hash functions on the input key set $S$ for generating PHFs and MPHFs that
|
||||
require $O(n)$ bits to be stored.
|
||||
A hypergraph is the generalization of a standard undirected
|
||||
graph where each edge connects $r\geq 2$ vertices.
|
||||
This idea is not new, see e.g. \cite{mwhc96},
|
||||
but we have proceed differently to achieve
|
||||
a space usage of $O(n)$ bits rather than $O(n\log n)$ bits.
|
||||
Evaluation time for all schemes considered is constant.
|
||||
For $r=3$ we obtain a space usage of approximately $2.6n$ bits for
|
||||
an MPHF. More compact, and even simpler, representations can be
|
||||
achieved for larger $m$. For example, for $m=1.23n$ we can get a
|
||||
space usage of $1.95n$ bits.
|
||||
|
||||
Our best MPHF space upper bound is within a
|
||||
factor of 2 from the information theoretical lower bound of approximately
|
||||
$1.4427n$ bits. We have shown that the BDZ algorithm is far more
|
||||
practical than previous methods with proven space complexity, both
|
||||
because of its simplicity, and because the constant factor of the
|
||||
space complexity is more than 6 times lower than its closest
|
||||
competitor, for plausible problem sizes. We verify the practicality
|
||||
experimentally, using slightly more space than in the mentioned
|
||||
theoretical bounds.
|
||||
|
||||
\section{The Algorithm}
|
||||
|
||||
The BDZ algorithm is a three-step algorithm that generates PHFs and MPHFs based on
|
||||
random $r$-partite hypergraphs.
|
||||
This is an approach that provides a much tighter analysis and is
|
||||
much more simple than the one presented in
|
||||
\cite{ckrt04}, where it was implicit how to construct
|
||||
similar PHFs.
|
||||
The fastest and most compact functions
|
||||
are generated when $r=3$.
|
||||
In this case a PHF can be stored in
|
||||
approximately $1.95$ bits per key and
|
||||
an MPHF in approximately
|
||||
$2.62$ bits per key.
|
||||
|
||||
Figure~\ref{fig:overview} gives an overview of the algorithm for $r=3$,
|
||||
taking as input a key set $S \subseteq U$ containing three English words, i.e., $S=\{\mathrm{who},\mathrm{band},\mathrm{the}\}$.
|
||||
% which are nicely hashed to the name of a rock band ``the who band''.
|
||||
The edge-oriented data structure proposed in~\cite{e87} is used
|
||||
to represent hypergraphs, where each edge is explicitly represented
|
||||
as an array of $r$ vertices and, for each vertex $v$,
|
||||
there is a list of edges that are incident on $v$.
|
||||
|
||||
The {\em Mapping Step} in Figure~\ref{fig:overview}(a) carries out two
|
||||
important tasks:
|
||||
\begin{enumerate}
|
||||
\item
|
||||
It assumes that it is possible to find three uniform
|
||||
hash functions, $h_0$, $h_1$ and $h_2$, with ranges $\{0,1\}$, $\{2,3\}$ and $\{4,5\}$, respectively.
|
||||
These functions build an one-to-one mapping of the key set $S$ to the edge set $E$
|
||||
of a random acyclic
|
||||
$3$-partite hypergraph $G=(V,E)$, where $|V|=m=6$ and $|E|=n=3$.
|
||||
In \cite{b08,bpz07} it is shown that
|
||||
it is possible to obtain such a hypergraph with probability tending to $1$ as $n$
|
||||
tends to infinity
|
||||
whenever $m=cn$ and $c \ge 1.23$. The value of $c$ that minimizes the hypergraph size
|
||||
(and thereby the amount of bits to represent the resulting functions) is $c \approx 1.23$.
|
||||
To illustrate the mapping,
|
||||
key ``who'' is mapped to edge $\{h_0(\text{``who''}),h_1(\text{``who''}),h_2(\text{``who''})\}=\{1,3,5\}$,
|
||||
key ``band'' is mapped to edge $\{h_0(\text{``band''}),h_1(\text{``band''}),h_2(\text{``band''})\}=\{1,2,4\}$, and
|
||||
key ``the'' is mapped to edge $\{h_0(\text{``the''}),h_1(\text{``the''}),h_2(\text{``the''})\}=\{0,2,5\}$.
|
||||
\item
|
||||
It tests whether the resulting random $3$-partite hypergraph contains cycles
|
||||
by iteratively deleting edges connecting vertices of degree 1.
|
||||
The deleted edges are stored in the order of deletion in a list $\cal L$
|
||||
to be used in the assigning step.
|
||||
The first deleted edge in Figure~\ref{fig:overview}(a)
|
||||
was $\{1,2,4\}$, the second one was $\{1,3,5\}$ and
|
||||
the third one was $\{0,2,5\}$.
|
||||
% the last one was $\{0,2,5\}$.
|
||||
If it ends with an empty graph, then the test succeeds,
|
||||
otherwise it fails.
|
||||
\end{enumerate}
|
||||
|
||||
|
||||
\begin{figure}
|
||||
\begin{center}
|
||||
\scalebox{0.9}{\epsfig{file=figs/overviewinternal3g.eps}}
|
||||
\end{center}
|
||||
\caption{(a) The mapping step generates a random acyclic $3$-partite hypergraph with $m=6$ vertices and $n=3$ edges
|
||||
and a list $\cal L$ of edges obtained when we test whether the hypergraph is acyclic.
|
||||
(b) The assigning step builds an array $g:[0,5] \to [0,3]$ to uniquely
|
||||
assign an edge to a vertex. (c) The ranking step builds the data structure used to
|
||||
compute function $\mathit{rank}: [0,5] \to [0,2]$ in $O(1)$ time.~~~~}
|
||||
\label{fig:overview}
|
||||
\end{figure}
|
||||
|
||||
|
||||
|
||||
We now show how to use the Jenkins hash functions \cite{j97}
|
||||
to implement the three hash functions $h_i: S \to V_i$, $0\le i \le 2$, which are used to build a random $3$-partite hypergraph
|
||||
$G=(V,E)$,
|
||||
where $V= V_0 \cup V_1 \cup V_2$ and $|V_i| = \eta = \lceil \frac{m}{3} \rceil$.
|
||||
Let $h':S \to \{0,1\}^\gamma$ be a Jenkins hash function
|
||||
for $\gamma = 3 \times w$, where
|
||||
$w = 32 \text{ or } 64$ for
|
||||
32-bit and 64-bit architectures, respectively.
|
||||
Let $H'$ be an array of 3 $w$-bit values.
|
||||
The Jenkins hash function
|
||||
allow us to compute in parallel the three entries in $H'$
|
||||
and thereby the three hash functions $h_i$, as follows:
|
||||
% Thus we can compute the three hash functions $h_i$
|
||||
% as follows:
|
||||
\begin{eqnarray}
|
||||
H' &=& h'(x) \nonumber \\
|
||||
h_0(x) &=& H'[0] \bmod \eta \nonumber \\
|
||||
h_1(x) &=& H'[1] \bmod \eta + \eta \nonumber \\
|
||||
h_2(x) &=& H'[2] \bmod \eta + 2\eta
|
||||
\end{eqnarray}
|
||||
|
||||
The {\em Assigning Step} in Figure~\ref{fig:overview}(b) outputs
|
||||
a PHF that maps the key set $S$ into the range $[0,m-1]$ and is represented by
|
||||
an array $g$ storing values from the range $[0,3]$.
|
||||
The array $g$ allows to select one out of the $3$
|
||||
vertices of a given edge, which is associated with a
|
||||
key $k$.
|
||||
A vertex for a key $k$ is given
|
||||
by either $h_0(k)$, $h_1(k)$ or $h_2(k)$.
|
||||
The function $h_i(k)$
|
||||
to be used for $k$ is chosen by calculating $i = (g[h_0(k)] + g[h_1(k)] + g[h_2(k)]) \bmod 3$.
|
||||
For instance,
|
||||
the values 1 and 4 represent the keys ``who'' and ``band''
|
||||
because $i = (g[1] + g[3] + g[5]) \bmod 3 = 0$ and $h_0(\text{``who''}) = 1$,
|
||||
and $i = (g[1] + g[2] + g[4]) \bmod 3 = 2$ and $h_2(\text{``band''}) = 4$, respectively.
|
||||
% Likewise, the value 4 represents the key
|
||||
% because $(g[1] + g[2] + g[4]) \bmod 3 = 2$ and $h_2(\text{``band''}) = 4$, and so on.
|
||||
The assigning step firstly initializes $g[i]=3$
|
||||
to mark every vertex as unassigned
|
||||
% (i.e., each vertex is unassigned)
|
||||
and
|
||||
$\mathit{Visited}[i]=\mathit{false}$, $0\leq i \leq m-1$.
|
||||
Let $\mathit{Visited}$ be a boolean vector of size $m$
|
||||
to indicate whether a vertex has been visited.
|
||||
Then, for each edge $e \in \cal L$ from tail to head,
|
||||
it looks for the first
|
||||
vertex $u$ belonging to $e$ not yet visited.
|
||||
This is a sufficient condition for success \cite{b08,bpz07,mwhc96}.
|
||||
Let $j$, $0 \leq j \leq 2$, be the index of $u$ in $e$.
|
||||
Then, it assigns $g[u]=(j-\sum_{v \in e \wedge \mathit{Visited}[v] = true} g[v]) \bmod 3$.
|
||||
Whenever it passes through a vertex $u$ from $e$,
|
||||
if $u$ has not yet been visited,
|
||||
it sets $\mathit{Visited}[u] = true$.
|
||||
% The value $g[i]=3$ is used to represent unassigned vertices.
|
||||
|
||||
If we stop the BDZ algorithm in the assigning step
|
||||
we obtain a PHF with range $[0,m-1]$.
|
||||
The PHF has the following form:
|
||||
$phf(x) = h_{i(x)}(x)$, where $x\in S$ and $i(x) = (g[h_0(x)] + g[h_1(x)] + g[h_2(x)]) \bmod 3$.
|
||||
In this case we do not need information for ranking and
|
||||
can set $g[i] = 0$ whenever $g[i]$ is equal to 3, where $0 \le i \le m-1$.
|
||||
Therefore, the range of the values stored in $g$ is narrowed
|
||||
from $[0,3]$ to $[0,2]$. By using arithmetic coding as block of
|
||||
values (see \cite{b08,bpz07} for details),
|
||||
or any compression technique that allows to perform
|
||||
random access in constant time to an array of compressed values \cite{fn07,gn06,sg06},
|
||||
we can store the resulting PHFs in $m\log 3 = c n\log 3$ bits,
|
||||
where $c \ge 1.23$. For $c = 1.23$, the space requirement is $1.95n$ bits.
|
||||
|
||||
|
||||
The {\em Ranking Step} in Figure~\ref{fig:overview}(c)
|
||||
outputs a data structure
|
||||
that permits to narrow the range of a PHF generated in the
|
||||
assigning step from $[0,m-1]$ to $[0,n-1]$ and thereby
|
||||
an MPHF is produced.
|
||||
The data structure allows to compute in constant time
|
||||
a function $\mathit{rank}\!\!:[0,m-1]\to [0,n-1]$
|
||||
that counts the number of assigned positions
|
||||
before a given position $v$ in $g$.
|
||||
For instance, $\mathit{rank}(4) = 2$ because
|
||||
the positions $0$ and $1$ are assigned
|
||||
since $g[0] \text{ and } g[1] \not = 3$.
|
||||
% and they come before position 4 in $g$.
|
||||
|
||||
For the implementation of the ranking step
|
||||
we have borrowed
|
||||
a simple and efficient implementation from
|
||||
\cite{dict-jour}.
|
||||
It requires $\epsilon \, m$ additional bits of space, where $0 < \epsilon < 1$,
|
||||
and is obtained by storing explicitly the
|
||||
$\mathit{rank}$ of every $k$th index in a rankTable, where $k
|
||||
=\lfloor\log(m)/\epsilon\rfloor$.
|
||||
The larger is $k$ the more compact is the resulting MPHF.
|
||||
Therefore, the users can tradeoff space for evaluation time
|
||||
by setting $k$ appropriately in the implementation.
|
||||
% In the implementation we let
|
||||
% $k$ to be set by the users so that they can trade off
|
||||
% space for evaluation time and vice-versa.
|
||||
We only allow values for $k$
|
||||
that are power of two (i.e., $k=2^{b_k}$ for some constant $b_k$) in order to replace the expensive
|
||||
division and modulo operations by
|
||||
bit-shift and bitwise ``and'' operations, respectively.
|
||||
We have used $k=256$
|
||||
in the experiments
|
||||
for generating more succinct MPHFs.
|
||||
We remark that it is still possible to obtain a more compact data structure by
|
||||
using the results presented in \cite{os07,rrr02}, but at the cost of a much more
|
||||
complex implementation.
|
||||
|
||||
We need to use an additional lookup table $T_r$
|
||||
to guarantee the constant evaluation time of $\mathit{rank}(u)$.
|
||||
Let us illustrate how $\mathit{rank}(u)$ is computed
|
||||
using both the rankTable and the lookup table $T_r$.
|
||||
We first look up
|
||||
the rank of the largest precomputed index
|
||||
$v\leq u$ in the rankTable,
|
||||
and use $T_r$ to count the number of assigned vertices from position
|
||||
$v$ to $u-1$.
|
||||
The lookup table $T_r$ allows us to count in constant time
|
||||
the number of assigned vertices in $\flat=\epsilon \log m$ bits,
|
||||
where $0 < \epsilon < 1$. Thus the actual evaluation time is $O(1/\epsilon)$.
|
||||
For simplicity and
|
||||
without loss of generality we let $\flat$ be a multiple of the number of
|
||||
bits $\beta$ used to encode each entry of $g$.
|
||||
As the values in $g$ come from the range $[0,3]$,
|
||||
then $\beta=2$ bits and we have tried $\flat = 8 \text{ and } 16$.
|
||||
We would expect that $\flat = 16$ should provide
|
||||
a faster evaluation time because we would need to carry out fewer lookups
|
||||
in $T_r$. But, for both values of $\flat$ the lookup table $T_r$ fits entirely in
|
||||
the CPU cache and we did not realize any significant difference in
|
||||
the evaluation times. Therefore we settle for $\flat=8$.
|
||||
We remark that each $r \ge 2$ requires
|
||||
a different lookup table $T_r$ that can be generated a priori.
|
||||
|
||||
|
||||
% To do this in $O(1/\epsilon)$ time
|
||||
% we use a lookup table $T_r$ that allows us to count
|
||||
% the number of assigned vertices in $\flat=\epsilon \log m$ bits
|
||||
% in constant time for any $0 < \epsilon < 1$.
|
||||
|
||||
|
||||
|
||||
% In general the PHFs or MPHFs are constructed based on random acyclic $r$-partite hypergraphs $G_r=(V,E)$,
|
||||
% where $V= V_0 \cup V_1 \cup \dots \cup V_{r-1}$ and $|V_i| = \eta = \lceil \frac{m}{r} \rceil$, where $0\leq i < r$.
|
||||
% The most efficient and compact functions are generated
|
||||
% when $r=3$ and $m=1.23n$. The value $1.23n$ is required to generate a
|
||||
% random acyclic $3$-partite hypergraph with high probability\footnote{Throughout this paper
|
||||
% we write ``with high probability'' to mean with probability
|
||||
% $1 - n^{-\delta}$ for $\delta > 0$.}~\cite{b08,bpz07}.
|
||||
|
||||
|
||||
% the family of linear transformations
|
||||
% presented in \cite{admp99}. A still faster option is the Jenkins function
|
||||
% proposed in \cite{j97}, which was used for all methods considered in this paper.
|
||||
|
||||
The resulting
|
||||
MPHFs have the following form:
|
||||
$h(x) = \mathit{rank}(\mathit{phf}(x))$.
|
||||
Then, we cannot get rid of
|
||||
the raking information by replacing the values 3 by 0 in the entries of $g$.
|
||||
% The array
|
||||
% $g$ is now representing a function $g:V\to \{0,1,2,3\}$
|
||||
% and $\mathit{rank}: V \to [0,n-1]$ is
|
||||
% now the cardinality of
|
||||
% $\{ u\in V \;\mid\; u<v \wedge g[u] \not = 3\}$.
|
||||
% Notice that a vertex $u$ is assigned if $g[u] \neq 3$.
|
||||
In this case each entry in the array $g$ is encoded
|
||||
with $2$ bits and we need $\epsilon m$ additional bits to compute function
|
||||
$\mathit{rank}$ in constant time. Then, the total space to store
|
||||
the resulting functions is $(2 + \epsilon)m = (2 + \epsilon)cn$ bits.
|
||||
By using $c = 1.23$ and $\epsilon = 0.125$
|
||||
we have obtained MPHFs that require approximately $2.62$ bits per key to be stored.
|
||||
|
||||
% Figure~\ref{prog:ram} presents a pseudo code for
|
||||
% the BDZ algorithm, showing how to implement the mapping,
|
||||
% assigning, and ranking steps. Next, it shows how to evaluate the PHF and the MPHF.
|
||||
% The MPHF algorithm uses a lookup table, which is also shown in the figure.
|
||||
%
|
||||
% \begin{figure}
|
||||
% \begin{center}
|
||||
% \vspace{-10mm}
|
||||
% \begin{lstlisting}[multicols=2]
|
||||
% @{\bf BDZ Algorithm}\\[1mm]@
|
||||
% @{\bf Input:} key set $S$, a constant $c \ge 1.23$, a constant $b_k$
|
||||
% and a family of ``good'' hash functions $\cal H$.\\[1mm]@
|
||||
% @{\bf Output:} an array $g$ with $m = \lceil cn \rceil$ 2-bit entries, and a rankTable with $(m >\!> b_k + 1)$ $\delta$-bit entries, where $\delta = 32 \text{ or } 64$ depending on the architecture. The operator $>\!>$ denotes the right shift of bits.\\[2mm]@
|
||||
% void @BDZ@ (@$S$@, @$\cal H$@, @$c$@, @$b_k$@, @$g$@, @rankTable@)@\\[2mm]@
|
||||
% // Mapping step
|
||||
% do
|
||||
% @$G.E = \emptyset$@;
|
||||
% select @$h'$@ at random from @$\cal H$@;
|
||||
% for @{\bf each}@ @$x \in S$@ do
|
||||
% @$H'$ = $h'(x)$@;
|
||||
% @$e$@ = @$\{h_0(x), h_1(x), h_2(x)\}$@;
|
||||
% addEdge (@$G$@, @$e$@);
|
||||
% @$\cal L$@ = isAcyclic(@$G$@);
|
||||
% while (@$G.E$@ is not empty);
|
||||
%
|
||||
% // Assigning step
|
||||
% for (@$u = 0$@; @$u < m$@; @$u$++@)
|
||||
% Visited[@$u$@] = @{\bf false}@;
|
||||
% @$g[u]$@ = @$3$@;
|
||||
% for (i = @$|{\cal L}|-1$@; i @$\ge 0$@; i@$--$@)
|
||||
% @$e$@ = @$\cal L$@[i];
|
||||
% sum = 0;
|
||||
% for (@$v$@ = 2; @$v \ge 0$@; @$v$@@$--$@)
|
||||
% if (not Visited[@$e[v]$@])
|
||||
% Visited[@$e[v]$@] = @{\bf true}@;
|
||||
% @$u$@ = @$e[v]$@;
|
||||
% @$j$@ = @$v$@;
|
||||
% else sum += @$g[e[v]]$@;
|
||||
% @g[u]@ = @$(j - \mathrm{sum}) \bmod 3$@;
|
||||
%
|
||||
% // Ranking step
|
||||
% sum = 0;
|
||||
% kmask = @$(2^{b_k}-1)$@;
|
||||
% for (i = 0; i < @$|g|$@; i++)
|
||||
% if((i & kmask) @==@ 0)
|
||||
% rankTable[i @$>\!> b_k$@] = sum;
|
||||
% if(@$g$@[i] @$\not = 3$@) sum++;
|
||||
%
|
||||
% @{\bf PHF Algorithm}\\[1mm]@
|
||||
% @{\bf Input:} a key $x \in S$, an array $g$ with $m = \lceil cn \rceil$ 2-bit entries, where $c \ge 1.23$, and the ``good'' hash functions $h'$ selected by the BDZ algorithm.\\[1mm]@
|
||||
% @{\bf Output:} the perfect hash function value for the key $x \in S$.\\[2mm]@
|
||||
% int phf (@$x$@, @$g$@, @$h'$@)
|
||||
% @$H'$@ = @$h'(x)$@;
|
||||
% @$e$@ = @$\{h_0(x), h_1(x), h_2(x)\}$@;
|
||||
% @$v$@ = @$(g[e[0]] + g[e[1]] + g[e[2]]) \bmod 3$@;
|
||||
% return @$e[v]$@;
|
||||
%
|
||||
% @{\bf Algorithm to Generate the Lookup Table}\\[1mm]@
|
||||
% @{\bf Input:} none\\[1mm]@
|
||||
% @{\bf Output:} the lookup table @$T_r$@ to be used by the mphf function. It counts the number of assigned
|
||||
% vertices in a single byte. As each entry in the array $g$ is encoded by 2 bits, then a single byte can store at most four 2-bit values. LS($i'$,2) stands for the value of the 2 least significant bits of $i'$.\\[2mm]@
|
||||
% void genLookupTable (@$T_r$@)
|
||||
% for (i = 0; i < 256; i++)
|
||||
% sum = 0;
|
||||
% @$i'$@ = i;
|
||||
% for (j = 0; j < 4; j++)
|
||||
% if(@$\text{LS}(i',2) \not = 3$@) sum++;
|
||||
% @$i'$@ = @$i' >\!> 2$@;
|
||||
% @$T_r[i]$@ = sum;
|
||||
%
|
||||
% @{\bf MPHF Algorithm}\\[1mm]@
|
||||
% @{\bf Input:} a key $x \in S$, an array $g$ with $m = \lceil cn \rceil$ 2-bit entries, where $c \ge 1.23$, the chosen ``good'' hash functions $h'$, a constant $b_k$ that makes $k=2^{b_k}$, the lookup table $T_r$ that counts the number of assigned vertices in a single byte, and a rankTable with $(m >\!> b_k + 1)$ $\delta$-bit entries, where $\delta = 32 \text{ or } 64$ depending on the architecture. The notation $g[i \to j]$ represents the values stored in the entries from $g[i]$ to $g[j]$ for $i\leq j$.\\[1mm]@
|
||||
% @{\bf Output:} the minimal perfect hash function value for the key $x \in S$.\\[2mm]@
|
||||
% int mphf (@$x$@, @$g$@, @$h'$@, @$b_k$@, @$T_r$@, @rankTable@)
|
||||
% @$u$@ = phf(@$x$@, @$g$@, @$h'$@);
|
||||
% j = @$u >\!> b_k$@; // @j@ = @$u$@/k
|
||||
% rank = rankTable[j];
|
||||
% i = j @$<\!< b_k$@; // @i@ = @j*k@
|
||||
% for(j = i + 4; j < u; i = j, j += 4)
|
||||
% rank += @$T_r[g[$@i @$\to$@ j@$]]$@;
|
||||
% for(j = j - 4; j < u; j ++)
|
||||
% if(@$g$@[j] @$\not =$@ 3) rank ++ ;
|
||||
% return rank;
|
||||
% \end{lstlisting}
|
||||
% \end{center}
|
||||
% \vspace{-6mm}
|
||||
% \caption{The BDZ algorithm and the resulting PHFs and MPHFs.}
|
||||
% \label{prog:ram}
|
||||
% \vspace{-7mm}
|
||||
% \end{figure}
|
||||
|
||||
$\eta$ ~~
|
||||
$\epsilon$ ~~
|
||||
$\varepsilon$
|
||||
12
deps/cmph/tex/bdz/makefile
vendored
Executable file
12
deps/cmph/tex/bdz/makefile
vendored
Executable file
@@ -0,0 +1,12 @@
|
||||
all:
|
||||
latex bdz.tex
|
||||
bibtex bdz
|
||||
latex bdz.tex
|
||||
latex bdz.tex
|
||||
dvips bdz.dvi -o bdz.ps
|
||||
run: clean all
|
||||
gv bdz.ps &
|
||||
html: clean all
|
||||
latex2html bdz.tex
|
||||
clean:
|
||||
rm bdz.dvi bdz.ps *.lot *.lof *.aux *.bbl *.blg *.log *.toc
|
||||
176
deps/cmph/tex/chd/chd.bib
vendored
Executable file
176
deps/cmph/tex/chd/chd.bib
vendored
Executable file
@@ -0,0 +1,176 @@
|
||||
@inproceedings{bpz07,
|
||||
author = {F.C. Botelho and R. Pagh and N. Ziviani},
|
||||
title = {Simple and Space-Efficient Minimal Perfect Hash Functions},
|
||||
booktitle = {Proceedings of the 10th Workshop on Algorithms and Data Structures (WADs'07)},
|
||||
publisher = {Springer LNCS vol. 4619},
|
||||
pages = {139-150},
|
||||
Moth = August,
|
||||
location = {Halifax, Canada},
|
||||
year = 2007,
|
||||
key = {author}
|
||||
}
|
||||
|
||||
@inproceedings{pb06,
|
||||
author = {B. Prabhakar and F. Bonomi},
|
||||
title = {Perfect Hashing for Network Applications},
|
||||
booktitle = {Proceedings of the IEEE International Symposium
|
||||
on Information Theory},
|
||||
year = {2006},
|
||||
location = {Seattle, Washington, USA},
|
||||
publisher = {IEEE Press}
|
||||
}
|
||||
|
||||
@inproceedings{dp08,
|
||||
author = {Martin Dietzfelbinger and Rasmus Pagh},
|
||||
title = {Succinct Data Structures for Retrieval and Approximate Membership},
|
||||
booktitle = {Proceedings of the 35th international colloquium on Automata, Languages and Programming (ICALP'08)},
|
||||
year = {2008},
|
||||
isbn = {978-3-540-70574-1},
|
||||
pages = {385--396},
|
||||
location = {Reykjavik, Iceland},
|
||||
doi = {http://dx.doi.org/10.1007/978-3-540-70575-8_32},
|
||||
publisher = {Springer-Verlag},
|
||||
address = {Berlin, Heidelberg},
|
||||
}
|
||||
|
||||
|
||||
@inproceedings{bbd09,
|
||||
author = {D. Belazzougui, F.C. Botelho and M. Dietzfelbinger},
|
||||
title = {Compress, Hash and Displace},
|
||||
booktitle = {Proceedings of the 17th European Symposium on Algorithms (ESA'09)},
|
||||
publisher = {Springer LNCS},
|
||||
OPTpages = {139-150},
|
||||
Moth = September,
|
||||
location = {Copenhagen, Denmark},
|
||||
year = 2009,
|
||||
key = {author}
|
||||
}
|
||||
|
||||
@PhdThesis{b08,
|
||||
author = {F. C. Botelho},
|
||||
title = {Near-Optimal Space Perfect Hashing Algorithms},
|
||||
school = {Federal University of Minas Gerais},
|
||||
year = {2008},
|
||||
OPTkey = {},
|
||||
OPTtype = {},
|
||||
OPTaddress = {},
|
||||
month = {September},
|
||||
note = {Supervised by Nivio Ziviani, \url{http://www.dcc.ufmg.br/pos/cursos/defesas/255D.PDF}},
|
||||
OPTannote = {},
|
||||
OPTurl = {http://www.dcc.ufmg.br/pos/cursos/defesas/255D.PDF},
|
||||
OPTdoi = {},
|
||||
OPTissn = {},
|
||||
OPTlocalfile = {},
|
||||
OPTabstract = {}
|
||||
}
|
||||
|
||||
@Article{mwhc96,
|
||||
author = {B.S. Majewski and N.C. Wormald and G. Havas and Z.J. Czech},
|
||||
title = {A family of perfect hashing methods},
|
||||
journal = {The Computer Journal},
|
||||
year = {1996},
|
||||
volume = {39},
|
||||
number = {6},
|
||||
pages = {547-554},
|
||||
key = {author}
|
||||
}
|
||||
|
||||
@inproceedings{ckrt04,
|
||||
author = {B. Chazelle and J. Kilian and R. Rubinfeld and A. Tal},
|
||||
title = {The Bloomier Filter: An Efficient Data Structure for Static Support Lookup Tables},
|
||||
booktitle = {Proceedings of the 15th annual ACM-SIAM symposium on Discrete algorithms (SODA'04)},
|
||||
year = {2004},
|
||||
isbn = {0-89871-558-X},
|
||||
pages = {30--39},
|
||||
location = {New Orleans, Louisiana},
|
||||
publisher = {Society for Industrial and Applied Mathematics},
|
||||
address = {Philadelphia, PA, USA},
|
||||
optpublisher = {Society for Industrial and Applied Mathematics}
|
||||
}
|
||||
|
||||
@Article{j97,
|
||||
author = {B. Jenkins},
|
||||
title = {Algorithm Alley: Hash Functions},
|
||||
journal = {Dr. Dobb's Journal of Software Tools},
|
||||
volume = {22},
|
||||
number = {9},
|
||||
month = {september},
|
||||
year = {1997},
|
||||
note = {Extended version available at \url{http://burtleburtle.net/bob/hash/doobs.html}}
|
||||
}
|
||||
|
||||
|
||||
@Article{e87,
|
||||
author = {J. Ebert},
|
||||
title = {A Versatile Data Structure for Edges Oriented Graph Algorithms},
|
||||
journal = {Communication of The ACM},
|
||||
year = {1987},
|
||||
OPTkey = {},
|
||||
OPTvolume = {},
|
||||
number = {30},
|
||||
pages = {513-519},
|
||||
OPTmonth = {},
|
||||
OPTnote = {},
|
||||
OPTannote = {}
|
||||
}
|
||||
|
||||
@article {dict-jour,
|
||||
AUTHOR = {R. Pagh},
|
||||
TITLE = {Low Redundancy in Static Dictionaries with Constant Query Time},
|
||||
OPTJOURNAL = sicomp,
|
||||
JOURNAL = fsicomp,
|
||||
VOLUME = {31},
|
||||
YEAR = {2001},
|
||||
NUMBER = {2},
|
||||
PAGES = {353--363},
|
||||
}
|
||||
|
||||
|
||||
@inproceedings{sg06,
|
||||
author = {K. Sadakane and R. Grossi},
|
||||
title = {Squeezing succinct data structures into entropy bounds},
|
||||
booktitle = {Proceedings of the 17th annual ACM-SIAM symposium on Discrete algorithms (SODA'06)},
|
||||
year = {2006},
|
||||
pages = {1230--1239}
|
||||
}
|
||||
|
||||
@inproceedings{gn06,
|
||||
author = {R. Gonzalez and
|
||||
G. Navarro},
|
||||
title = {Statistical Encoding of Succinct Data Structures},
|
||||
booktitle = {Proceedings of the 19th Annual Symposium on Combinatorial Pattern Matching (CPM'06)},
|
||||
year = {2006},
|
||||
pages = {294--305}
|
||||
}
|
||||
|
||||
@inproceedings{fn07,
|
||||
author = {K. Fredriksson and
|
||||
F. Nikitin},
|
||||
title = {Simple Compression Code Supporting Random Access and Fast
|
||||
String Matching},
|
||||
booktitle = {Proceedings of the 6th International Workshop on Efficient and Experimental Algorithms (WEA'07)},
|
||||
year = {2007},
|
||||
pages = {203--216}
|
||||
}
|
||||
|
||||
@inproceedings{os07,
|
||||
author = {D. Okanohara and K. Sadakane},
|
||||
title = {Practical Entropy-Compressed Rank/Select Dictionary},
|
||||
booktitle = {Proceedings of the Workshop on Algorithm Engineering and
|
||||
Experiments (ALENEX'07)},
|
||||
year = {2007},
|
||||
location = {New Orleans, Louisiana, USA}
|
||||
}
|
||||
|
||||
|
||||
@inproceedings{rrr02,
|
||||
author = {R. Raman and V. Raman and S. S. Rao},
|
||||
title = {Succinct indexable dictionaries with applications to encoding k-ary trees and multisets},
|
||||
booktitle = {Proceedings of the thirteenth annual ACM-SIAM symposium on Discrete algorithms (SODA'02)},
|
||||
year = {2002},
|
||||
isbn = {0-89871-513-X},
|
||||
pages = {233--242},
|
||||
location = {San Francisco, California},
|
||||
publisher = {Society for Industrial and Applied Mathematics},
|
||||
address = {Philadelphia, PA, USA},
|
||||
}
|
||||
70
deps/cmph/tex/chd/chd.tex
vendored
Executable file
70
deps/cmph/tex/chd/chd.tex
vendored
Executable file
@@ -0,0 +1,70 @@
|
||||
\documentclass[12pt]{article}
|
||||
\usepackage{graphicx}
|
||||
|
||||
\usepackage{latexsym}
|
||||
\usepackage{url}
|
||||
|
||||
\usepackage{a4wide}
|
||||
\usepackage{amsmath}
|
||||
\usepackage{amssymb}
|
||||
\usepackage{amsfonts}
|
||||
\usepackage{graphicx}
|
||||
\usepackage{listings}
|
||||
\usepackage{fancyhdr}
|
||||
\usepackage{graphics}
|
||||
\usepackage{multicol}
|
||||
\usepackage{epsfig}
|
||||
\usepackage{textcomp}
|
||||
\usepackage{url}
|
||||
|
||||
% \usepackage{subfigure}
|
||||
% \usepackage{subfig}
|
||||
% \usepackage{wrapfig}
|
||||
|
||||
|
||||
\bibliographystyle{plain}
|
||||
% \bibliographystyle{sbc}
|
||||
% \bibliographystyle{abnt-alf}
|
||||
% \bibliographystyle{abnt-num}
|
||||
|
||||
\begin{document}
|
||||
|
||||
\sloppy
|
||||
|
||||
% \renewcommand{\baselinestretch}{1.24}\normalsize % set the space between lines to 1.24
|
||||
|
||||
% set headings
|
||||
% \pagestyle{fancy}
|
||||
% \lhead[\fancyplain{}{\footnotesize\thepage}]
|
||||
% {\fancyplain{}{\footnotesize\rightmark}}
|
||||
% \rhead[\fancyplain{}{\footnotesize\leftmark}]
|
||||
% {\fancyplain{}{\footnotesize\thepage}}
|
||||
%
|
||||
% \cfoot{}
|
||||
|
||||
\lstset{
|
||||
language=C,
|
||||
basicstyle=\fontsize{8}{8}\selectfont,
|
||||
captionpos=t,
|
||||
aboveskip=0mm,
|
||||
belowskip=0mm,
|
||||
abovecaptionskip=0.5mm,
|
||||
belowcaptionskip=0.5mm,
|
||||
% numbers = left,
|
||||
mathescape=true,
|
||||
escapechar=@,
|
||||
extendedchars=true,
|
||||
showstringspaces=false,
|
||||
% columns=fixed,
|
||||
basewidth=0.515em,
|
||||
frame=single,
|
||||
framesep=1mm,
|
||||
xleftmargin=1mm,
|
||||
xrightmargin=1mm,
|
||||
framerule=0pt
|
||||
}
|
||||
|
||||
\include{introduction} % Introducao
|
||||
\bibliography{chd}
|
||||
|
||||
\end{document}
|
||||
38
deps/cmph/tex/chd/introduction.tex
vendored
Executable file
38
deps/cmph/tex/chd/introduction.tex
vendored
Executable file
@@ -0,0 +1,38 @@
|
||||
\section{Introduction} \label{sec:introduction}
|
||||
|
||||
|
||||
The important performance parameters of a PHF are representation size, evaluation time and construction time. The representation size plays an important role when the whole function fits in a faster memory and the actual data is stored in a slower memory. For instace, compact PHFs can be entirely fit in a CPU cache and this makes their computation really fast by avoiding cache misses. The CHD algorithm plays an important role in this context. It was designed by Djamal Belazzougui, Fabiano C. Botelho, and Martin Dietzfelbinger in \cite{bbd09}.
|
||||
|
||||
|
||||
The CHD algorithm permits to obtain PHFs with representation size very close to optimal while retaining $O(n)$ construction time and $O(1)$ evaluation time. For example, in the case $m=2n$ we obtain a PHF that uses space $0.67$ bits per key, and for $m=1.23n$ we obtain space $1.4$ bits per key, which was not achievable with previously known methods. The CHD algorithm is inspired by several known algorithms;
|
||||
the main new feature is that it combines a modification of Pagh's ``hash-and-displace'' approach
|
||||
with data compression on a sequence of hash function indices.
|
||||
That combination makes it possible to significantly reduce space usage
|
||||
while retaining linear construction time and constant query time.
|
||||
The CHD algorithm can also be used for $k$-perfect hashing,
|
||||
where at most $k$ keys may be mapped to the same value.
|
||||
For the analysis we assume that fully random hash functions are given for free;
|
||||
such assumptions can be justified and were made in previous papers.
|
||||
|
||||
The compact PHFs generated by the CHD algorithm can be used in many applications in which we want to assign a unique identifier to each key without storing any information on the key. One of the most obvious applications of those functions
|
||||
(or $k$-perfect hash functions) is when we have a small fast memory in which we can store the perfect hash function while the keys and associated satellite data are stored in slower but larger memory.
|
||||
The size of a block or a transfer unit may be chosen so that $k$ data items can be retrieved in
|
||||
one read access. In this case we can ensure that data associated with a key can be retrieved in a single probe to slower memory. This has been used for example in hardware routers~\cite{pb06}.
|
||||
% Perfect hashing has also been found to be competitive with traditional hashing in internal memory~\cite{blmz08} on standard computers. Recently perfect hashing has been used to accelerate algorithms on graphs~\cite{ESS08} when the graph representation does not fit in main memory.
|
||||
|
||||
|
||||
The CHD algorithm generates the most compact PHFs and MPHFs we know of in~$O(n)$ time.
|
||||
The time required to evaluate the generated functions is constant (in practice less than $1.4$ microseconds).
|
||||
The storage space of the resulting PHFs and MPHFs are distant from the information
|
||||
theoretic lower bound by a factor of $1.43$.
|
||||
The closest competitor is the algorithm by Martin and Pagh \cite{dp08} but
|
||||
their algorithm do not work in linear time.
|
||||
Furthermore, the CHD algorithm
|
||||
can be tuned to run faster than the BPZ algorithm \cite{bpz07} (the fastest algorithm
|
||||
available in the literature so far) and to obtain more compact functions.
|
||||
The most impressive characteristic is that it has the ability, in principle, to
|
||||
approximate the information theoretic lower bound while being practical.
|
||||
A detailed description of the CHD algorithm can be found in \cite{bbd09}.
|
||||
|
||||
|
||||
|
||||
12
deps/cmph/tex/chd/makefile
vendored
Executable file
12
deps/cmph/tex/chd/makefile
vendored
Executable file
@@ -0,0 +1,12 @@
|
||||
all:
|
||||
latex chd.tex
|
||||
bibtex chd
|
||||
latex chd.tex
|
||||
latex chd.tex
|
||||
dvips chd.dvi -o chd.ps
|
||||
run: clean all
|
||||
gv chd.ps &
|
||||
html: clean all
|
||||
latex2html chd.tex
|
||||
clean:
|
||||
rm chd.dvi chd.ps *.lot *.lof *.aux *.bbl *.blg *.log *.toc
|
||||
Reference in New Issue
Block a user