It is shown how to enhance any data structure in the pointer model to make it confluently persistent, with efficient query and update times and limited space overhead. Updates are performed in O(log n) amortized time, and following a pointer takes O(log c log n) time where c is the in-degree of a node in the data structure. In particular, this proves that confluent persistence can be achieved at a logarithmic cost in the bounded in-degree model used widely in previous work. This is a O(n/ log n)-factor improvement over the previous known transform to make a data structure confluently persistent.
IntroductionPersistence. Abstractly, a data structure is some collection of data that supports various operations to be performed upon it. These operations can be partitioned into two groups: query operations, that do not modify the structure, and updates that do modify the structure. Classically, operations are performed on the current state of the structure, and in the case of an update, the current state is changed, and the past state is lost.Persistence is the concept, first formally studied in [7], of allowing the efficient execution of operations not just on the current state, but on past states as well. The past states are referred to as versions of the structure. There are three forms of persistence, which we discuss in increasing order of power and complexity.The simplest kind, partial persistence, is where one can execute query operations on any previous version of the structure, but where updates are only allowed on the current version. This implies that the versions form a list (or timeline), each version being derived from the latest (or most recent) version in the list.In full persistence, update and query operations may be performed on any version of the data structure that ever existed. In the case of an update on a past version, a new version is created, derived from that past version. While in the classic sense, and in partial persistence, time takes on its normal linear structure, in full persistence, time as viewed by the data structure no longer has a Applications of persistence. Persistence is a very useful tool, with applications ranging from algorithm design to code debugging. We list some of these here.From a theoretical point of view, persistence has played a major role in the development of efficient algorithms. For instance, the best algorithms for planar point location [14] and rayshooting [10] use persistence.A widely-used technique in computational geometry consists in performing a sweep with a vertical line through a data set (set of points, set of segments, line arrangement, map, data structure...), and storing in a data structure the set of items intersected by the line. As we sweep, we update the data structure to accurately represent the objects intersected by the sweep line. If the data structure is made persistent, one can then retrieve all the information that has been swept through, by going back to previous versions. For instance, this can be used to solve optimally the segment int...