ResearchPDF Available

An Improved MX-CIF Quadtree for Reducing Time Cost of Query

Authors:
  • Hiroshima University of Economics, Japan

Abstract

When performing a search with MX-CIF quadtree, all the objects in the nodes which intersect a search-window will be taken as primary results, and then relations between the primary results and search-window are judged for an exact query. The amount of primary result is an important factor to affect time cost of query. This paper proposes an improved MX-CIF quadtree which reduces the time cost of query by decreasing primary results in number of objects. The time cost of tree-building and removal was slightly higher than the original MX-CIF quadtree. An update method which showed better performance than the original method is also proposed. We compared performance between MX-CIF quadtree and our structure in the ways of index, update, query, and memory usage by benchmark dataset. The result indicated that in average, our structure reduced 26.1% primary results, and the total time cost was reduced by 12.7%.
An Improved MX-CIF Quadtree for Reducing Time Cost of Query
Yusi Wei 1, a and Shojiro Tanaka 2, b
1 Information Systems Course, Interdisciplinary Graduate School of Science and Engineering
Shimane University, Japan
2 Information Systems Division, Interdisciplinary Graduate School of Science and Engineering
Shimane University, Japan
awayis@live.com, btanaka@cis.shimane-u.ac.jp
Keywords: Spatial data structure, Moving-object, Performance evaluation
Abstract. When performing a search with MX-CIF quadtree, all the objects in the nodes which
intersect a search-window will be taken as primary results, and then relations between the primary
results and search-window are judged for an exact query. The amount of primary result is an important
factor to affect time cost of query. This paper proposes an improved MX-CIF quadtree which reduces
the time cost of query by decreasing primary results in number of objects. The time cost of tree-
building and removal was slightly higher than the original MX-CIF quadtree. An update method
which showed better performance than the original method is also proposed. We compared
performance between MX-CIF quadtree and our structure in the ways of index, update, query, and
memory usage by benchmark dataset. The result indicated that in average, our structure reduced 26.1%
primary results, and the total time cost was reduced by 12.7%.
Introduction
MX-CIF quadtree is a data structure which applies to graphic [1] and spatial indexing [2]. It provides
efficient insertion and deletion, and the time complexity of both of them is, where d represents
the depth of tree. A query will be finished in  in the worst case, that is, when a search-window
overlaps the area of root totally. For accelerating query, objects are indexed by the position of their
Minimum Bounding Rectangles (MBRs). An MBR is created by the maximum and minimum x and
y coordinates of an object. An object and its MBR will be inserted into the quadtree’s node when its
MBR overlaps the node’s x or y axis. When launching a query, all the objects will be taken from the
nodes which intersect a search-window as primary results to have a precise inspection, that is, to
judge if those primary results overlap search-window exactly. The number of objects in primary result
is an important factor to affect the time cost of query. In this paper, we propose an improved MX-
CIF quadtree which reduces the time cost of query by decreasing primary results. The cost of tree-
building and removal time was only slightly higher than the original MX-CIF quadtree.
MX-CIF quadtree
In an MX-CIF quadtree, the region of every node is one of the four quadrants of the parent node [3].
Consider the area of an MX-CIF quadtree as a two-dimensional square space, the space is being
decomposed into four sub-squares with equal area recursively. Subdivision stops in two situations:
1. There are no more objects contained in a node. 2. Depth of the tree gets to a predetermined value.
Being different from other variants of quadtree, in an MX-CIF quadtree, more than one object can
be associated with both of leaf node and non-leaf node. Moreover, an MBR should be associated with
only one node. Once an MBR is associated with a node, term the node N, then the MBR will never
be split to any sub-nodes of N. There are two ways to arrange the objects in a node [3]. One way is to
create two binary trees for indexing the MBRs cross x and y axis respectively. The other way is to
insert the objects into a list of this node directly. We use the secondary way to arrange objects in this
paper. The planar partition and structure is given by Fig. 1. Four objects are indexed with MX-CIF
quadtree, A and B belong to the root, C belongs to node 2, that is, the northwestern sub-node of the
root, and D belongs to node 22. An object should be inserted to the first node which its x or y axis
intersects the object’s MBR. So although A overlaps both of the axes of the root and the root’s
northwestern sub-node, it is still associated with the root only. When making query to MX-CIF
quadtree, the objects in the nodes which intersect the search-window will be taken as an approximate
result and reported to a secondary query for an exact judgment. According to the usage of MX-CIF
quadtree, assume D in Fig. 1 as a search-window to launch an overlap query, because of both of the
root and its northwestern sub-node intersect D, the primary results should include object A, B and C.
And then, A, B and C will be reported to have an exact comparison with the search-window.
Improved MX-CIF quadtree
Region-MBR. In the example mentioned before, object A and B do not overlap the search-window,
but they still be taken as a primary query result. This will lay a burden on the next exact query, because
the more the objects reported to the exact query; the more the time will be used to finish it. For
decreasing objects in the primary query result, we use a rectangle to present the minimum bounding
of all the objects in the same node, termed Region-MBR. It is created by the maximum x and y
coordinate, and the minimum x and y coordinate of all the objects in a node. Fig. 2 shows the Region-
MBR of the root and node 2 of the example mentioned before. Because there is only one object in
node 2, so the Region-MBR of node 2 is equal to the MBR of C. Comparing to the border of node,
Region-MBR provides a more precise frame for judging relations between object and search-window.
Usage of Region-MBR is described as follows, when making a query with a search-window, only if
there are any node’s Region-MBR interests a search-window, then all the objects of this node can be
taken as primary results. Appling this rule to the example mentioned before, the primary result will
be C only. Because D does not intersect the Region-MBR of root, so the objects in the root, that is, A
and B, should not be included.
Insertion. The Region-MBR is added to a node as a new property besides others like level, border,
center and so on. Based on insertion procedure of original MX-CIF quadtree, every time when insert
an object to a node, the object’s MBR should be compared with the node’s Region-MBR, enlarging
the Region-MBR to include the MBR completely if it does not. The insertion algorithm is listed as
below.
Algorithm Insert (Node node, Object O)
if (O.MBR intersects x axis or y axis of node) then
Insert O to node;
Enlarge_RegionMBR (node, O);
else
for each non-null sub-node of node do
if (sub-node contains O.MBR) then Insert (node.subnode, O); end if;
end for;
end if;
(a) (b)
Fig. 1. The planar partition (a) and structure (b) of an MX-
CIF quadtree.
Fig. 2. The Region-MBR
(dash line) of the root and
node 2.
Algorithm Enlarge_RegionMBR (Node N, Object O)
Rectangle R = N.RegionMBR;
Rectangle M = O.MBR;
if M.minX < R.minX then R.minX = M.minX; end if;
if M.minY < R.minY then R.minY = M.minY; end if;
if M.maxX > R.maxX then R.maxX = M.maxX; end if;
if M.maxY > R.maxY then R.maxY = M.maxY; end if;
Query. To report the objects that probably intersect a search-window is achieved by traversing the
improved MX-CIF quadtree, the objects of the nodes which their Region-MBRs intersect search-
window should be taken as a primary result. The query algorithm is listed as follows,
Algorithm query (Node node, Rectangle searchwindow)
if (node.RegionMBR intersects searchwindow) then Take all objects in node as a primary result;
for each not null sub-node of node do
if(sub-node intersects searchwindow) then query (node.subnode, searchwindow);
end if;
end for;
end if;
Deletion. Like the processing of insertion, to delete an object, say O, first to locate Os position by
traversing the tree with the MBR of O. Once found the node which its x or y axis intersects the MBR
of O, remove O from it. Different from original MX-CIF quadtree, if the MBR of the deleted object
touches any border of the node’s Region-MBR, for making the Region-MBR still represent the exact
border of all objects in this node, the Region-MBR should be recalculated by traversing every object
in the node.
Algorithm Delete (Node node, Object O)
if (O.MBR intersects x axis or y axis of node) then Delete O from node; Shrink (node, O.MBR);
else
for each non-null sub-node of node do
if (sub-node contains O.MBR) then Delete (node.subnode, O); end if;
end for;
end if;
Algorithm Shrink (Node node, Rectangle deleted_object)
if (node.RegionMBR.maxX == deleted_object.maxX) or
(node.RegionMBR.maxY == deleted_object.maxY) or
(node.RegionMBR.minX == deleted_object.minX) or
(node.RegionMBR.minY == deleted_object.minY) then
for each object in node do Enlarge_RegionMBR(node, object); end for;
end if;
Update. Updating is used to renew the position of an indexed object, generally achieved by deleting
the old object and then insert a new object. In the processing of deletion and insertion, sometimes
there are some nodes are visited by both of the two processing. To avoid the nodes which are visited
repeatedly will reduce the time cost of update. Here we propose a new update method that would
reduce the time cost by avoiding visit nodes redundantly. When update an object, after deletion of the
old object from a node, first to check if the node contains the object about to insert, that is, the nodes
border encloses the new object completely. If so, that means the node or one of its sub-nodes should
contains the new object, traverse the tree from this node to its leaf nodes to find such a node.
Otherwise, find the node contains the new object from root. If a node contains the object will be
deleted, and one of its sub-nodes or the node itself contains the object will be inserted, in this situation,
this method can avoid revisiting the nodes above the node repeatedly. The algorithm of update an
object is shown below, it uses a special deletion method which will not shrink the Region-MBR
immediately after removal of an object. Because of the objects that about to remove and insert are in
the same node sometimes. For avoiding recalculation of the same Region-MBR, the processing of
shrink Region-MBR is postponed until after insertion is finished. The algorithm of update is listed as
follows,
Algorithm Update (Node root, Object remove, Object insert)
Node returnNode = DeleteWithoutShrink(root, remove);
if (returnNode == null) then Insert (root, insert);
else
if (returnNode contains insert) then Insert (returnNode, insert);
else Insert (root, insert);
end if;
Shrink (returnNode, remove.MBR);
end if;
Algorithm DeleteWithoutShrink (Node node, Object O)
if (O.MBR intersects x axis or y axis of node) then Delete O from node; return node;
else
for each non-null sub-node of node do
if (node.subnode intersects O.MBR) then DeleteWithoutShrink (node.subnode, O);
end if;
end for;
end if;
return null;
Related works
Expanded MX-CIF quadtree [4] is a variant of MX-CIF quadtree. For each object, say O, which
crosses a node’s x or y axis, term the node as N, split N once that makes N has four equal sized sub-
nodes. This makes O contained by at least two of the sub-nodes of N. Check if all of the direct sub-
nodes of N are the minimum nodes contain each part of O. Once there is any part of O, say , is
contained by a direct sub-node of N, say , but not crossing the x or y axis of , split recursively
till one of the sub-nodes of is the minimum node which contains .
Multiple storage quad tree [5] sets a capacity for every node, a node will keep on being split until
the number of objects contained by this node reaches its capacity, it means an object could associate
to not only one node. During query period, for avoiding the same object be reported several times, an
object will be marked by the first time it is reported. All marked objects should not be reported again.
More recently, a new structure named RMX-quadtree is proposed by [6]. It provides efficient query
through index different levels of resolution of spatial data. It is achieved by merging the trees which
created for images have different resolutions into one tree. Moreover, to improve security and privacy,
RMX-quadtree is able to associate different data with different authorization.
Different from variants mentioned above, an improved MX-CIF quadtree does not split any object
to sub-nodes. The advantages are, 1. Avoid indexing redundancy. 2. Simple procedure of indexing
and query processing. 3. Controlled depth of tree.
QR-tree is proposed in [7], it uses quadtree as main structure and creates an R-tree for each sub-
node under the quadtrees root. That is, an object will be first located to a quadtree node, and then be
inserted into an R-tree in the node. QR-tree does not split object to sub-nodes, but it needs to maintain
two structures for each manipulation, so the time cost of insertion, deletion and query should be
increased comparing to MX-CIF quadtree. Moreover, in a case that a search-window overlaps a node,
but does not overlap the objects belongs to the node, it is wasting time to make query for the R-tree
in this node.
Improved MX-CIF quadtree should takes less time on insertion and tree building than expanded
MX-CIF quadtree, and multiple storage quad tree. In common, with the same dataset, the depth of
our structure as same as the original MX-CIF quadtree should be less than expanded MX-CIF
quadtree and the other variants, because they split object to sub-nodes, this will increase the depth of
a tree. Another shortcoming of splitting objects is that when making a query, some objects may be
reported as a result several times, it will reduce the efficiency of query. A solution is to marking the
object the first time it is reported, and then does not report the marked object again. All marked objects
have to be unmarked before the next query. Another solution proposed by [8] creates four lists in each
node for storing objects, depending on the position of the object lies in a node. When making a query,
decide the list the search-window belongs to, depending on the same rules of distributing objects.
And then examine all objects in the same list. Comparing to query methods mentioned above, our
structure uses at most only two judgments to finish a query in each node; most of the nodes only need
one judgment. Only if the search-window covers a node, a secondary judgment between search-
window and Region-MBR is necessary. Comparing to original MX-CIF quadtree, our structure
excites only one more judgment during query period. Because of our structure reduces objects in
primary result, the next exact query time is saved. Our structure takes less time cost on query than the
original MX-CIF quadtree, which will be verified in Section Result.
Experiments
A suit of tests with both of moving-object and static-object datasets will be introduced in this section.
We evaluated the performance of both of original MX-CIF quadtree and our structure based on JTS
Topology Suit. It is a viable open-source API of 2D spatial predicates and functions which include a
package for creating MX-CIF quadtree-based indexing. The package can be found:
http://www.vividsolutions.com/jts/download.htm. These tests use real and synthetic datasets. Three
datasets are included in the real and also static-object datasets part, “Administrative areas” (polygon),
“Inland water” (line) and “Roads” (line) of United States. They can be found: http://www.diva-
gis.org/gData. Synthetic and also moving-object datasets include 100,000 moving-points, 10,000
moving-rectangles and 27,146 moving-lines. Currently, each moving-object has 10 snapshots.
Relations include “distance, “containment” and “intersection” will be queried with three types of
object, point, line and polygon. The source code of this project including dataset and more detailed
results can be found: http://wei-yusi.appspot.com. In each small test, we pick a different type of
moving-object and a static-object dataset to index. Update every moving-object with its next position,
and then find the moving-objects which are overlapped by any static-object after each update. So
there are nine small tests are included in total.
Result
Among all the nine tests, comparing to original MX-CIF quadtree, in average, our structure causes
indexing time and update time rises by 7% and 19% respectively, but instead of the increased time
cost, query time reduces by 14%, and total time cost reduces by 12%. The comparison of indexing
time, update time, query time, primary query result, and total time cost between MX-CIF quadtree
and our structure are shown in Table 1. A more detailed result can be found: http://wei-
yusi.appspot.com/resource/resultof9tests.xlsx. The results are in average values of 5-time calculation.
CONCLUSION
This paper proposed a new structure which reduces the time cost of query by decreasing primary
query results. It is achieved by adding one more element into a node structure, termed Region-MBR,
which is used to present the minimum bounding of all the objects in the same node. Because that
Table 1. Time cost performance of our sturcture (compare to original MX-CIF quadtree).
Test
Item
3
5
6
7
8
Index time
+16%
+7%
+5%
+3%
+1%
Update time
+18%
+45%
+43%
+8%
+7%
Query time
-1%
-2%
-10%
-8%
-25%
Primary results
-15%
-24%
-25%
-28%
-17%
Total time
-1%
-2%
-10%
-8%
-14%
every time when inserting an object to a node, the node’s Region-MBR should be calculated again if
it is need to be enlarged to include the new object, the index time is increased. And when removing
an object, in a very rare situation that the MBR of the removed object touches any of the four sides
of the node’s Region-MBR, this Region-MBR have to be recalculated by traversing every object in
the node. So the time cost of updating an object is raised. We compared the performance between
original MX-CIF quadtree and our structure. The result indicates that, comparing to original MX-CIF
quadtree, our structure reduced by 26.1% objects from primary result in average, hence the time cost
of queries based on primary result was greatly saved. At the same time, indexing and update time was
increased by 7.2% and 19.1% respectively. But the total time cost was still reduced by 37% in the
best case, and reduced by 1% in the worst case. On the other hand, the Region-MBR is created by 2
pairs of coordinates, that is, four double-precision variables. Each double-precision variable takes 8
bytes. So the memory usage will increase 8*4 = 32 byte for each node. A memory usage comparison
can be found: http://wei-yusi.appspot.com. It is observed by “Task Manager” of windows. The MX-
CIF quadtree is used in extension fields such as network routing [2], [9], [10] and skyline queries
[11]. The improved MX-CIF quadtree will be able to manifest its ability in these fields, as well as
traditional uses in the graphic and spatial.
References
[1] Samet, H., Sorting in Space: Multidimensional, Spatial, and Metric Data Structures for Computer
Graphics Applications, ACM SIGGRAPH ASIA 2010 Courses (2010).
[2] Tanin, E., Harwood, A., Samet, H., Using a distributed quadtree index in peer-to-peer networks,
The VLDB Journal The International Journal on Very Large Data Bases, Vol.16, No.2 (2007)
165-178.
[3] Samet, H., Foundations of Multidimensional and Metric Data Structures., Morgan Kaufmann
(2006).
[4] Able, D. J., Some elemental operations on linear quadtrees for geographic information systems,
Computer Journal, Vol. 28, No. 1 (1985) 73-77.
[5] Brown, R. L., Multiple storage quad tree : a simpler faster alternative to bisector list quad trees,
IEEE Trans. Computer Aided Design , Vol. CAD-5 (1986) 413-419.
[6] Vijayalakshmi, A., Qi, G., Heechang, S., Jaideep, V., A unified index structure for efficient
enforcement of spatiotemporal authorisations, International Journal of Information and
Computer Security, Vol. 4, No.2 (2010) 118-151.
[7] Fu, Y.-C., Hu, Z.-Y., Guo, W., Zhou, D.-R., QR-Tree: A Hybrid Spatial Index Structure. In:
Proceedings of the Second International Conference on Machine Learning and Cybernetics,
Xi’an, November 2-5 (2003).
[8] Weyten, L., Pauw, D., Quad list quad trees: A geometrical data structure with improved
performance for large region queries. IEEE Transactions on Computer-Aided Design of
Integrated Circuits, 8 (1989) 229-233.
[9] Zuo, H., Jing, N., Deng, Y., Chen, L., CAN-QTree: A Distributed Spatial Index for Peer-to-Peer
Networks, Proceedings of the 2008 10th IEEE International Conference on High Performance
Computing and Communications (2008) 250-257.
[10] Ranjan, R., Buyya, R., Decentralized overlay for federation of Enterprise Clouds, Handbook of
Research of Scalable Computing Technologies, IGI Global USA (2009).
[11] Lin, X., Xu, J., Hu, H., Range-based Skyline Queries in MobileEnvironments, IEEE TKDE
(2011).
ResearchGate has not been able to resolve any citations for this publication.
Article
Full-text available
Peer-to-peer (P2P) networks have become a pow- erful means for online data exchange. Currently, users are primarily utilizing these networks to perform exact-match queries and retrieve complete files. However, future more data intensive applications, such as P2P auction networks, P2P job-search networks, P2P multiplayer games, will re- quire the capability to respond to more complex queries such as range queries involving numerous data types including those that have a spatial component. In this paper, a dis- tributed quadtree index that adapts the MX-CIF quadtree is described that enables more powerful accesses to data in P2P networks. This index has been implemented for various prototype P2P applications and results of experiments are presented. Our index is easy to use, scalable, and exhibits good load-balancing properties. Similar indices can be con- structed for various multidimensional data types with both spatial and non-spatial components.
Article
Skyline query processing for location-based services, which considers both spatial and nonspatial attributes of the objects being queried, has recently received increasing attention. Existing solutions focus on solving point- or line-based skyline queries, in which the query location is an exact location point or a line segment. However, due to privacy concerns and limited precision of localization devices, the input of a user location is often a spatial range. This paper studies a new problem of how to process such range-based skyline queries. Two novel algorithms are proposed: one is index-based (I-SKY) and the other is not based on any index (N-SKY). To handle frequent movements of the objects being queried, we also propose incremental versions of I-SKY and N-SKY, which avoid recomputing the query index and results from scratch. Additionally, we develop efficient solutions for probabilistic and continuous range-based skyline queries. Experimental results show that our proposed algorithms well outperform the baseline algorithm that adopts the existing line-based skyline solution. Moreover, the incremental versions of I-SKY and N-SKY save substantial computation cost, especially when the objects move frequently.
Article
Uncontrolled dissemination of geospatial data may have grave implications on national security and personal privacy. Geospatial data can be considered sensitive based on attributes such as the location, resolution and the time of capture, etc. As such, authorisations associated with this data also possess spatial and temporal attributes. The main contribution of this paper is to improve the response time of access requests, by proposing a unified index structure called *-tree that is capable of indexing both spatiotemporal objects and authorisations in a single index structure. *-tree is an extension of R-tree that indexes objects based on their resolutions as well as on their spatial and temporal attributes and overlays spatiotemporal authorisations on the nodes of the tree. We show how the *-tree can be constructed and maintained, provide algorithms to process access requests and present performance evaluation results that demonstrate a significant improvement in performance.
Article
The representation of spatial data is an important issue in game programming, computer graphics, visualization, solid modeling, and related areas including computer vision and geographic information systems (GIS). Many representations are currently used. Recently, there has been much interest in hierarchical representations such as quadtrees, octrees, and pyramids which are based on image hierarchies, as well methods that use bounding boxes which are based on object hierarchies. The key advantage of these representations is that they provide a way to index into space. In fact, they are little more than multidimensional sorts. They are compact and depending on the nature of the spatial data they save space as well as time and also facilitate operations such as search. This course provides a brief overview of hierarchical spatial data structures and related algorithms that make use of them. We describe hierarchical representations of points, lines, collections of small rectangles, regions, surfaces, and volumes. For region data, we point out the dimension-reduction property of the region quadtree and octree, as how to navigate between nodes in the same tree, thereby leading to the popularity of these representations in ray tracing applications. We also demonstrate how to use these representations for both raster and vector data. In the case of nonregion data, we show how these data structures can be used to compute nearest objects in an incremental fashion so that the number of objects need not be known in advance. We also review a number of different tessellations and show why hierarchical decomposition into squares instead of triangles or hexagons is preferred. In addition a demonstration of the SAND spatial browser based on the SAND spatial database system and of the VASCO JAVA applet illustrating these methods (found at http://www.cs.umd.edu/~hjs/quadtree/index.html) will be presented.
Conference Paper
We present a distributed spatial index called CANQTree based on a content-addressable network (CAN) and QuadTree-alike structures. In our system, both spatial objects and their corresponding nodes in a QuadTree are identified by some points and mapped into CAN zones of peers. For a given spatial range query, CAN-QTree can provide O(n1/2) search performance. With a uniform distribution of spatial objects, given epsiv > 0, CAN-QTree can provably maintain a load imbalance of at most 2+epsiv between a highest loaded peer and a lightest loaded peer. Simulations show that our CAN-QTree is an effective spatial index with a guarantee of good load-balancing.
Article
Quadtrees appear attractive as an alternative to fixed-cell-size representations for areal entities in geographic information systems. This paper considers some aspects of use of linear quadtrees in such applications. Compaction (reduction of a quadtree to its maximal leaves) is desirable to minimise space requirements and to simplify some basic operations. An algorithm for compaction as an adjunct to quadtree-generating processes is presented, with analysis showing it to be linear with the sizes of the input and compacted quadtrees. Some simple forms of set operations are also described.
Conference Paper
In this paper, we present a quick speed spatial indexing structure, which is based on quadtree and R-tree. We name it QR-tree. The research indicates although QR-tree always demands more storage space than R-tree, it gains better performance in insertion, deletion, and especially searching. It also shows that the more amounts of spatial data is, the closer the storage cost of QR-tree and R-tree are and the better performance QR-tree has. In other word, for very large spatial database, QR-tree possesses more superiority than R-tree.
Article
A bisector list quad tree is a quad tree which stores objects intersecting more than one quad on horizontal and vertical bisector lists. This is the form of quad tree originally proposed by Kedem for organizing boxes and polygons in a plane so that one can quickly find the objects intersecting an arbitrary window. A multiple storage quad tree is a quad tree which stores pointers to objects intersecting more than one quad in all of the quads that they intersect. This paper describes and analyzes multiple storage quad trees. It is shown that multiple storage quad trees can be efficient in storage space, often using less than 25 percent more space than a simple list of the objects. That is, the tree nodes and other pointers combined often use less than 25 percent of the space needed to store the object descriptions. It is also shown that using multiple-storage quad trees makes possible very rapid searches for the objects intersecting a small window. In most cases fewer than 10 nodes must be examined per object found in the window. Finally, multiple storage quad trees and the algorithms which operate on them are found to be very simple and intuitive.
Article
A data structure is presented for the storage of graphical information. It is a modified multiple storage quad tree, with four lists in each leaf quad. A substantial improvement is obtained for region queries, in particular on large windows, and for tree traversal. On the other hand, only an insignificant increase of memory requirement is noticed in particular situations. The method is not complicated, so it can easily be programmed