1 / 21

Point location and Persistent Data structures

Point location and Persistent Data structures. First problem. Given a subdivision of the plane into triangles, create a data structure, such that given a query point, we can find in which triangle it lies. 1. 4. 2. 5. 3. 9. 6. 8. 7. Too hard ;-(. q. q. q.

johnvargas
Download Presentation

Point location and Persistent Data structures

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Point location and Persistent Data structures

  2. First problem • Given a subdivision of the plane into triangles, create a data structure, such that given a query point, we can find in which triangle it lies. 1 4 2 5 3 9 6 8 7 Too hard ;-(

  3. q q q A question that we would solve… • A simpler problem Given a set of horizontal segments, create a data structure, so that given a query point q, we can answer quickly which segment is vertically above the query point 2 1 3 Answer:1 4 5 Answer:3 6 7 Answer:6

  4. A really really really easy question… • Same question, but for a set of horizontal segments, all having the same x-coordinates. (4,20) (18,20) (4,16) (18,16) Answer: 16 (18,13) (4,13) (4,7) (18,7) For simplicity, we use the y-coordinate of a segment as the "name" of the segment

  5. Solution: Skip list Solution: Store the y-coordinates of the segments in a SkipList. Once a query point (x,y) is given, perform succ(y) (4,20) (18,20) (4,16) (18,16) (10,14) Answer: 16 (18,13) (4,13) (4,7) (18,7) MIN 7 13 16 20 MAX

  6. Different question • In a city, people are born, and die. • Each person is recognized by its height (no two people have the same height). We denote height by the letter y, and (birth/death) date by x. • Need a DS that would find Find(x,y) - who was the person that was alive at date x, and her/his height is y (or if not exists), larger and as close as possible to y. 2 Height y=6'2 q 3 4 5 y-axis 6 Born date x1=1/1/1900 Death date x2=10/2/1998 x-axis

  7. Top 2 -1 21 37 37 37 Different problem How to delete an element from the skipList, without destroying it? Assume we want to delete(71) Idea #1: Copy the whole SkipList, and delete - too much memory Idea #2: Copy the path that changes during the deletion, then modify this path. Top 37 1 - -1 Level 3 21 1 7 37 71 -1 Level 2 21 7 14 21 32 37 71 85 117 1 -1 Level 1

  8. Virtually copying SL • To create the new virtual copy: • Start from TOP of the old SL, create a new top, named Top2 • Do find(x)/* x is the key to be deleted */ • Copy and connect every element along the search path. • Delete x from the SL pointed to by Top2/*it does not affect the SL pointed to by Top1 - only blue pointers change*/ • Need to be a bit careful in the deletion (next slide) Top1 Top 2 -1 21 37 37 1 - -1 Level 3 21 37 1 7 37 71 -1 Level 2 21 7 14 21 32 37 71 85 117 37 1 -1 Level 1

  9. Need a little new function • Follower( SL* sl, int x , int d ){ • // Returns a pointer to the smallest cell at level • // d, with key strickly greater than x • P=sl->top; int d1=sl -> l ; • while(1) { • while(p->nxt->key <= x ) p = p->nxt ; • if( d1 == d ) return p->nxt ; • assert( p->down != NULL ) ; //add #include<assert.h> • p = p -> down ; • d1-- ; • } • }

  10. Top 3 -1 Virtually copying SL To delete 37 - We copy as before the search path (brown path) In each level d at which appear, we delete it using the command p->nxt = follower( sl, 37, 3 ) Top 2 Top1 -1 21 37 37 1 - -1 Level 3 21 37 1 7 37 71 -1 Level 2 21 7 14 21 32 37 71 85 117 37 1 -1 Level 1

  11. Top 2 -1 21 37 37 37 Something fishy • But it should not be. • The new SL (lets call it SL(2) ) is a perfectly legal SL. It has the same keys of SL(1), excluding 71 that was deleted. Top1 37 1 - -1 Level 3 21 1 7 37 71 -1 Level 2 21 7 14 21 32 37 71 85 117 1 -1 Level 1

  12. Top 2 -1 21 37 71 37 71 Inserting a key How to insert a key into the skipList, without destroying it ? Same idea: Assume we want to insert(75) • Do search(75). • Copy every element that the search goes through. • Let Top2 point to the top of the list. • Insert(72) into the SL pointed to by Top2 - only blue elements change Top 37 1 - -1 Level 3 21 1 7 37 71 -1 Level 2 21 73 7 14 21 32 37 71 85 117 1 -1 Level 1

  13. Top 2 -1 21 37 71 37 71 Again - a brandnew SL • Note - again we obtained a perfectly legal SL. • We have two SkipLists - one contains 73, the other one does not contain 73. • We can now insert/delete elements into/from SL(2) • Remember:to access a SL, one only need the root - the top. Top 37 1 - -1 Level 3 21 1 7 37 71 -1 Level 2 21 73 7 14 21 32 37 71 85 117 1 -1 Level 1

  14. Top 2 -1 21 37 71 37 71 How much space • We saw that the average length of a path is O(log n), so each insert/delete takes O(log n) time and space Top 37 1 - -1 Level 3 21 1 7 37 71 -1 Level 2 21 73 7 14 21 32 37 71 85 117 1 -1 Level 1

  15. Back to the birth/death question • In a city, people are born, and die. • Each person is recognized by its height (no two people have the same height). We denote height by the letter y, and (birth/death) date by x. • Need a DS that would find Find(x,y) - who was the person that was alive at date x, and her/his height is y (or if not exist), larger and as close as possible to y. 2 Height y=6'2 q 3 4 5 y-axis 6 Born date x1=1/1/1900 Death date x2=10/2/1998 x-axis

  16. And remembering that this one is easy… • All births/deaths start at the same date • Call this problem the same-population problem (no births no deaths) (4,20) (18,20) (4,16) (18,16) Answer: 16 (18,13) (4,13) (4,7) (18,7) Easily solved via standard skip list MIN 7 13 16 20 MAX

  17. {3,6} {2,3,6} We can solve this one by… • We split the time axis into time-intervals. • We split the time at each • birth or death. • During the same interval, • no birth or death occurs. • We create the SL of one • interval by inserting (birth) • or deleting a segment • (person) from the SL of • the previous interval 2 1 3 4 5 6 7 Time axis

  18. How to access the different SL ? • So we obtain 2n+1 SkipLists, • (one for time intervals). • The roots of all different SL are • Stored in a new SL (call it dates • SL), sorted by date. • The SkipLists of the people are • called People SL, sorted • by height. 2 1 3 4 5 6 7 Time axis

  19. 2 1 3 4 5 6 7 Time axis How to access the different SL ? • Alg: Create an empty people-SL • Create the dates-SL, and insert each birth/death event. • Scan these event (in increasing dates), and for each event (date) do • Insert/delete (virtually) into/from the • people SL. • Link the TOP of the new people-SL with the currant key of the • dates-SL

  20. Overall data structure • Dates SL (only lower level shown) 1b 5b 7b 3b 7d 1d 5d 3d A top pointer A top pointer 1 Each cell in the lower level of the dates SL points to the People SL of the time interval ending at this cell 3 5 7 Time axis

  21. Answering a query A query point (x,y) - which segment is vertically above the point (x,y) 1b 5b 7b 3b 7d 1d 5d 3d Use the people SL to find the time interval containt x, and the corresponding people SL(use successor(x) operation in Dates SL). Perfrom successos(y) operation in this people SL to find the segment above (x,y). A top pointer 1 3 5 7 Time axis

More Related