1: \documentclass[11pt]{article}
2: % \usepackage{times}
3: \usepackage{mathptm}
4: \usepackage{graphicx}
5: % \usepackage{amsmath}
6: \usepackage{cite}
7: \usepackage{algorithm}
8: \usepackage{fullpage}
9: \usepackage{algorithmic}
10:
11: \newif\ifFull
12: \Fullfalse
13:
14: \ifFull
15: \else
16: %\usepackage{cramped}
17: \renewcommand{\subsection}[1]{\paragraph{#1.}}
18: \fi
19:
20: \newtheorem{lemma}{Lemma}
21: \newtheorem{theorem}[lemma]{Theorem}
22: \newtheorem{definition}{Definition}
23: \newtheorem{corollary}[lemma]{Corollary}
24: \newenvironment{proof}{\noindent{\bf Proof:}}{\hspace*{\fill}\rule{6pt}{6pt}\smallskip}
25: \newcommand{\R}{{\mbox{\textbf{R}}}}
26:
27:
28: % \topmargin 0pt \advance \topmargin by -\headheight \advance
29: % \topmargin by -\headsep
30: %
31: % \textheight 9.0in
32: % \oddsidemargin 0pt \evensidemargin \oddsidemargin
33: % \marginparwidth 0.5in
34:
35: \title{The Skip Quadtree: A Simple Dynamic \\
36: Data Structure for Multidimensional Data}
37:
38: \author{David Eppstein\footnotemark[2] \and
39: Michael T. Goodrich\footnotemark[2] \and Jonathan Z. Sun\footnotemark[2]}
40:
41: \date{}
42:
43: \def\baselinestretch{0.98}
44:
45:
46: \begin{document}
47: \maketitle
48: %\baselineskip 6pt
49: \renewcommand{\thefootnote}{\fnsymbol{footnote}}
50:
51: \footnotetext[2]{Dept.~of Computer Science,
52: University of California, Irvine, CA 92697-3425, USA.
53: \texttt{\{eppstein,goodrich,zhengsun\}(at)ics.uci.edu}.}
54:
55: % \footnotetext[3]{Supported by}
56:
57: % \footnotetext[4]{Supported by}
58:
59: \renewcommand{\thefootnote}{\arabic{footnote}}
60:
61:
62: \begin{abstract}
63: We present a new multi-dimensional data structure, which we call
64: the skip quadtree (for point data in $\R^2$) or the skip octree (for
65: point data in $\R^d$, with constant $d>2$).
66: Our data structure combines the best features of two
67: well-known data structures, in that it has the well-defined
68: ``box''-shaped regions of region quadtrees and the
69: logarithmic-height search and update hierarchical structure of skip lists.
70: Indeed, the bottom level of our structure is exactly a region quadtree
71: (or octree for higher dimensional data).
72: We describe efficient algorithms for inserting
73: and deleting points in a skip quadtree, as well as fast methods for
74: performing point location and approximate range queries.
75: \end{abstract}
76:
77: \section{Introduction}
78: Data structures for multidimensional point data are of
79: significant interest in the computational geometry, computer
80: graphics, and scientific data visualization literatures.
81: They allow point data to be stored and searched efficiently, for
82: example to perform range queries to report (possibly approximately)
83: the points that are contained in a given query region.
84: We are interested in this paper in data structures for multidimensional
85: point sets that are dynamic, in that they allow for fast point
86: insertion and deletion, as well as efficient, in that they use linear
87: space and allow for fast query times.
88:
89: \subsection{Related Previous Work}
90: Linear-space multidimensional data structures typically
91: are defined by hierarchical
92: subdivisions of space, which give rise to tree-based
93: search structures.
94: That is, a hierarchy is defined by associating with
95: each node $v$ in a tree $T$
96: a region $R(v)$ in $\R^d$
97: such that the children of $v$ are associated with subregions of
98: $R(v)$ defined by some kind of ``cutting'' action on $R(v)$.
99: Examples include:
100: \begin{itemize}
101: \item
102: \emph{quadtrees}~\cite{o-mtuas-82}:
103: regions are defined by squares in the plane, which are
104: subdivided into four equal-sized squares for any regions
105: containing more than a single point. So each internal
106: node in the underlying tree has four children and regions have
107: optimal aspect ratios (which is useful for many types of queries).
108: Unfortunately, the tree can have arbitrary depth, independent even of
109: the number of input points. Even so, point insertion and deletion is
110: fairly simple.
111: \item
112: \emph{octrees}~\cite{ftyk-oasm-83,o-mtuas-82}:
113: regions are defined by hypercubes in $\R^d$, which are
114: subdivided into $2^d$ equal-sized hypercubes for any regions
115: containing more than a single point. So each internal
116: node in the underlying tree has $2^d$ children and, like quadtrees,
117: regions have optimal aspect ratios and point insertion/deletion is
118: simple, but the tree can have arbitrary depth.
119: \item
120: \emph{$k$-d trees}~\cite{b-mbstu-75}:
121: regions are defined by hyperrectangles in $\R^d$,
122: which are subdivided into two hyperrectangles using an
123: axis-perpendicular cutting hyperplane through the median point,
124: for any regions containing more than two points.
125: So the underlying tree is binary and has $\lceil\log n\rceil$ depth.
126: Unfortunately, the regions can have arbitrarily large aspect ratios,
127: which can adversely affect the efficiencies of some queries.
128: In addition,
129: maintaining an efficient $k$-d tree subject to point insertions and
130: removal is non-trivial.
131: \item
132: \emph{compressed quad/octrees}~\cite{as-dchan-99,b-acpqh-93,bet-pcqqt-93,c-faann-83}:
133: regions are defined in the same way
134: as in a quadtree or octree (depending on the dimensionality), but
135: paths in the tree consisting of nodes with only one non-empty child
136: are compressed to single edges. This compression allows regions to
137: still be hypercubes (with optimal aspect ratio), but it changes the
138: subdivision process from a four-way cut to a reduction to at most four
139: disjoint hypercubes inside the region. It also forces the height of
140: the (compressed) quad/octree to be at most $O(n)$.
141: This height bound is still not very efficient, of course.
142: \item
143: \emph{balanced box decomposition (BBD) trees}
144: \cite{am-annqf-93,am-ars-00,amnsw-oaann-98}:
145: regions are defined by hypercubes
146: with smaller hypercubes subtracted away, so that the height of the
147: decomposition tree is $O(\log n)$. These regions have good aspect
148: ratios, that is, they are ``fat''~\cite{ekns-ddsfo-00,ers-ufwsc-93b},
149: but they are not convex, which limits some of the
150: applications of this structure.
151: In addition, making this structure dynamic appears non-trivial.
152: \item
153: \emph{balanced aspect-ratio (BAR) trees}~\cite{d-bart-99,dgk-bartc-01}:
154: regions are defined by
155: convex polytopes of bounded aspect ratio, which are subdivided
156: by hyperplanes perpendicular to one of a set of $2d$ ``spread-out''
157: vectors so that the height of the decomposition tree is $O(\log n)$.
158: This structure has the advantage of having convex regions and
159: logarithmic depth, but the regions are no longer hyperrectangles (or
160: even hyperrectangles with hyperrectangular ``holes'').
161: In addition, making this structure dynamic appears non-trivial.
162: \end{itemize}
163: This summary is, of course, not a complete review of existing work on
164: space partitioning
165: data structures for multidimensional point sets.
166: The reader interested in further study of these topics is encouraged
167: to read the book chapters by
168: Asano \textit{et al.}~\cite{aeiim-pubtc-85},
169: Samet~\cite{s-sds-95,s-msd-99,s-msds-05},
170: Lee~\cite{l-isrps-05}, Aluru~\cite{a-qo-05},
171: Naylor~\cite{n-bspt-05},
172: Nievergelt and Widmayer~\cite{nw-sdscd-00},
173: Leutenegger and Lopez~\cite{ll-rt-05},
174: Duncan and Goodrich~\cite{dg-agqs-05}, and Arya and
175: Mount~\cite{am-cgpl-05}, as well as the books by de~Berg
176: \textit{et al.}~\cite{bkos-cgaa-00} and Samet~\cite{s-sdsqo-89,s-asdsc-90}.
177:
178: \subsection{Our Results}
179: In this paper we present a dynamic data structure for
180: multidimensional data, which we call the \emph{skip quadtree} (for
181: point data in $\R^2$)
182: or the \emph{skip octree} (for point data in $\R^d$, for fixed $d>2$).
183: For the sake of simplicity, however, we will often use the term
184: ``quadtree'' to refer to both the two- and multi-dimensional
185: structures.
186: This structure provides a hierarchical view of a quadtree in a
187: fashion reminiscent of the way the skip-list
188: data structure~\cite{p-slpab-90,mps-dsl-92}
189: provides a hierarchical view of a linked list.
190: Our approach differs fundamentally from previous techniques for
191: applying skip-list hierarchies to
192: multidimensional point data~\cite{ln-ahsrs-02,n-sldsm-94} or
193: interval data~\cite{h-islds-91}, however, in that the bottom-level structure
194: in our hierarchy is not a list---it is a tree.
195: Indeed, the bottom-level structure
196: in our hierarchy is just a compressed
197: quadtree~\cite{as-dchan-99,b-acpqh-93,bet-pcqqt-93,c-faann-83}.
198: Thus, any operation that can be performed with a quadtree can be
199: performed with a skip quadtree.
200: More interestingly, however, we show that point location and
201: approximate range queries can be performed in a skip quadtree
202: in $O(\log n)$ and $O(\epsilon^{1-d}\log n+k)$ time,
203: respectively, where $k$ is the
204: size of the output in the approximate range query case, for constant
205: $\epsilon>0$.
206: We also show that point insertion and deletion can be performed
207: in $O(\log n)$ time.
208: We describe both randomized and deterministic versions of our data
209: structure, with the above time bounds being expected bounds for the
210: randomized version and worst-case bounds for the deterministic
211: version.
212:
213: Due to the balanced aspect ratio of their cells, quadtrees have many
214: geometric applications including range searching, proximity problems,
215: construction of well separated pair decompositions, and quality
216: triangulation. However, due to their potentially high depth,
217: maintaining quadtrees directly can be expensive. Our skip quadtree
218: data structure provides the benefits of quadtrees together with fast
219: update and query times even in the presence of deep tree branches, and
220: is, to our knowledge, the first balanced aspect ratio subdivision with
221: such efficient update and query times. We believe that this data
222: structure will be useful for many of the same applications as
223: quadtrees. In this paper we demonstrate the skip quadtree's benefits
224: for two simple types of queries: point location within the quadtree
225: itself, and approximate range searching.
226:
227: \section{Preliminaries}
228:
229: In this section we discuss some preliminary conventions
230: we use in this paper.
231:
232: \subsection{Notational Conventions}
233: Throughout this paper we use
234: $Q$ for a quadtree and $p,q,r$ for squares or quarters of squares
235: associated with the nodes of $Q$.
236: We use
237: $S$ to denote a set of points and $x,y,z$ for points in $\R^d$.
238: We let $p(x)$ denote the
239: smallest square in $Q$ that covers the location of some point $x$, regardless
240: if $x$ is in the underlying point set for $Q$ or not.
241: % Subscription $i$ is reserved for the
242: % level in skip quadtree or skip list.
243: Constant $d$ is reserved for the dimensionality of our search space,
244: $\R^d$, and we assume throughout that $d\ge 2$ is a constant.
245: In $d$-dimensional space we still use the term
246: ``square'' to refer to a $d$-dimensional
247: cube and we use ``quarter'' for any of the $1/2^d$ partitions of a square
248: $r$ into squares having the center of $r$ as a corner and sharing
249: part of $r$'s boundary.
250: A square $r$ is identified by its center
251: $c(r)$ and its half side length $s(r)$.
252:
253:
254: \subsection{The Computational Model}
255:
256: As is standard practice
257: in computational geometry algorithms dealing
258: with quadtrees and octrees
259: (e.g., see~\cite{bet-pcqqt-93}), we assume in this paper that certain
260: operations on points in $\R^d$ can be done in constant time.
261: In real applications, these operations are typically performed
262: using hardware operations that have running times similar to operations
263: used to compute linear intersections and perform point/line comparisons.
264: % It's necessary to clarify some sort of integer arithmetic model
265: % before talking about algorithms. A point $x=(x_1,\dots, x_k)$ in
266: % $d$-dimensional space is represented by its $d$ coordinates, each of $O(1)$
267: % size ($O(\log n)$ bits).
268: Specifically, in arithmetic terms, the computations needed to perform point
269: location in a quadtree, as well as update and range query operations,
270: involve finding the
271: most significant binary digit at which two coordinates of two
272: points differ.
273: This can be done in $O(1)$ machine instructions if
274: we have a most-significant-bit instruction, or by using
275: floating-point or extended-precision normalization.
276: If the coordinates are not in binary fixed or floating point, such
277: operations may also involve computing integer floor and ceiling
278: functions.
279:
280: \ifFull
281: When inserting, we may have two points $x$
282: and $y$ contained in one un-partitioned quarter of an interesting
283: square $p$ so we need to find the largest interesting square $q$
284: inside this quarter, which is decided by the first different digit
285: of the coordinates of $x$ and $y$ along all dimensions. We may
286: also have the newly inserted point $x$ and an existing interesting
287: square $q$ with $x\not\in q$ in an un-partitioned quarter of an
288: interesting square, which can be handled similarly.
289: \fi
290:
291: \subsection{The Compressed Quadtree}\label{compressed}
292: As the bottom-level structure in a skip quadtree is a compressed
293: quadtree~\cite{as-dchan-99,b-acpqh-93,bet-pcqqt-93,c-faann-83},
294: let us briefly review this structure.
295:
296: The compressed quadtree is defined in terms of an underlying
297: (standard) quadtree for the same point set; hence, we define the compressed
298: quadtree by identifying which squares from the standard quadtree
299: should also be included in the compressed quadtree.
300: Without loss of generality, we can assume that the
301: center of the root square (containing the entire point set of
302: interest) is the origin and the half side length
303: for any square in the quadtree is a power of $2$. A point $x$ is
304: contained in a square $p$ iff $-s(p)\leq x_i-c(p)_i<s(p)$ for each
305: dimension $i\in [1,\cdots,d]$. According to whether $x_i-c(p)_i<0$
306: or $\geq 0$ for all dimensions we also know in which quarter of
307: $p$ that $x$ is contained.
308:
309: Define an \emph{interesting square} of a (standard) quadtree to be one that
310: is either the root of the quadtree or that has two or more nonempty
311: children.
312: Then it is clear that any quadtree square $p$ containing
313: two or more points contains a unique largest interesting square
314: $q$ (which is either $p$ itself of a descendent square of $p$ in the
315: standard quadtree).
316: In particular, if $q$ is the largest interesting square for $p$,
317: then $q$ is the LCA in the quadtree of the points contained in
318: $p$.
319: We compress the (standard) quadtree to explicitly store only the
320: interesting squares, by splicing out the non-interesting squares
321: and deleting their empty children from the original quadtree. That
322: is, for each interesting square $p$, we store $2^d$ bi-directed
323: pointers one for each $d$-dimensional quarter of $p$. If the quarter contains
324: two or more points, the pointer goes to the largest interesting
325: square inside that quarter; if the quarter contains one point, the
326: pointer goes to that point; and if the quarter is empty, the
327: pointer is NULL.
328: We call this structure a
329: \emph{compressed quadtree}~\cite{as-dchan-99,b-acpqh-93,bet-pcqqt-93,c-faann-83}.
330: (See Fig.~\ref{Fig-skip-0}.)
331:
332: \begin{figure}[htb]
333: \vspace*{-10pt}
334: \begin{center}
335: \includegraphics[scale=0.6]{Fig-skip-0}
336: \end{center}
337: \vspace*{-15pt} \caption{A quadtree containing 3 points (left) and
338: its compressed quadtree (right). Below them are the pointer
339: representations, where a square or an interesting square is
340: represented by a square, a point by a solid circle and an empty
341: quarter by a hollow circle. The 4 children of each square are
342: ordered from left to right according to the I, II, III, IV
343: quadrants.} \label{Fig-skip-0}
344: \end{figure}
345:
346: A compressed $d$-dimensional quadtree $Q$ for $n$ points has size
347: $O(n)$, but its worst-case height is $O(n)$,
348: which is inefficient yet nevertheless
349: improves the arbitrarily-bad worst-case height of a standard
350: quadtree.
351: These bounds follow immediately from the fact
352: that there are $O(n)$ interesting squares, each of which has size $O(2^d)$.
353:
354: With respect to the arithmetic operations needed when dealing with
355: compressed quadtrees,
356: we assume that we can do the following operations in $O(1)$ time:
357:
358: \begin{itemize}
359: \item Given a point $x$ and a square $p$,
360: decide if $x\in p$ and if yes, which
361: quarter of $p$ contains $x$.
362: \item Given a quarter of
363: a square $p$ containing two points $x$ and $y$,
364: find the largest interesting square inside this quarter.
365: \item Given a quarter of $p$ containing an interesting square
366: $r$ and a point $x\not\in r$, find the largest interesting
367: square inside this quarter.
368: \end{itemize}
369:
370: \ifFull
371: \subsubsection{Search, Insertion, and Deletion in a Compressed Quadtree}
372: \fi
373:
374: A standard search in a compressed quadtree $Q$ is to locate the
375: quadtree square containing a given point $x$.
376: Such a search starts from the quadtree
377: root and follows the parent-child pointers, and returns the
378: smallest interesting square $p(x)$ in $Q$ that covers the location
379: of $x$. Note that $p(x)$ is either a leaf node of $Q$ or an
380: internal node with none of its child nodes covering the location of
381: $x$. If the quarter of $p(x)$ covering the location of $x$
382: contains exact one point and it matches $x$, then we find $x$ in
383: $Q$. Otherwise $x$ is not in $Q$, but the smallest interesting
384: square in $Q$ covering the location of $x$ is found.
385: The search proceeds in a top-down fashion from the root, taking
386: $O(1)$ time per level; hence,
387: the search time is $O(n)$.
388:
389: Inserting a new point starts by locating the interesting square $p(x)$
390: covering $x$.
391: Inserting $x$ into an empty quarter of $p(x)$ only takes $O(1)$
392: pointer changes. If the quarter of $p(x)$ $x$ to be inserted into
393: already contains a point $y$ or an interesting square $r$, we
394: insert into $Q$ a new interesting square $q\subset p$ that
395: contains both $x$ and $y$ (or $r$) but separates $x$ and $y$ (or
396: $r$) into different quarters of $q$. This can be done in $O(1)$
397: time. So the insertion time is $O(1)$, given $p(x)$.
398:
399: Deleting $x$ may cause its covering interesting square $p(x)$ to
400: no longer be interesting. If this happens, we splice $p(x)$ out
401: and delete its empty children from $Q$. Note that the parent node
402: of $p(x)$ is still interesting, since deleting $x$ doesn't change
403: the number of nonempty quarters of the parent of $p(x)$.
404: Therefore, by splicing out at most one node (with $O(1)$ pointer
405: changes), the compressed quadtree is updated correctly. So a
406: deletion also takes $O(1)$ time, given $p(x)$.
407:
408: {\theorem Point-location searching, as well as point insertion and
409: deletion, in a compressed $d$-dimensional quadtree of $n$ points
410: can be done in $O(n)$ time.}
411:
412: Thus, the worst-case time for querying a compressed quadtree
413: is no better than that of brute-force searching of an unordered set
414: of points.
415: Still, like a standard quadtree, a compressed quadtree is unique given a set
416: of $n$ points and a (root) bounding box, and this uniqueness allows
417: for constant-time update operations if we have already identified the
418: interesting square involved in the update.
419: Therefore, if we could find a faster way to query a compressed
420: quadtree while still allowing for fast updates, we could construct an
421: efficient dynamic multidimensional data structure.
422:
423: \section{The Randomized Skip Quadtree}\label{randomized}
424: In this section, we describe and analyze the randomized skip quadtree
425: data structure, which provides a hierarchical view of a compressed
426: quadtree so as to allow for logarithmic expected-time querying and
427: updating, while keeping the expected space bound linear.
428:
429: \subsection{Randomized Skip Quadtree Definition}
430:
431: The randomized skip quadtree is defined
432: by a sequence of compressed quadtrees that are respectively defined on
433: a sequence of subsets of the input set $S$.
434: In particular,
435: we maintain a sequence of subsets of the input points $S$,
436: such that $S_0=S$, and, for $i>0$, $S_i$ is sampled from $S_{i-1}$ by
437: keeping each point with probability 1/2.
438: (So, with high probability, $S_{2\log n} = \emptyset$.)
439: For each $S_i$, we form a (unique)
440: compressed quadtree $Q_i$ for the points in $S_i$.
441: We therefore view the $Q_i$'s as forming a sequence of levels
442: in the skip quadtree, such that $S_0$ is the bottom level (with its
443: compressed quadtree defined for the entire set $S$)
444: and $S_{top}$ being the top level, defined as the lowest level with
445: an empty underlying set of points.
446:
447: Note that if a square $p$ is
448: interesting in $Q_i$, then it is also interesting in $Q_{i-1}$.
449: Indeed, this \emph{coherence} property between levels in the skip
450: quadtree is what facilitates fast searching.
451: For each
452: interesting square $p$ in a compressed quadtree $Q_i$, we add two
453: pointers: one to the same square $p$ in $Q_{i-1}$ and another to
454: the same square $p$ in $Q_{i+1}$ if $p$ exists in $Q_{i+1}$, or
455: NULL otherwise.
456: The sequence of $Q_i$'s and $S_i$'s, together with these auxiliary
457: pointers define the skip quadtree.
458: (See Fig.~\ref{Fig-skip-1}.)
459:
460: \begin{figure}[hbt]
461: \vspace*{-10pt}
462: \begin{center}
463: \includegraphics[scale=0.6]{Fig-skip-1}
464: \end{center}
465: \vspace*{-10pt} \caption{A randomized skip quadtree consists of
466: $Q_0$, $Q_1$ and $Q_2$. (Identical interesting squares in two
467: adjacent compressed quadtrees are linked by a double-head arrow
468: between the square centers.)}\label{Fig-skip-1}
469: \end{figure}
470:
471: \subsection{Search, Insertion, and Deletion in a Randomized Skip Quadtree}
472:
473: To find the smallest square in $Q_0$ covering the location of a
474: query point $x$, we start with the root square $p_{l,start}$ in
475: $Q_l$. ($l$ is the largest value for which $S_l$ is nonempty and
476: $l$ is $O(\log n)$ w.h.p.) Then we search $x$ in
477: $Q_l$ as described in Section~\ref{compressed}, following the
478: parent-child pointers until we stop at the minimum interesting
479: square $p_{l,end}$ in $Q_l$ that covers the location of $x$. After
480: we stop searching in each $Q_i$ we go to the copy of $p_{i,end}$
481: in $Q_{i-1}$ and let $p_{i-1,start}=p_{i,end}$ to continue
482: searching in $Q_{i-1}$. (See the searching path of $y$ in
483: Fig.~\ref{Fig-skip-0}.)
484:
485: {\lemma For any point $x$, the expected number of searching steps
486: within any individual $Q_i$ is constant. \label{25}}
487:
488: \begin{proof}
489: Suppose the searching path of $x$ in $Q_i$ from the root of $Q_i$
490: is $p_0,p_1,\cdots, p_m$. (See $Q_0$ in Fig.~\ref{Fig-skip-1}.)
491: Consider the probability $Pr(j)$ of $Event(j)$ such that $p_{m-j}$
492: is the last one in $p_0,p_1,\cdots, p_m$ which is also interesting
493: in $Q_{i+1}$. (Note that $Event(j)$ and $Event(j')$ are excluding
494: for any $j\neq j'$.) Then $j$ is the number of searching steps
495: that will be performed in $Q_i$. We overlook the case $j=0$ since
496: it contributes nothing to the expected value of $j$.
497:
498: Since each interesting square has at least two non-empty quarters,
499: there are at least $j+1$ non-empty quarters hung off the subpath
500: $p_{m-j},\cdots,p_m$. $Event(j)$ occurs only if one (with
501: probability $Pr_1$) or zero (with probability $Pr_0$) quarters
502: among these $\geq j+1$ quarters is still non-empty in $Q_{i+1}$.
503: Otherwise, the LCA of the two non-empty quarters in $Q_i$ will be
504: interesting in $Q_{i+1}$. So $Pr(j)\leq Pr_1+Pr_0\leq
505: \frac{j+1}{2^{j+1}}+\frac{1}{2^{j+1}}.$ (E.g., consider
506: $p_{m-j}=p_{0}$ in Fig.~\ref{Fig-skip-1}. Note that this is not a
507: tight upper bound.) The expected value of $j$ is then
508:
509: \begin{equation}
510: E(j)=\sum_1^m jPr(j)\leq\sum_1^m
511: j(\frac{j+1}{2^{j+1}}+\frac{1}{2^{j+1}}) =\frac{1}{2}\sum_1^m
512: \frac{j^2}{2^{j}}+\sum_1^m\frac{j}{2^{j}}\approx \frac{1}{2}\times
513: 6.0+2.0=5.0.
514: \end{equation}
515:
516: Consider an example that each $p_j$ has exact two non-empty
517: quarters, and the non-empty quarter of $p_j$ that does not contain
518: $p_{j+1}$ contains exact one point $x_j$. (For the two non-empty
519: quarters of $p_m$, we let each of them contain exact one point,
520: and choose any one as $x_m$.) $Event(j)$ happens iff $x_j$ is
521: selected to $S_{i+1}$ and another point among the rest $m-j+1$
522: points contained in $p_j$ is also selected. So
523: $Pr(j)=\frac{1}{2}\cdot\frac{j+1}{2^{j+1}}$. (E.g., consider
524: $p_{m-j}=p_{1}$ in Fig.~\ref{Fig-skip-1}.) The expected value of
525: $j$ is then
526:
527: \begin{equation} E(j)=\sum_1^m jPr(j)=\frac{1}{4}(\sum_1^m
528: \frac{j^2}{2^{j}}+\sum_1^m\frac{j}{2^{j}})\approx
529: \frac{1}{4}(6.0+2.0)=2.0.
530: \end{equation}
531:
532: Therefore in the worst case, the expectation of $j$ is between 2
533: and 5. (See the appendix for out computation of the progressions in (1) and
534: (2).)
535: \end{proof}
536:
537: To insert a point $x$ into the structure, we perform the above
538: point location search which finds $p_{i,end}$ within all the
539: $Q_i$'s, flip coins to find out which $S_i$'s $x$ belongs to, then
540: for each $S_i$ containing $x$, insert $x$ into $p_{i,end}$ in
541: $Q_i$ as described in Section~\ref{compressed}. Note that by
542: flipping coins we may create one or more new non-empty subsets
543: $S_{l+1},\cdots$ which contains only $x$, and we shall
544: consequently create the new compressed quadtrees $Q_{l+1},\cdots$
545: containing only $x$ and add them into our data structure. Deleting
546: a point $x$ is similar. We do a search first to find $p_{i,end}$
547: in all $Q_i$'s. Then for each $Q_i$ that contains $x$, delete $x$
548: from $p_{i,end}$ in $Q_i$ as described in
549: Section~\ref{compressed}, and remove $Q_i$ from our data structure
550: if $Q_i$ becomes empty.
551:
552: {\theorem Searching, inserting or deleting
553: any point in a randomized $d$-dimensional
554: skip quadtree of $n$ points takes expected $O(\log n)$ time.}
555:
556: \begin{proof} The expected number of non-empty subsets is obviously
557: $O(\log n)$. Therefore by Lemma~\ref{25}, the expected searching
558: time for any point is $O(1)$ per level, or $O(\log n)$ overall.
559: For any point to be inserted or
560: deleted, the expected number of non-empty subsets containing this
561: point is obviously $O(1)$. Therefore the searching time dominates
562: the time of insertion and deletion.
563: \end{proof}
564:
565: In addition, note that the expected space usage for a skip quadtree
566: is $O(n)$, since the expected size of the compressed quadtrees in the
567: levels of the skip quadtree forms a geometrically decreasing sum that
568: is $O(n)$.
569:
570: \section{The Deterministic Skip Quadtree}\label{deterministic}
571:
572: In the deterministic version of the skip quadtree data structure,
573: we again maintain a sequence of subsets $S_i$ of the input points
574: $S$ with $S_0=S$ and build a compressed quadtree $Q_i$ for each
575: $S_i$. However, in the deterministic case,
576: we make each $Q_i$ an ordered tree and sample $S_i$
577: from $S_{i-1}$ in a different way. We can order the $2^d$ quarters
578: of each $d$-dimensional square (e.g., by the I, II, III, IV quadrants in $\R^2$
579: as in Fig.~\ref{Fig-skip-0} or by the
580: lexical order of the $d$-dimensional coordinates in high dimensions), and call
581: a compressed quadtree obeying such order an \emph{ordered
582: compressed quadtree}. Then we build an ordered compressed quadtree
583: $Q_0$ for $S_0=S$ and let $L_0=L$ be the ordered list of $S_0$ in
584: $Q_0$ from left to right. Then we make a skip list $\mathcal{L}$
585: for $L$ with $L_i$ being the $i$-th level of the skip list. Let
586: $S_i$ be the subset of $S$ that corresponds to the $i$-th level
587: $L_i$ of $\mathcal{L}$, and build an ordered compressed quadtree
588: $Q_i$ for each $S_i$. Let $x_i$ be the copy of $x$ at level $i$ in
589: $\mathcal{L}$ and $p_i(x)$ be the smallest interesting square in
590: $Q_i$ that contains $x$. Then, in addition to the pointers in
591: Sec.~\ref{randomized}, we put a bi-directed pointer between $x_i$
592: and $p_i(x)$ for each $x\in S$. (See Fig.~\ref{Fig-skip-2}.)
593:
594: \begin{figure}[hbt]
595: \vspace*{-10pt}
596: \begin{center}
597: \includegraphics[scale=0.6]{Fig-skip-2}
598: \end{center}
599: \vspace*{-10pt} \caption{A deterministic skip quadtree guided by a
600: deterministic 1-2-3 skip list.}\label{Fig-skip-2}
601: \end{figure}
602:
603: {\lemma The order of $S_i$ in $Q_i$ is $L_i$.}
604:
605: \begin{proof}
606: Noting that an interesting square in $Q_i$ is also an interesting
607: square in $Q_{i-1}$, the LCA of two points $x$ and $y$ in $Q_i$ is
608: also a CA of them in $Q_{i-1}$. Therefore the order of $S_i$ in
609: $Q_i$ is a subsequence of the order of $S_{i-1}$ in $Q_{i-1}$. By
610: induction, the order of $S_i$ in $Q_i$ is $L_i$, given that the
611: order of $S_0$ in $Q_0$ is $L_0$. \end{proof}
612:
613: The skip list $\mathcal{L}$ is implemented as a deterministic
614: 1-2-3 skip list in~\cite{Munro&PS02}, which maintains the property
615: that between any two adjacent columns at level $i$ there are 1, 2
616: or 3 columns of height $i-1$ (Fig.~\ref{Fig-skip-2}). There are
617: $O(\log n)$ levels of the 1-2-3 skip list, so searching takes
618: $O(\log n)$ time. Insertion and deletion can be done by a search
619: plus $O(1)$ promotions or demotions at each level along the
620: searching path.
621:
622: We also binarize $Q_0$ by adding $d-1$ levels of dummy nodes, one
623: level per dimension, between each interesting square and its $2^d$
624: quarters. Then we independently maintain a total order (the
625: in-order in the binary $Q_0$) for the set of interesting squares,
626: dummy nodes and points in $Q_0$. The order is maintained as
627: in~\cite{D&Sleator87order} which supports the following
628: operations: 1) insert $x$ before or after some $y$; 2) delete $x$;
629: and 3) compare the order of two arbitrary $x$ and $y$. All
630: operations can be done in deterministic worst case constant time.
631: These operations give a total order out from a linked list, which
632: is necessary for us to search in $\mathcal{L}$. Because of the
633: binarization of $Q_0$ and the inclusion of all internal nodes of
634: the binarized $Q_0$ in our total order,
635: when we insert a point $x$ into $Q_0$, we get a $y$ (parent of $x$
636: in the binary tree) before or after the insertion point of $x$, so that
637: we can accordingly insert $x$ into our total order.
638:
639: \ifFull
640: \subsection{Search, Insertion, and Deletion in a Deterministic Skip Quadtree}
641:
642: Searching for the location of a point in a deterministic
643: skip quadtree structure is
644: as in a randomized skip quadtree. However the running
645: time in the deterministic version is as following.
646:
647: {\lemma\label{67} The number of searching steps to allocate a
648: point within any individual $Q_i$ is constant in a deterministic skip
649: quadtree.}
650:
651: \begin{proof}
652: Suppose the searching sequence (of interesting squares) in $Q_i$
653: is $p_0, p_1, \cdots, p_m$ with $p_0=p_{i,start}$ and
654: $p_m=p_{i,end}$. Since each interesting square has at least two
655: non-empty quarters, there are at least $m+1$ non-empty quarters
656: hung off the path $p_1, \cdots, p_m$. The points contained in
657: these quarters form a consecutive segment in $L_i$, with
658: furthermore the points contained in each individual quarter being
659: consecutive. Since $p_1, \cdots, p_m$ are not interesting in
660: $Q_{i+1}$, at most one among these $\geq m+1$ quarters is still
661: non-empty in $Q_{i+1}$, otherwise the LCA of the two non-empty
662: quarters in $Q_i$ will be interesting in $Q_{i+1}$. Therefore
663: based on the 1-2-3 property of $\mathcal{L}$, there are at most 7
664: such non-empty quarters hung off the path $p_1, \cdots, p_m$ so
665: that $m\leq 6$.
666: \end{proof}
667:
668: To insert or delete a point $y$ into or from $S$, we first search
669: the quadtree structure to allocate $y$ in each $Q_i$. Then we
670: insert or delete $y$ in the binary $Q_0$ and update our total
671: order. Then we insert or delete $y$ in the skip list
672: $\mathcal{L}$, referring to the total order. After promoting or
673: demoting any point $x$ from $L_i$ to $L_{i+1}$ or $L_{i-1}$ during
674: the skip list insertion or deletion, we do accordingly an
675: insertion of $x$ in $Q_{i+1}$ or a deletion of $x$ in $Q_i$. (See
676: Fig.~\ref{Fig-skip-2insert}.)
677:
678:
679: \begin{figure}[hbt]
680: \vspace*{-10pt}
681: \begin{center}
682: \includegraphics[scale=0.6]{Fig-skip-2insert}
683: \end{center}
684: \vspace*{-10pt} \caption{The insertion of $x$ in the deterministic
685: skip quadtree in Fig~\ref{Fig-skip-2}. Inserting $x$ causes the
686: promotions of $y$ and $z$ in $\mathcal{L}$, and consequently the
687: insertion of $y$ into $Q_1$ and the creation of a new compressed
688: quadtree $Q_2$ for $z$.}\label{Fig-skip-2insert}
689: \end{figure}
690:
691:
692: To delete $x$ from $Q_i$ we go from $x_i$ to the smallest
693: interesting square $p_i(x)$ containing $x$ in $Q_i$ following the
694: pointers. Then the deletion given $p_i(x)$ is as described in
695: Section~\ref{compressed}. To insert $x$ into $Q_{i+1}$ we go from
696: $x_i$ to $p_i(x)$ in $Q_i$, then traverse upwards in $Q_i$ until
697: we find the lowest ancestor $q$ of $x$ which is also interesting
698: in $Q_{i+1}$. (This is the reversed process of searching $x$ in
699: $Q_i$ with $q=p_{i,start}=p_{i+1,end}$ so it takes at most 6 steps
700: by Lemma~\ref{67}.) Then we go to the same square $q$ in $Q_{i+1}$
701: and insert $x$. The insertion of $x$ in $Q_{i+1}$ given $q$ is as
702: described in Section~\ref{compressed}. Also, as in
703: Section~\ref{randomized} we may create new $Q_i$ or remove empty
704: $Q_i$ during this procedure.
705: \else
706:
707: In the full version, we give details for insertion and deletion in a
708: deterministic skip quadtree (searching is the same as in the
709: randomized version), proving the following:
710: \fi
711:
712: {\theorem Search, insertion and deletion in a deterministic $d$-dimensional skip
713: quadtree of $n$ points take worst case $O(\log n)$ time.}
714:
715: Likewise, the space complexity of a deterministic skip quadtree is
716: $O(n)$.
717:
718: \section{Approximate Range Queries}
719: In this section, we describe how to use a skip quadtree to perform
720: approximate range queries, which are directed at reporting the
721: points in $S$ that belong to a query region (which can be an
722: arbitrary convex shape having $O(1)$ description complexity). For
723: simplicity of expression, however, we assume here that the query
724: region is a hyper-sphere. We describe in the full version how to
725: extend our approach to arbitrary convex ranges with constant
726: description complexity. We use $x,y$ for points in the data set
727: and $u,v$ for arbitrary points (locations) in $\R^d$. An
728: approximate range query with error $\epsilon>0$ is a triple
729: $(v,r,\epsilon)$ that reports all points $x$ with $d(v,x)\leq r$
730: but also some arbitrary points $y$ with $r<d(v,y)\leq
731: (1+\epsilon)r$. That is, the query region $R$ is a (hyper-) sphere
732: with center $v$ and radius $r$, and the permissible error range
733: $A$ is a (hyper-) annulus of thickness $\epsilon r$ around $R$.
734:
735: Suppose we have a space partition tree $T$ with depth $D_T$ where
736: each tree node is associated with a region in $\R^d$. Given a
737: query $(v,r,\epsilon)$ with region $R$ and annulus $A$, we call a
738: node $p\in T$ an \emph{in}, \emph{out}, or \emph{stabbing} node if
739: the $\R^d$ region associated with $p$ is contained in $R\cup A$,
740: has no intersection with $R$, or intersects both $R$ and
741: $\overline{R\cup A}$. Let $S$ be the set of stabbing nodes in $T$
742: whose child nodes are not stabbing. Then the query can be answered
743: in $O(|S|D_T+k)$ time, with $k$ being the output size. Previously
744: studied space partition trees, such as BBD
745: trees~\cite{am-annqf-93,am-ars-00,amnsw-oaann-98} and BAR
746: trees~\cite{d-bart-99,dgk-bartc-01}, have an upper-bound on $|S|$
747: of $O(\epsilon ^{1-d})$ and $D_T$ of $O(\log n)$, which is
748: optimal~\cite{am-ars-00}. The ratio of the unit volume of $A$,
749: $(\epsilon r)^d$, to the lower bound of volume of $A$ that is
750: covered by any stabbing node is called the packing function
751: $\rho(n)$ of $T$, and is often used to bound $|S|$. A constant
752: $\rho(n)$ immediately results in the optimal $|S|=O(\epsilon
753: ^{1-d})$ for convex query regions, in which case the total volume
754: of $A$ is $O(\epsilon r^d)$.
755:
756: Next we'll show that a skip quadtree data structure answers an
757: approximate range query in $O(\epsilon ^{1-d}\log n+k)$ time. This
758: matches the previous results (e.g.,
759: in~\cite{d-bart-99,dgk-bartc-01}), but skip quadtrees are fully
760: dynamic and significantly simpler than BBD trees and BAR trees.
761:
762: \subsection{Query Algorithm and Analysis}
763: Given a skip quadtree $Q_0,Q_1,\cdots,Q_l$ and an approximate
764: range query $(v,r,\epsilon)$ with region $R$ and annulus $A$, we
765: define a \emph{critical square} $p\in Q_i$ as a stabbing node of
766: $Q_i$ whose child nodes are either not stabbing, or still stabbing
767: but cover less volume of $R$ than $p$ does. If we know the set
768: $C=C_0$ of critical squares in $Q_0$, then we can answer the query
769: by simply reporting, for each $p\in C$, the points inside every
770: in-node child square of $p$ in $Q_0$. We now show that the size of
771: $C$ is $O(\epsilon ^{1-d})$ (due to the obvious constant $\rho$ of
772: quadtrees).
773:
774: {\lemma The number of critical squares in $Q_0$ is $O(\epsilon
775: ^{1-d})$.\label{pack}}
776:
777: \begin{proof} Consider the inclusion tree $T$ for the critical
778: squares in $C$ (that is, square $p$ is an ancestor of square $q$
779: in $T$ iff $p\supseteq q$ ). We call a critical square a branching
780: node if it has at least two children in $T$, or a non-branching
781: node otherwise. A non-branching node either is a leaf of $T$, or
782: covers more volume of $R$ than its only child node in $T$ does, by
783: the definition of critical squares. Note that if two quadtree
784: squares cover different areas (not necessarily disjoint) of $R$,
785: then they must cover different areas of $A$. Therefore for each
786: non-branching node $p\in T$, there is a unique area of $A$ covered
787: by $p$ but not by any other non-branching nodes of $T$. The volume
788: of this area is clearly $\Omega(1)$ of the unit volume $(\epsilon
789: r)^d$ since $p$ is a hypercube. Thus the total number of
790: non-branching nodes in $T$ is $O(\epsilon ^{1-d})$ since the total
791: volume of $A$ is $O(\epsilon r^d)$. So $|C|=|T|$ is also
792: $O(\epsilon ^{1-d})$.
793: \end{proof}
794:
795: Next we complete our approximate range query algorithm by showing
796: how to find all critical squares in each $Q_i$. The critical
797: squares in $Q_i$ actually partition the stabbing nodes of $Q_i$
798: into equivalence classes such that the stabbing nodes in the same
799: class cover the same area of $R$ and $A$. Each class corresponds
800: to a path (could be a single node) in $Q_i$ with the tail (lowest)
801: being a critical square and the head (if not the root of $Q_i$)
802: being the child of a critical square. For each such path we
803: color the head red and the tail green (a node could be double
804: colored). The set of green nodes (critical squares) is $C_i$.
805:
806: Assume we have the above coloring done in $Q_{i+1}$. We copy the
807: colors to $Q_i$ and call the corresponding nodes $p\in Q_i$
808: \emph{initially green} or \emph{initially red} accordingly. Then
809: from each initially green node we DFS search down the subtree of
810: $Q_i$ for critical squares. In addition to turning back at each
811: stabbing node with no stabbing child, we also turning back at each
812: initially red node. During the search, we color (newly) green or
813: red to the nodes we find according to how the colors are defined
814: above. After we've done the search from all initially green nodes,
815: we erase the initial colors and keep only the new ones.
816:
817: {\lemma The above algorithm correctly finds the set $C_i$ of all
818: critical squares in $Q_i$ in $O(|C_{i+1}|)$ time, so that finds
819: $C=C_0$ in $O(|C|\log n)$ time, which is the expected running time
820: for randomized skip quadtrees or the worst case running time for
821: deterministic skip quadtrees.\label{T}}
822: % =======
823: % colored) and link them with a pointer. Therefore we can skip the
824: % intermediate nodes on each path, which are non-critical stabbing
825: % squares, and get the inclusion tree $T_i$ of the critical squares
826: % of $Q_i$.
827: %
828: % Assume we have the above coloring and linking done in $Q_{i+1}$.
829: % We copy them to $Q_i$ and call a node $p\in Q_i$ \emph{initially
830: % green} or \emph{initially red} accordingly. Then from each
831: % initially green node we DFS search down the subtree of $Q_i$ for
832: % critical squares. In addition to turning back at each stabbing
833: % node with no stabbing child, we also turning back at each initial
834: % red node. During the search we color (newly) green or red as above
835: % defined. After we've done this search and coloring for all initial
836: % green nodes, we erase the initial colors and links and get $T_i$
837: % by the new colors. (The links between red and green nodes can be
838: % easily made based on the initial links during the searching
839: % process. We omit the details.)
840: %
841: % {\lemma The above algorithm correctly finds all critical squares in
842: % each $Q_i$ and builds $T_i$ in $O(|T_{i+1}|)$ time, so that $T_0$
843: % can be built in $O(T_0)\log n$ time, which is the expected running
844: % time for randomized skip quadtrees or the worst case running time
845: % for deterministic skip quadtrees.\label{T}}
846: %% >>>>>>> 1.6
847:
848: \begin{proof}
849: Correctness. If a stabbing node $p$ has its closest initial red
850: ancestor $p'$ lower than its closest initial green ancestor $p''$,
851: then it will be missed since when searching from $p''$, $p$ will
852: be blocked by $p'$. Let $p'$ and $p''$ be a pair of initially red
853: and green nodes which correspond to the head and tail of a path of
854: equivalent stabbing squares in $Q_{i+1}$, and $p$ be a stabbing
855: square in $Q_i$ that is a descendant of $p'$. Note that, if $p$
856: covers less area of $R$ than $p'$ and $p''$ do, then $p$ is also a
857: descendant of $p''$; otherwise if $p$ covers the same area of $R$
858: as $p'$ and $p''$ do but $p$ is not a descendant of $p''$, then
859: $p$ is not critical because $p''$ is now contained in $p$.
860: Therefore we won't miss any critical squares.
861:
862: Running time.
863: \ifFull By the same arguments as in Lemma~\ref{25}
864: and \ref{67},
865: \else By the same arguments as in Lemma~\ref{25},
866: \fi
867: the DFS search downward each initially green node $p$ has
868: constant depth, because within constant steps we'll meet a square
869: $q$ which is a child node of $p$ in $Q_{i+1}$. $q$ is either not
870: stabbing or colored initially red so we'll go back.
871: \end{proof}
872:
873: Following Lemma~\ref{pack},\ref{T} and the algorithm description,
874: we immediately get
875:
876: {\theorem We can answer an approximate range query
877: $(v,r,\epsilon)$ in $O(\epsilon ^{1-d}\log n+k)$ time with $k$
878: being the output size, which is the expected running time for
879: randomized skip quadtrees or the worst case running time for
880: deterministic skip quadtrees.}
881:
882: {\footnotesize
883: \bibliographystyle{abbrv}
884: \bibliography{skip,extra,geom}
885: }
886: %----------
887: % source files for extra.bib and geom.bib are in ~goodrich/lib/bibtex
888: %----------
889:
890: \clearpage
891: \begin{appendix}
892: \section{Appendix}
893: If $f(x)\geq 0$ is a monotone decreasing function for $x\geq i$,
894: then the progression of $f(x)$ can be approximated by its integral
895: as following:
896: $$\sum_{x=1}^{i-1}f(x)+\int_{x=i}^{\infty}f(x)dx\leq
897: \sum_{x=1}^{\infty}f(x)\leq
898: \sum_{x=1}^{i}f(x)+\int_{x=i}^{\infty}f(x)dx.$$ By
899:
900: $$\int_{x=i}^{\infty}\frac{x^2}{2^x}dx=\frac{1}{2^x\ln^{3}2}[(\ln2\cdot x)^2+2\ln2\cdot
901: x+2]\mid_{x=i}$$ and
902:
903: $$\int_{x=i}^{\infty}\frac{x}{2^x}dx=\frac{1}{2^x\ln^{2}2}(\ln2\cdot
904: x+1)\mid_{x=i}$$ we get (taking $i=12$)
905: $$\sum_{1}^{\infty}\frac{x^2}{2^{x}}\leq 6.01$$ and (taking
906: $i=10$)
907: $$\sum_{1}^{\infty}\frac{x}{2^{x}}\leq 2.005.$$
908:
909: %\section{Figures}
910: %Fig.~\ref{skip-0} shows the advantage of a compressed quadtree.
911: %Fig.~\ref{skip-1} shows the data structure of a randomized skip
912: %quadtree. Fig.~\ref{skip-1tree} is the tree-pointer presentation
913: %of Fig.~\ref{skip-1}, where the quarters of a square are ordered
914: %by the I, II, III, IV quadrants (though it's not necessary to have
915: %any order in our random case). It also demonstrates the searching
916: %path of a point. The longest path in Fig.~\ref{skip-1tree} will be
917: %used as a demo in the proofs of Lemma~\ref{25} and Lemma~\ref{67}.
918: %Fig.~\ref{skip-2} shows the data structure of a deterministic skip
919: %quadtree, and Fig.~\ref{skip-3} demonstrates the process of
920: %inserting a point. The skip list in Fig.~\ref{skip-2} and
921: %Fig.~\ref{skip-3} is from an example in~\cite{Munro&PS02}.
922: %
923: %\begin{figure}[hbt]
924: %\begin{center}
925: %\includegraphics[scale=0.7]{Fig-skip-0}
926: %\end{center}
927: %\vspace*{-10pt} \caption{A quadtree containing 3 points (left) and
928: %its compressed quadtree (right). Below them are the pointer
929: %representations, where a square or an interesting square is
930: %represented by a square, a point by a solid circle and an empty
931: %quarter by a hollow circle. The 4 children of each square are
932: %ordered from left to right according to the I, II, III, IV
933: %quadrants.} \label{Fig-skip-0}
934: %\end{figure}
935: %
936: %\begin{figure}[hbt]
937: %\begin{center}
938: %\includegraphics[scale=0.7]{Fig-skip-1}
939: %\end{center}
940: %\vspace*{-10pt} \caption{A randomized skip quadtree consists of
941: %$Q_0$, $Q_1$ and $Q_2$. (Identical interesting squares in two
942: %adjacent compressed quadtrees are linked by a double-head arrow
943: %between the square centers.)}\label{Fig-skip-1}
944: %\end{figure}
945: %
946: %\begin{figure}[hbt]
947: %\begin{center}
948: %\includegraphics[scale=0.7]{Fig-skip-2}
949: %\end{center}
950: %\vspace*{-10pt} \caption{A deterministic skip quadtree guided by a
951: %1-2-3 skip list.}\label{Fig-skip-2}
952: %\end{figure}
953: %
954: %\begin{figure}[hbt]
955: %\begin{center}
956: %\includegraphics[scale=0.7]{Fig-skip-2insert}
957: %\end{center}
958: %\vspace*{-10pt} \caption{The insertion of $x$ in the deterministic
959: %skip quadtree in Fig~\ref{Fig-skip-2}. Inserting $x$ causes the
960: %promotions of $y$ and $z$ in $\mathcal{L}$, and consequently the
961: %insertion of $y$ into $Q_1$ and the creation of a new compressed
962: %quadtree $Q_2$ for $z$.}\label{Fig-skip-2insert}
963: %\end{figure}
964:
965: \end{appendix}
966:
967:
968: \end{document}
969: