Spaces:
Runtime error
Runtime error
| <div class="transcript-body" lang="en"> | |
| <div class="transcript-line" data-begin="0.09"> | |
| <span class="transcript-timestamp">0:00</span> | |
| <span class="transcript-text">The following content is | |
| provided under a Creative</span> | |
| </div> | |
| <div class="transcript-line" data-begin="2.49"><span class="transcript-timestamp">0:02</span><span | |
| class="transcript-text">Commons license.</span></div> | |
| <div class="transcript-line" data-begin="4.03"><span class="transcript-timestamp">0:04</span><span | |
| class="transcript-text">Your support will help | |
| MIT OpenCourseWare</span></div> | |
| <div class="transcript-line" data-begin="6.36"><span class="transcript-timestamp">0:06</span><span | |
| class="transcript-text">continue to offer high quality | |
| educational resources for free.</span></div> | |
| <div class="transcript-line" data-begin="10.72"><span class="transcript-timestamp">0:10</span><span | |
| class="transcript-text">To make a donation or | |
| view additional materials</span></div> | |
| <div class="transcript-line" data-begin="13.32"><span class="transcript-timestamp">0:13</span><span | |
| class="transcript-text">from hundreds of MIT courses, | |
| visit MIT OpenCourseWare</span></div> | |
| <div class="transcript-line" data-begin="17.28"><span class="transcript-timestamp">0:17</span><span | |
| class="transcript-text">at ocw.mit.edu.</span></div> | |
| <div class="transcript-line" data-begin="21.056"><span class="transcript-timestamp">0:21</span><span | |
| class="transcript-text">ERIK DEMAINE: Welcome to 6.851 | |
| Advanced Data Structures.</span></div> | |
| <div class="transcript-line" data-begin="25.28"><span class="transcript-timestamp">0:25</span><span | |
| class="transcript-text">I am Erik Demaine.</span></div> | |
| <div class="transcript-line" data-begin="26.42"><span class="transcript-timestamp">0:26</span><span | |
| class="transcript-text">You can call me Erik.</span></div> | |
| <div class="transcript-line" data-begin="28.17"><span class="transcript-timestamp">0:28</span><span | |
| class="transcript-text">We have two TAs, Tom | |
| Morgan and Justin Zhang.</span></div> | |
| <div class="transcript-line" data-begin="31.6"><span class="transcript-timestamp">0:31</span><span | |
| class="transcript-text">Tom's back there.</span></div> | |
| <div class="transcript-line" data-begin="32.9"><span class="transcript-timestamp">0:32</span><span | |
| class="transcript-text">Justin is late.</span></div> | |
| <div class="transcript-line" data-begin="36.26"><span class="transcript-timestamp">0:36</span><span | |
| class="transcript-text">And this class is | |
| about all kinds</span></div> | |
| <div class="transcript-line" data-begin="38.6"><span class="transcript-timestamp">0:38</span><span | |
| class="transcript-text">of very cool data structures.</span></div> | |
| <div class="transcript-line" data-begin="40.567"><span class="transcript-timestamp">0:40</span><span | |
| class="transcript-text">You should have already | |
| seen basic data structures</span></div> | |
| <div class="transcript-line" data-begin="42.65"><span class="transcript-timestamp">0:42</span><span | |
| class="transcript-text">like balance binary | |
| search trees and things</span></div> | |
| <div class="transcript-line" data-begin="45.2"><span class="transcript-timestamp">0:45</span><span | |
| class="transcript-text">like that, log n | |
| time to do wherever</span></div> | |
| <div class="transcript-line" data-begin="48.14"><span class="transcript-timestamp">0:48</span><span | |
| class="transcript-text">you want in one dimension.</span></div> | |
| <div class="transcript-line" data-begin="50.06"><span class="transcript-timestamp">0:50</span><span | |
| class="transcript-text">And here we're going to turn | |
| all those data structures</span></div> | |
| <div class="transcript-line" data-begin="52.31"><span class="transcript-timestamp">0:52</span><span | |
| class="transcript-text">on their head and | |
| consider them in all sorts</span></div> | |
| <div class="transcript-line" data-begin="54.143"><span class="transcript-timestamp">0:54</span><span | |
| class="transcript-text">of different models and | |
| additional cool problems.</span></div> | |
| <div class="transcript-line" data-begin="56.93"><span class="transcript-timestamp">0:56</span><span | |
| class="transcript-text">Today we're going to talk about | |
| time travel or temporal data</span></div> | |
| <div class="transcript-line" data-begin="59.63"><span class="transcript-timestamp">0:59</span><span | |
| class="transcript-text">structures, where | |
| you're manipulating time</span></div> | |
| <div class="transcript-line" data-begin="62.77"><span class="transcript-timestamp">1:02</span><span | |
| class="transcript-text">as any good time | |
| traveler should.</span></div> | |
| <div class="transcript-line" data-begin="65.51"><span class="transcript-timestamp">1:05</span><span | |
| class="transcript-text">Then we'll do geometry where | |
| we have higher dimensional</span></div> | |
| <div class="transcript-line" data-begin="67.94"><span class="transcript-timestamp">1:07</span><span | |
| class="transcript-text">data, more than one dimension.</span></div> | |
| <div class="transcript-line" data-begin="69.62"><span class="transcript-timestamp">1:09</span><span | |
| class="transcript-text">Then we'll look at | |
| a problem called</span></div> | |
| <div class="transcript-line" data-begin="71.12"><span class="transcript-timestamp">1:11</span><span | |
| class="transcript-text">dynamic optimality, which is, | |
| is there one best binary search</span></div> | |
| <div class="transcript-line" data-begin="74.9"><span class="transcript-timestamp">1:14</span><span | |
| class="transcript-text">tree that rules them all?</span></div> | |
| <div class="transcript-line" data-begin="76.642"><span class="transcript-timestamp">1:16</span><span | |
| class="transcript-text">Then we'll look at something | |
| called memory hierarchy, which</span></div> | |
| <div class="transcript-line" data-begin="79.1"><span class="transcript-timestamp">1:19</span><span | |
| class="transcript-text">is a way to model more realistic | |
| computers which have cache</span></div> | |
| <div class="transcript-line" data-begin="82.58"><span class="transcript-timestamp">1:22</span><span | |
| class="transcript-text">and then more cache | |
| and then main memory</span></div> | |
| <div class="transcript-line" data-begin="84.56"><span class="transcript-timestamp">1:24</span><span | |
| class="transcript-text">and then dish and all | |
| these different levels.</span></div> | |
| <div class="transcript-line" data-begin="86.63"><span class="transcript-timestamp">1:26</span><span | |
| class="transcript-text">How do you optimize for that?</span></div> | |
| <div class="transcript-line" data-begin="88.58"><span class="transcript-timestamp">1:28</span><span | |
| class="transcript-text">Hashing is probably the most | |
| famous, and most popular,</span></div> | |
| <div class="transcript-line" data-begin="91.77"><span class="transcript-timestamp">1:31</span><span | |
| class="transcript-text">most used data structure | |
| in computer science.</span></div> | |
| <div class="transcript-line" data-begin="93.67"><span class="transcript-timestamp">1:33</span><span | |
| class="transcript-text">We'll do a little bit on that.</span></div> | |
| <div class="transcript-line" data-begin="95.96"><span class="transcript-timestamp">1:35</span><span | |
| class="transcript-text">Integers, when you know that | |
| your data is integers and not</span></div> | |
| <div class="transcript-line" data-begin="99.05"><span class="transcript-timestamp">1:39</span><span | |
| class="transcript-text">just arbitrary black boxes that | |
| you can compare or do whatever,</span></div> | |
| <div class="transcript-line" data-begin="102.147"><span class="transcript-timestamp">1:42</span><span | |
| class="transcript-text">you can do a lot | |
| better with integers.</span></div> | |
| <div class="transcript-line" data-begin="103.73"><span class="transcript-timestamp">1:43</span><span | |
| class="transcript-text">You usually beat log n time.</span></div> | |
| <div class="transcript-line" data-begin="105.14"><span class="transcript-timestamp">1:45</span><span | |
| class="transcript-text">Often you can get constant time.</span></div> | |
| <div class="transcript-line" data-begin="107.1"><span class="transcript-timestamp">1:47</span><span | |
| class="transcript-text">For example, if you want | |
| to do priority queues,</span></div> | |
| <div class="transcript-line" data-begin="109.13"><span class="transcript-timestamp">1:49</span><span | |
| class="transcript-text">you can do square | |
| root log log n time.</span></div> | |
| <div class="transcript-line" data-begin="111.8"><span class="transcript-timestamp">1:51</span><span | |
| class="transcript-text">That's the best | |
| known randomized.</span></div> | |
| <div class="transcript-line" data-begin="115.1"><span class="transcript-timestamp">1:55</span><span | |
| class="transcript-text">Dynamic graphs, you have | |
| a graph you want to store,</span></div> | |
| <div class="transcript-line" data-begin="118.01"><span class="transcript-timestamp">1:58</span><span | |
| class="transcript-text">and the edges are being added | |
| and maybe deleted, like you're</span></div> | |
| <div class="transcript-line" data-begin="121.44"><span class="transcript-timestamp">2:01</span><span | |
| class="transcript-text">representing a social network.</span></div> | |
| <div class="transcript-line" data-begin="122.69"><span class="transcript-timestamp">2:02</span><span | |
| class="transcript-text">And people are friending | |
| and de-friending.</span></div> | |
| <div class="transcript-line" data-begin="124.04"><span class="transcript-timestamp">2:04</span><span | |
| class="transcript-text">You want to maintain some | |
| interesting information</span></div> | |
| <div class="transcript-line" data-begin="126.081"><span class="transcript-timestamp">2:06</span><span | |
| class="transcript-text">about that graph.</span></div> | |
| <div class="transcript-line" data-begin="127.76"><span class="transcript-timestamp">2:07</span><span | |
| class="transcript-text">Strings, you have | |
| a piece of text,</span></div> | |
| <div class="transcript-line" data-begin="130.669"><span class="transcript-timestamp">2:10</span><span | |
| class="transcript-text">such as the entire | |
| worldwide web.</span></div> | |
| <div class="transcript-line" data-begin="132.555"><span class="transcript-timestamp">2:12</span><span | |
| class="transcript-text">And you want to search | |
| for a substring.</span></div> | |
| <div class="transcript-line" data-begin="134.18"><span class="transcript-timestamp">2:14</span><span | |
| class="transcript-text">How do you do that efficiently?</span></div> | |
| <div class="transcript-line" data-begin="135.54"><span class="transcript-timestamp">2:15</span><span | |
| class="transcript-text">It's sort of the Google problem.</span></div> | |
| <div class="transcript-line" data-begin="137.42"><span class="transcript-timestamp">2:17</span><span | |
| class="transcript-text">Or you searching through | |
| DNA for patterns, whenever.</span></div> | |
| <div class="transcript-line" data-begin="140.54"><span class="transcript-timestamp">2:20</span><span | |
| class="transcript-text">And finally succinct | |
| data structures,</span></div> | |
| <div class="transcript-line" data-begin="142.35"><span class="transcript-timestamp">2:22</span><span | |
| class="transcript-text">which is all about | |
| taking what we normally</span></div> | |
| <div class="transcript-line" data-begin="144.17"><span class="transcript-timestamp">2:24</span><span | |
| class="transcript-text">consider optimal | |
| space or n space</span></div> | |
| <div class="transcript-line" data-begin="146.66"><span class="transcript-timestamp">2:26</span><span | |
| class="transcript-text">and reducing it down to the very | |
| bare minimum of bits of space.</span></div> | |
| <div class="transcript-line" data-begin="150.44"><span class="transcript-timestamp">2:30</span><span | |
| class="transcript-text">Usually if you want | |
| to store something</span></div> | |
| <div class="transcript-line" data-begin="152.745"><span class="transcript-timestamp">2:32</span><span | |
| class="transcript-text">where there's 2 to | |
| the n possibilities,</span></div> | |
| <div class="transcript-line" data-begin="154.37"><span class="transcript-timestamp">2:34</span><span | |
| class="transcript-text">you want to get away | |
| with n bits of space,</span></div> | |
| <div class="transcript-line" data-begin="156.62"><span class="transcript-timestamp">2:36</span><span | |
| class="transcript-text">maybe plus square root of | |
| n or something very tiny.</span></div> | |
| <div class="transcript-line" data-begin="160.03"><span class="transcript-timestamp">2:40</span><span | |
| class="transcript-text">So that's the sync | |
| data structures.</span></div> | |
| <div class="transcript-line" data-begin="162.74"><span class="transcript-timestamp">2:42</span><span | |
| class="transcript-text">So that's an overview | |
| of the entire class.</span></div> | |
| <div class="transcript-line" data-begin="164.79"><span class="transcript-timestamp">2:44</span><span | |
| class="transcript-text">And these are sort of the | |
| sections we'll be following.</span></div> | |
| <div class="transcript-line" data-begin="167.97"><span class="transcript-timestamp">2:47</span><span | |
| class="transcript-text">Let me give you a quick | |
| administrative overview</span></div> | |
| <div class="transcript-line" data-begin="170.93"><span class="transcript-timestamp">2:50</span><span | |
| class="transcript-text">of what we're doing.</span></div> | |
| <div class="transcript-line" data-begin="174.35"><span class="transcript-timestamp">2:54</span><span | |
| class="transcript-text">Requirements for the class--</span></div> | |
| <div class="transcript-line" data-begin="175.52"><span class="transcript-timestamp">2:55</span><span | |
| class="transcript-text">I guess, first, | |
| attending lecture.</span></div> | |
| <div class="transcript-line" data-begin="178.317"><span class="transcript-timestamp">2:58</span><span | |
| class="transcript-text">Obviously if you | |
| don't attend lecture,</span></div> | |
| <div class="transcript-line" data-begin="179.9"><span class="transcript-timestamp">2:59</span><span | |
| class="transcript-text">there'll be videos online.</span></div> | |
| <div class="transcript-line" data-begin="180.983"><span class="transcript-timestamp">3:00</span><span | |
| class="transcript-text">So that's resolvable.</span></div> | |
| <div class="transcript-line" data-begin="182.81"><span class="transcript-timestamp">3:02</span><span | |
| class="transcript-text">But let me know if you're | |
| not going to make it.</span></div> | |
| <div class="transcript-line" data-begin="185"><span class="transcript-timestamp">3:05</span><span | |
| class="transcript-text">We're going to have problems | |
| sets roughly every week.</span></div> | |
| <div class="transcript-line" data-begin="187.41"><span class="transcript-timestamp">3:07</span><span | |
| class="transcript-text">If you're taking the | |
| class for credit,</span></div> | |
| <div class="transcript-line" data-begin="189.39"><span class="transcript-timestamp">3:09</span><span | |
| class="transcript-text">they have a very simple rule | |
| of one page in, one page out.</span></div> | |
| <div class="transcript-line" data-begin="192.5"><span class="transcript-timestamp">3:12</span><span | |
| class="transcript-text">This is more constraint on | |
| us to write problems that</span></div> | |
| <div class="transcript-line" data-begin="195.29"><span class="transcript-timestamp">3:15</span><span | |
| class="transcript-text">have easy or short answers.</span></div> | |
| <div class="transcript-line" data-begin="196.719"><span class="transcript-timestamp">3:16</span><span | |
| class="transcript-text">You probably need | |
| to think about them</span></div> | |
| <div class="transcript-line" data-begin="198.26"><span class="transcript-timestamp">3:18</span><span | |
| class="transcript-text">a little bit before they're | |
| transparent, but then easy</span></div> | |
| <div class="transcript-line" data-begin="201.41"><span class="transcript-timestamp">3:21</span><span | |
| class="transcript-text">to write up.</span></div> | |
| <div class="transcript-line" data-begin="203.06"><span class="transcript-timestamp">3:23</span><span | |
| class="transcript-text">And then scribing lectures-- | |
| so we have a scribe for today,</span></div> | |
| <div class="transcript-line" data-begin="206.43"><span class="transcript-timestamp">3:26</span><span | |
| class="transcript-text">I hope.</span></div> | |
| <div class="transcript-line" data-begin="207.58"><span class="transcript-timestamp">3:27</span><span | |
| class="transcript-text">Here?</span></div> | |
| <div class="transcript-line" data-begin="208.55"><span class="transcript-timestamp">3:28</span><span | |
| class="transcript-text">Yes, good.</span></div> | |
| <div class="transcript-line" data-begin="210.17"><span class="transcript-timestamp">3:30</span><span | |
| class="transcript-text">So most of the | |
| lectures have already</span></div> | |
| <div class="transcript-line" data-begin="212.21"><span class="transcript-timestamp">3:32</span><span | |
| class="transcript-text">been scribed in some | |
| version, and your goal</span></div> | |
| <div class="transcript-line" data-begin="214.58"><span class="transcript-timestamp">3:34</span><span | |
| class="transcript-text">is to revise that scribe | |
| notes that if you don't like</span></div> | |
| <div class="transcript-line" data-begin="218.42"><span class="transcript-timestamp">3:38</span><span | |
| class="transcript-text">handwritten notes, which | |
| are also online, then easier</span></div> | |
| <div class="transcript-line" data-begin="222.11"><span class="transcript-timestamp">3:42</span><span | |
| class="transcript-text">for people to read.</span></div> | |
| <div class="transcript-line" data-begin="224.32"><span class="transcript-timestamp">3:44</span><span | |
| class="transcript-text">Let's see.</span></div> | |
| <div class="transcript-line" data-begin="225.16"><span class="transcript-timestamp">3:45</span><span | |
| class="transcript-text">Listeners welcome.</span></div> | |
| <div class="transcript-line" data-begin="226.187"><span class="transcript-timestamp">3:46</span><span | |
| class="transcript-text">We're going to have an | |
| open problem session.</span></div> | |
| <div class="transcript-line" data-begin="228.02"><span class="transcript-timestamp">3:48</span><span | |
| class="transcript-text">I really like open problems.</span></div> | |
| <div class="transcript-line" data-begin="229.23"><span class="transcript-timestamp">3:49</span><span | |
| class="transcript-text">I really like solving | |
| open problems.</span></div> | |
| <div class="transcript-line" data-begin="230.73"><span class="transcript-timestamp">3:50</span><span | |
| class="transcript-text">So we've done this every time | |
| this class has been offered.</span></div> | |
| <div class="transcript-line" data-begin="233.54"><span class="transcript-timestamp">3:53</span><span | |
| class="transcript-text">So if you're interested in | |
| also solving open problems,</span></div> | |
| <div class="transcript-line" data-begin="235.79"><span class="transcript-timestamp">3:55</span><span | |
| class="transcript-text">it's optional.</span></div> | |
| <div class="transcript-line" data-begin="236.91"><span class="transcript-timestamp">3:56</span><span | |
| class="transcript-text">I will organize-- in | |
| a couple of weeks,</span></div> | |
| <div class="transcript-line" data-begin="239.48"><span class="transcript-timestamp">3:59</span><span | |
| class="transcript-text">we'll have a weekly | |
| open problem session</span></div> | |
| <div class="transcript-line" data-begin="243.11"><span class="transcript-timestamp">4:03</span><span | |
| class="transcript-text">and try to solve | |
| all the things that</span></div> | |
| <div class="transcript-line" data-begin="246.44"><span class="transcript-timestamp">4:06</span><span | |
| class="transcript-text">push the frontier of | |
| advanced data structures.</span></div> | |
| <div class="transcript-line" data-begin="249.08"><span class="transcript-timestamp">4:09</span><span | |
| class="transcript-text">So in classes, we'll see | |
| the state of the art.</span></div> | |
| <div class="transcript-line" data-begin="251.81"><span class="transcript-timestamp">4:11</span><span | |
| class="transcript-text">And then we'll change the state | |
| of the art in those sessions.</span></div> | |
| <div class="transcript-line" data-begin="255.671"><span class="transcript-timestamp">4:15</span><span | |
| class="transcript-text">I think that's it.</span></div> | |
| <div class="transcript-line" data-begin="256.42"><span class="transcript-timestamp">4:16</span><span | |
| class="transcript-text">Any questions about | |
| the class before we</span></div> | |
| <div class="transcript-line" data-begin="258.92"><span class="transcript-timestamp">4:18</span><span | |
| class="transcript-text">get into the fun stuff?</span></div> | |
| <div class="transcript-line" data-begin="262.98"><span class="transcript-timestamp">4:22</span><span | |
| class="transcript-text">All right.</span></div> | |
| <div class="transcript-line" data-begin="263.9"><span class="transcript-timestamp">4:23</span><span | |
| class="transcript-text">Let's do some time traveling.</span></div> | |
| <div class="transcript-line" data-begin="267.142"><span class="transcript-timestamp">4:27</span><span | |
| class="transcript-text">Before I get to time | |
| traveling, though, I</span></div> | |
| <div class="transcript-line" data-begin="268.85"><span class="transcript-timestamp">4:28</span><span | |
| class="transcript-text">need to define our | |
| model of computation.</span></div> | |
| <div class="transcript-line" data-begin="272.42"><span class="transcript-timestamp">4:32</span><span | |
| class="transcript-text">A theme in this class is that | |
| the model of computation you're</span></div> | |
| <div class="transcript-line" data-begin="275.716"><span class="transcript-timestamp">4:35</span><span | |
| class="transcript-text">working with matters.</span></div> | |
| <div class="transcript-line" data-begin="276.59"><span class="transcript-timestamp">4:36</span><span | |
| class="transcript-text">Models matter.</span></div> | |
| <div class="transcript-line" data-begin="278.06"><span class="transcript-timestamp">4:38</span><span | |
| class="transcript-text">And there's lots of different | |
| models of computation.</span></div> | |
| <div class="transcript-line" data-begin="280.43"><span class="transcript-timestamp">4:40</span><span | |
| class="transcript-text">We'll see a few of the | |
| main ones in this class.</span></div> | |
| <div class="transcript-line" data-begin="285.89"><span class="transcript-timestamp">4:45</span><span | |
| class="transcript-text">And the starting | |
| point, and the one</span></div> | |
| <div class="transcript-line" data-begin="288.58"><span class="transcript-timestamp">4:48</span><span | |
| class="transcript-text">we'll be using throughout today, | |
| is called a pointer machine.</span></div> | |
| <div class="transcript-line" data-begin="293.1"><span class="transcript-timestamp">4:53</span><span | |
| class="transcript-text">It's an old one from the '80s.</span></div> | |
| <div class="transcript-line" data-begin="297.24"><span class="transcript-timestamp">4:57</span><span | |
| class="transcript-text">And it corresponds to | |
| what you might think about</span></div> | |
| <div class="transcript-line" data-begin="299.24"><span class="transcript-timestamp">4:59</span><span | |
| class="transcript-text">if you've done a lot of | |
| object-oriented programming,</span></div> | |
| <div class="transcript-line" data-begin="302.09"><span class="transcript-timestamp">5:02</span><span | |
| class="transcript-text">and before that, | |
| structure-oriented programming,</span></div> | |
| <div class="transcript-line" data-begin="304.95"><span class="transcript-timestamp">5:04</span><span | |
| class="transcript-text">I guess.</span></div> | |
| <div class="transcript-line" data-begin="305.76"><span class="transcript-timestamp">5:05</span><span | |
| class="transcript-text">So you have a bunch of nodes.</span></div> | |
| <div class="transcript-line" data-begin="308.66"><span class="transcript-timestamp">5:08</span><span | |
| class="transcript-text">They have some fields in them, | |
| a constant number of fields.</span></div> | |
| <div class="transcript-line" data-begin="313.97"><span class="transcript-timestamp">5:13</span><span | |
| class="transcript-text">You can think of these | |
| as objects or strucs</span></div> | |
| <div class="transcript-line" data-begin="316.61"><span class="transcript-timestamp">5:16</span><span | |
| class="transcript-text">in c It used to be records | |
| back in Pascal days,</span></div> | |
| <div class="transcript-line" data-begin="320.27"><span class="transcript-timestamp">5:20</span><span | |
| class="transcript-text">so a lot of the papers | |
| call them records.</span></div> | |
| <div class="transcript-line" data-begin="322.17"><span class="transcript-timestamp">5:22</span><span | |
| class="transcript-text">You could just have a | |
| constant number of fields.</span></div> | |
| <div class="transcript-line" data-begin="324.17"><span class="transcript-timestamp">5:24</span><span | |
| class="transcript-text">You could think of | |
| those numbered, labeled.</span></div> | |
| <div class="transcript-line" data-begin="325.3"><span class="transcript-timestamp">5:25</span><span | |
| class="transcript-text">It doesn't really matter | |
| because there's only</span></div> | |
| <div class="transcript-line" data-begin="327.175"><span class="transcript-timestamp">5:27</span><span | |
| class="transcript-text">a constant number of them.</span></div> | |
| <div class="transcript-line" data-begin="328.55"><span class="transcript-timestamp">5:28</span><span | |
| class="transcript-text">Each of the fields could be | |
| a pointer to another node,</span></div> | |
| <div class="transcript-line" data-begin="332.24"><span class="transcript-timestamp">5:32</span><span | |
| class="transcript-text">could be a null pointer, or | |
| could have some data in it.</span></div> | |
| <div class="transcript-line" data-begin="335.55"><span class="transcript-timestamp">5:35</span><span | |
| class="transcript-text">So I'll just assume that | |
| all my data is integers.</span></div> | |
| <div class="transcript-line" data-begin="343.13"><span class="transcript-timestamp">5:43</span><span | |
| class="transcript-text">You can have a | |
| pointer to yourself.</span></div> | |
| <div class="transcript-line" data-begin="345.09"><span class="transcript-timestamp">5:45</span><span | |
| class="transcript-text">You can have a pointer over | |
| here, whatever you want.</span></div> | |
| <div class="transcript-line" data-begin="348.44"><span class="transcript-timestamp">5:48</span><span | |
| class="transcript-text">A pointer machine would | |
| look something like this.</span></div> | |
| <div class="transcript-line" data-begin="352.64"><span class="transcript-timestamp">5:52</span><span | |
| class="transcript-text">In any moment, this is the | |
| state of the pointer machine.</span></div> | |
| <div class="transcript-line" data-begin="355.04"><span class="transcript-timestamp">5:55</span><span | |
| class="transcript-text">So you think this as the memory | |
| of your computer storing.</span></div> | |
| <div class="transcript-line" data-begin="359.3"><span class="transcript-timestamp">5:59</span><span | |
| class="transcript-text">And then you have | |
| some operations</span></div> | |
| <div class="transcript-line" data-begin="362.21"><span class="transcript-timestamp">6:02</span><span | |
| class="transcript-text">that you're allowed to do.</span></div> | |
| <div class="transcript-line" data-begin="363.66"><span class="transcript-timestamp">6:03</span><span | |
| class="transcript-text">That's the computation | |
| part of the model.</span></div> | |
| <div class="transcript-line" data-begin="367.8"><span class="transcript-timestamp">6:07</span><span | |
| class="transcript-text">You can think of this | |
| as the memory model.</span></div> | |
| <div class="transcript-line" data-begin="370.57"><span class="transcript-timestamp">6:10</span><span | |
| class="transcript-text">What you're allowed to | |
| do are create nodes.</span></div> | |
| <div class="transcript-line" data-begin="373.1"><span class="transcript-timestamp">6:13</span><span | |
| class="transcript-text">You can say something | |
| like, x equals new node.</span></div> | |
| <div class="transcript-line" data-begin="379.91"><span class="transcript-timestamp">6:19</span><span | |
| class="transcript-text">You can, I don't | |
| know, look at fields.</span></div> | |
| <div class="transcript-line" data-begin="384.99"><span class="transcript-timestamp">6:24</span><span | |
| class="transcript-text">You can do x equals y.field.</span></div> | |
| <div class="transcript-line" data-begin="388.07"><span class="transcript-timestamp">6:28</span><span | |
| class="transcript-text">You can set fields, | |
| x.field equals y.</span></div> | |
| <div class="transcript-line" data-begin="393.56"><span class="transcript-timestamp">6:33</span><span | |
| class="transcript-text">You can compute on these | |
| data, so you can add 5 and 7,</span></div> | |
| <div class="transcript-line" data-begin="397.4"><span class="transcript-timestamp">6:37</span><span | |
| class="transcript-text">do things like that.</span></div> | |
| <div class="transcript-line" data-begin="399.11"><span class="transcript-timestamp">6:39</span><span | |
| class="transcript-text">I'm not going to worry about--</span></div> | |
| <div class="transcript-line" data-begin="400.99"><span class="transcript-timestamp">6:40</span><span | |
| class="transcript-text">I'll just write et cetera.</span></div> | |
| <div class="transcript-line" data-begin="403.7"><span class="transcript-timestamp">6:43</span><span | |
| class="transcript-text">This is more a model | |
| about how everything's</span></div> | |
| <div class="transcript-line" data-begin="405.68"><span class="transcript-timestamp">6:45</span><span | |
| class="transcript-text">organized in memory, not so | |
| much about what you're allowed</span></div> | |
| <div class="transcript-line" data-begin="408.38"><span class="transcript-timestamp">6:48</span><span | |
| class="transcript-text">to do to the data items.</span></div> | |
| <div class="transcript-line" data-begin="409.62"><span class="transcript-timestamp">6:49</span><span | |
| class="transcript-text">In this lecture, it | |
| won't matter what</span></div> | |
| <div class="transcript-line" data-begin="410.87"><span class="transcript-timestamp">6:50</span><span | |
| class="transcript-text">you're doing to the data items.</span></div> | |
| <div class="transcript-line" data-begin="412.161"><span class="transcript-timestamp">6:52</span><span | |
| class="transcript-text">We never touch them.</span></div> | |
| <div class="transcript-line" data-begin="413.93"><span class="transcript-timestamp">6:53</span><span | |
| class="transcript-text">We just copy them around.</span></div> | |
| <div class="transcript-line" data-begin="416.84"><span class="transcript-timestamp">6:56</span><span | |
| class="transcript-text">So am I missing anything?</span></div> | |
| <div class="transcript-line" data-begin="419.87"><span class="transcript-timestamp">6:59</span><span | |
| class="transcript-text">Probably.</span></div> | |
| <div class="transcript-line" data-begin="421.1"><span class="transcript-timestamp">7:01</span><span | |
| class="transcript-text">I guess you could destroy | |
| nodes if you felt like it.</span></div> | |
| <div class="transcript-line" data-begin="423.95"><span class="transcript-timestamp">7:03</span><span | |
| class="transcript-text">But we won't have | |
| to today, because we</span></div> | |
| <div class="transcript-line" data-begin="426.566"><span class="transcript-timestamp">7:06</span><span | |
| class="transcript-text">don't want to | |
| throw anything away</span></div> | |
| <div class="transcript-line" data-begin="427.94"><span class="transcript-timestamp">7:07</span><span | |
| class="transcript-text">when you're time traveling.</span></div> | |
| <div class="transcript-line" data-begin="429.2"><span class="transcript-timestamp">7:09</span><span | |
| class="transcript-text">It's too dangerous.</span></div> | |
| <div class="transcript-line" data-begin="432.74"><span class="transcript-timestamp">7:12</span><span | |
| class="transcript-text">And then the one catch | |
| here is, what are x and y?</span></div> | |
| <div class="transcript-line" data-begin="438.57"><span class="transcript-timestamp">7:18</span><span | |
| class="transcript-text">There's going to be one | |
| node in this data structure</span></div> | |
| <div class="transcript-line" data-begin="441.28"><span class="transcript-timestamp">7:21</span><span | |
| class="transcript-text">or in your memory | |
| called the root node.</span></div> | |
| <div class="transcript-line" data-begin="444.184"><span class="transcript-timestamp">7:24</span><span | |
| class="transcript-text">And you could think of that | |
| as that's the thing you always</span></div> | |
| <div class="transcript-line" data-begin="446.6"><span class="transcript-timestamp">7:26</span><span | |
| class="transcript-text">have in your head.</span></div> | |
| <div class="transcript-line" data-begin="447.8"><span class="transcript-timestamp">7:27</span><span | |
| class="transcript-text">This is like your | |
| cache, if you will.</span></div> | |
| <div class="transcript-line" data-begin="449.39"><span class="transcript-timestamp">7:29</span><span | |
| class="transcript-text">It's just got a constant | |
| number of things, just</span></div> | |
| <div class="transcript-line" data-begin="451.348"><span class="transcript-timestamp">7:31</span><span | |
| class="transcript-text">like any other node.</span></div> | |
| <div class="transcript-line" data-begin="452.47"><span class="transcript-timestamp">7:32</span><span | |
| class="transcript-text">And x and y are | |
| fields of the root.</span></div> | |
| <div class="transcript-line" data-begin="460.52"><span class="transcript-timestamp">7:40</span><span | |
| class="transcript-text">So that sort of | |
| ties things down.</span></div> | |
| <div class="transcript-line" data-begin="462.53"><span class="transcript-timestamp">7:42</span><span | |
| class="transcript-text">You're always working | |
| relative to the root.</span></div> | |
| <div class="transcript-line" data-begin="465.2"><span class="transcript-timestamp">7:45</span><span | |
| class="transcript-text">But you can look at the data, | |
| basically follow this pointer,</span></div> | |
| <div class="transcript-line" data-begin="470.03"><span class="transcript-timestamp">7:50</span><span | |
| class="transcript-text">by looking at the field.</span></div> | |
| <div class="transcript-line" data-begin="473.04"><span class="transcript-timestamp">7:53</span><span | |
| class="transcript-text">You could set one | |
| of these pointers--</span></div> | |
| <div class="transcript-line" data-begin="475.85"><span class="transcript-timestamp">7:55</span><span | |
| class="transcript-text">I think I probably need | |
| another operation here,</span></div> | |
| <div class="transcript-line" data-begin="478.16"><span class="transcript-timestamp">7:58</span><span | |
| class="transcript-text">like x equals y.field1, | |
| field2, that sort of thing,</span></div> | |
| <div class="transcript-line" data-begin="483.936"><span class="transcript-timestamp">8:03</span><span | |
| class="transcript-text">and maybe the reverse.</span></div> | |
| <div class="transcript-line" data-begin="486.8"><span class="transcript-timestamp">8:06</span><span | |
| class="transcript-text">But you can manipulate | |
| all nodes sort</span></div> | |
| <div class="transcript-line" data-begin="489.2"><span class="transcript-timestamp">8:09</span><span | |
| class="transcript-text">of via the root is the idea.</span></div> | |
| <div class="transcript-line" data-begin="490.77"><span class="transcript-timestamp">8:10</span><span | |
| class="transcript-text">You follow pointers, | |
| do whatever.</span></div> | |
| <div class="transcript-line" data-begin="492.71"><span class="transcript-timestamp">8:12</span><span | |
| class="transcript-text">So pretty obvious, | |
| slightly annoying</span></div> | |
| <div class="transcript-line" data-begin="494.78"><span class="transcript-timestamp">8:14</span><span | |
| class="transcript-text">to write down formally.</span></div> | |
| <div class="transcript-line" data-begin="496.25"><span class="transcript-timestamp">8:16</span><span | |
| class="transcript-text">But that is pointer machine.</span></div> | |
| <div class="transcript-line" data-begin="503.46"><span class="transcript-timestamp">8:23</span><span | |
| class="transcript-text">And what we're going to | |
| be talking about today</span></div> | |
| <div class="transcript-line" data-begin="506.32"><span class="transcript-timestamp">8:26</span><span | |
| class="transcript-text">in time travel is | |
| suppose someone</span></div> | |
| <div class="transcript-line" data-begin="508.829"><span class="transcript-timestamp">8:28</span><span | |
| class="transcript-text">gives me a pointer machine | |
| data structure, for example,</span></div> | |
| <div class="transcript-line" data-begin="511.12"><span class="transcript-timestamp">8:31</span><span | |
| class="transcript-text">balanced binary search | |
| tree, linked list.</span></div> | |
| <div class="transcript-line" data-begin="513.51"><span class="transcript-timestamp">8:33</span><span | |
| class="transcript-text">A lot of data structures, | |
| especially classic data</span></div> | |
| <div class="transcript-line" data-begin="516.03"><span class="transcript-timestamp">8:36</span><span | |
| class="transcript-text">structures, follow | |
| pointer machine model.</span></div> | |
| <div class="transcript-line" data-begin="519.192"><span class="transcript-timestamp">8:39</span><span | |
| class="transcript-text">What we'd like to do is | |
| transform that data structure</span></div> | |
| <div class="transcript-line" data-begin="521.4"><span class="transcript-timestamp">8:41</span><span | |
| class="transcript-text">or make a new | |
| pointer machine data</span></div> | |
| <div class="transcript-line" data-begin="522.816"><span class="transcript-timestamp">8:42</span><span | |
| class="transcript-text">structure that does | |
| extra cool things,</span></div> | |
| <div class="transcript-line" data-begin="525.12"><span class="transcript-timestamp">8:45</span><span | |
| class="transcript-text">namely travel through time.</span></div> | |
| <div class="transcript-line" data-begin="527.47"><span class="transcript-timestamp">8:47</span><span | |
| class="transcript-text">So that's what | |
| we're going to do.</span></div> | |
| <div class="transcript-line" data-begin="533.34"><span class="transcript-timestamp">8:53</span><span | |
| class="transcript-text">There's two senses of time | |
| travel or temporal data</span></div> | |
| <div class="transcript-line" data-begin="537.87"><span class="transcript-timestamp">8:57</span><span | |
| class="transcript-text">structures that we're going | |
| to cover in this class.</span></div> | |
| <div class="transcript-line" data-begin="542.2"><span class="transcript-timestamp">9:02</span><span | |
| class="transcript-text">The one for today is | |
| called persistence,</span></div> | |
| <div class="transcript-line" data-begin="545.4"><span class="transcript-timestamp">9:05</span><span | |
| class="transcript-text">where you don't forget | |
| anything, like an elephant.</span></div> | |
| <div class="transcript-line" data-begin="548.31"><span class="transcript-timestamp">9:08</span><span | |
| class="transcript-text">And the other one | |
| is retroactivity.</span></div> | |
| <div class="transcript-line" data-begin="555.24"><span class="transcript-timestamp">9:15</span><span | |
| class="transcript-text">Persistence will be today.</span></div> | |
| <div class="transcript-line" data-begin="556.8"><span class="transcript-timestamp">9:16</span><span | |
| class="transcript-text">Retroactivity is next class.</span></div> | |
| <div class="transcript-line" data-begin="559.26"><span class="transcript-timestamp">9:19</span><span | |
| class="transcript-text">Basically, these correspond | |
| to two models of time travel.</span></div> | |
| <div class="transcript-line" data-begin="561.67"><span class="transcript-timestamp">9:21</span><span | |
| class="transcript-text">Persistence is the branching | |
| universe time travel model,</span></div> | |
| <div class="transcript-line" data-begin="564.176"><span class="transcript-timestamp">9:24</span><span | |
| class="transcript-text">where if you make a | |
| change in the past,</span></div> | |
| <div class="transcript-line" data-begin="565.8"><span class="transcript-timestamp">9:25</span><span | |
| class="transcript-text">you get a new universe.</span></div> | |
| <div class="transcript-line" data-begin="567.35"><span class="transcript-timestamp">9:27</span><span | |
| class="transcript-text">You never destroy old universes.</span></div> | |
| <div class="transcript-line" data-begin="569.46"><span class="transcript-timestamp">9:29</span><span | |
| class="transcript-text">Retroactivity is more | |
| like Back to the Future,</span></div> | |
| <div class="transcript-line" data-begin="573.255"><span class="transcript-timestamp">9:33</span><span | |
| class="transcript-text">when you go back, make | |
| a change, and then you</span></div> | |
| <div class="transcript-line" data-begin="575.13"><span class="transcript-timestamp">9:35</span><span | |
| class="transcript-text">can return to the present | |
| and see what happened.</span></div> | |
| <div class="transcript-line" data-begin="577.92"><span class="transcript-timestamp">9:37</span><span | |
| class="transcript-text">This is a lot harder to do.</span></div> | |
| <div class="transcript-line" data-begin="579.71"><span class="transcript-timestamp">9:39</span><span | |
| class="transcript-text">And we'll work on | |
| that next class.</span></div> | |
| <div class="transcript-line" data-begin="582.15"><span class="transcript-timestamp">9:42</span><span | |
| class="transcript-text">Persistence is what | |
| we will do today.</span></div> | |
| <div class="transcript-line" data-begin="586.36"><span class="transcript-timestamp">9:46</span><span | |
| class="transcript-text">So persistence.</span></div> | |
| <div class="transcript-line" data-begin="597.94"><span class="transcript-timestamp">9:57</span><span | |
| class="transcript-text">The general idea of persistence | |
| is to remember everything--</span></div> | |
| <div class="transcript-line" data-begin="601.81"><span class="transcript-timestamp">10:01</span><span | |
| class="transcript-text">the general goal, I would say.</span></div> | |
| <div class="transcript-line" data-begin="605.11"><span class="transcript-timestamp">10:05</span><span | |
| class="transcript-text">And by everything, I | |
| mean different versions</span></div> | |
| <div class="transcript-line" data-begin="607.36"><span class="transcript-timestamp">10:07</span><span | |
| class="transcript-text">of the data structure.</span></div> | |
| <div class="transcript-line" data-begin="608.8"><span class="transcript-timestamp">10:08</span><span | |
| class="transcript-text">So you're doing data | |
| structures in general.</span></div> | |
| <div class="transcript-line" data-begin="611.29"><span class="transcript-timestamp">10:11</span><span | |
| class="transcript-text">We have update operations | |
| and query operations.</span></div> | |
| <div class="transcript-line" data-begin="614.55"><span class="transcript-timestamp">10:14</span><span | |
| class="transcript-text">We're mainly concerned | |
| about updates here.</span></div> | |
| <div class="transcript-line" data-begin="616.387"><span class="transcript-timestamp">10:16</span><span | |
| class="transcript-text">Every time you do an | |
| update, you think of it</span></div> | |
| <div class="transcript-line" data-begin="618.22"><span class="transcript-timestamp">10:18</span><span | |
| class="transcript-text">as taking a version of the data | |
| structure and making a new one.</span></div> | |
| <div class="transcript-line" data-begin="621.73"><span class="transcript-timestamp">10:21</span><span | |
| class="transcript-text">And you never want to | |
| destroy old versions.</span></div> | |
| <div class="transcript-line" data-begin="623.8"><span class="transcript-timestamp">10:23</span><span | |
| class="transcript-text">So even though an update | |
| like an insert or something</span></div> | |
| <div class="transcript-line" data-begin="626.23"><span class="transcript-timestamp">10:26</span><span | |
| class="transcript-text">changes the data structure, we | |
| want to remember that past data</span></div> | |
| <div class="transcript-line" data-begin="629.23"><span class="transcript-timestamp">10:29</span><span | |
| class="transcript-text">as well.</span></div> | |
| <div class="transcript-line" data-begin="630.77"><span class="transcript-timestamp">10:30</span><span | |
| class="transcript-text">And then let's make | |
| this reasonable.</span></div> | |
| <div class="transcript-line" data-begin="634.03"><span class="transcript-timestamp">10:34</span><span | |
| class="transcript-text">All data structure operations | |
| are relative to a specified</span></div> | |
| <div class="transcript-line" data-begin="637.791"><span class="transcript-timestamp">10:37</span><span | |
| class="transcript-text">version.</span></div> | |
| <div class="transcript-line" data-begin="647.2"><span class="transcript-timestamp">10:47</span><span | |
| class="transcript-text">So an update makes and | |
| returns a new version.</span></div> | |
| <div class="transcript-line" data-begin="665.69"><span class="transcript-timestamp">11:05</span><span | |
| class="transcript-text">So when you do an | |
| insert, you specify</span></div> | |
| <div class="transcript-line" data-begin="668.75"><span class="transcript-timestamp">11:08</span><span | |
| class="transcript-text">a version of your data | |
| structure and the thing</span></div> | |
| <div class="transcript-line" data-begin="670.85"><span class="transcript-timestamp">11:10</span><span | |
| class="transcript-text">you want to insert.</span></div> | |
| <div class="transcript-line" data-begin="671.96"><span class="transcript-timestamp">11:11</span><span | |
| class="transcript-text">And the output is a new version.</span></div> | |
| <div class="transcript-line" data-begin="673.85"><span class="transcript-timestamp">11:13</span><span | |
| class="transcript-text">So then you could insert into | |
| that new version, keep going,</span></div> | |
| <div class="transcript-line" data-begin="676.55"><span class="transcript-timestamp">11:16</span><span | |
| class="transcript-text">or maybe go back to the | |
| old version, modify that.</span></div> | |
| <div class="transcript-line" data-begin="680.21"><span class="transcript-timestamp">11:20</span><span | |
| class="transcript-text">I haven't said exactly | |
| what's allowed here,</span></div> | |
| <div class="transcript-line" data-begin="682.45"><span class="transcript-timestamp">11:22</span><span | |
| class="transcript-text">but this is sort of | |
| the general goal.</span></div> | |
| <div class="transcript-line" data-begin="685.46"><span class="transcript-timestamp">11:25</span><span | |
| class="transcript-text">And then there are four | |
| levels of persistence</span></div> | |
| <div class="transcript-line" data-begin="690.95"><span class="transcript-timestamp">11:30</span><span | |
| class="transcript-text">that you might want to get.</span></div> | |
| <div class="transcript-line" data-begin="693.02"><span class="transcript-timestamp">11:33</span><span | |
| class="transcript-text">First level is called | |
| partial persistence.</span></div> | |
| <div class="transcript-line" data-begin="697.44"><span class="transcript-timestamp">11:37</span><span | |
| class="transcript-text">This is the easiest to obtain.</span></div> | |
| <div class="transcript-line" data-begin="704.3"><span class="transcript-timestamp">11:44</span><span | |
| class="transcript-text">And in partial | |
| persistence, you're</span></div> | |
| <div class="transcript-line" data-begin="707.63"><span class="transcript-timestamp">11:47</span><span | |
| class="transcript-text">only allowed to update | |
| the latest version, which</span></div> | |
| <div class="transcript-line" data-begin="715.46"><span class="transcript-timestamp">11:55</span><span | |
| class="transcript-text">means the versions | |
| are linearly ordered.</span></div> | |
| <div class="transcript-line" data-begin="721.67"><span class="transcript-timestamp">12:01</span><span | |
| class="transcript-text">This is the easiest | |
| to think about.</span></div> | |
| <div class="transcript-line" data-begin="723.77"><span class="transcript-timestamp">12:03</span><span | |
| class="transcript-text">And time travel can easily get | |
| confusing, so start simple.</span></div> | |
| <div class="transcript-line" data-begin="729.3"><span class="transcript-timestamp">12:09</span><span | |
| class="transcript-text">We have a timeline of | |
| various versions on it.</span></div> | |
| <div class="transcript-line" data-begin="734.78"><span class="transcript-timestamp">12:14</span><span | |
| class="transcript-text">This is the latest.</span></div> | |
| <div class="transcript-line" data-begin="737.42"><span class="transcript-timestamp">12:17</span><span | |
| class="transcript-text">And what we can do is | |
| update that version.</span></div> | |
| <div class="transcript-line" data-begin="739.85"><span class="transcript-timestamp">12:19</span><span | |
| class="transcript-text">We'll get a new version, and | |
| then our latest is this one.</span></div> | |
| <div class="transcript-line" data-begin="743.75"><span class="transcript-timestamp">12:23</span><span | |
| class="transcript-text">What this allows is looking back | |
| at the past to an old version</span></div> | |
| <div class="transcript-line" data-begin="747.95"><span class="transcript-timestamp">12:27</span><span | |
| class="transcript-text">and querying that version.</span></div> | |
| <div class="transcript-line" data-begin="749.282"><span class="transcript-timestamp">12:29</span><span | |
| class="transcript-text">So you can still ask questions | |
| about the old version,</span></div> | |
| <div class="transcript-line" data-begin="751.49"><span class="transcript-timestamp">12:31</span><span | |
| class="transcript-text">if you want to be able to do | |
| a search on any of these data</span></div> | |
| <div class="transcript-line" data-begin="753.83"><span class="transcript-timestamp">12:33</span><span | |
| class="transcript-text">structures.</span></div> | |
| <div class="transcript-line" data-begin="754.329"><span class="transcript-timestamp">12:34</span><span | |
| class="transcript-text">But you can't change them.</span></div> | |
| <div class="transcript-line" data-begin="755.6"><span class="transcript-timestamp">12:35</span><span | |
| class="transcript-text">You can only change the | |
| most recent version.</span></div> | |
| <div class="transcript-line" data-begin="758.18"><span class="transcript-timestamp">12:38</span><span | |
| class="transcript-text">So that's nice.</span></div> | |
| <div class="transcript-line" data-begin="759.47"><span class="transcript-timestamp">12:39</span><span | |
| class="transcript-text">It's kind of like time | |
| machine on Mac, I guess.</span></div> | |
| <div class="transcript-line" data-begin="764.69"><span class="transcript-timestamp">12:44</span><span | |
| class="transcript-text">If you've ever seen the | |
| movie Deja Vu, which is not</span></div> | |
| <div class="transcript-line" data-begin="766.97"><span class="transcript-timestamp">12:46</span><span | |
| class="transcript-text">very common, but it's | |
| a good time travel</span></div> | |
| <div class="transcript-line" data-begin="768.636"><span class="transcript-timestamp">12:48</span><span | |
| class="transcript-text">movie, in the first half of | |
| the movie, all they can do</span></div> | |
| <div class="transcript-line" data-begin="771.5"><span class="transcript-timestamp">12:51</span><span | |
| class="transcript-text">is look back at the past.</span></div> | |
| <div class="transcript-line" data-begin="772.55"><span class="transcript-timestamp">12:52</span><span | |
| class="transcript-text">Later they discover | |
| that actually they</span></div> | |
| <div class="transcript-line" data-begin="774.71"><span class="transcript-timestamp">12:54</span><span | |
| class="transcript-text">have a full persistence model.</span></div> | |
| <div class="transcript-line" data-begin="777.85"><span class="transcript-timestamp">12:57</span><span | |
| class="transcript-text">It takes a while | |
| for dramatic effect.</span></div> | |
| <div class="transcript-line" data-begin="784.25"><span class="transcript-timestamp">13:04</span><span | |
| class="transcript-text">In full persistence, you can | |
| update anything you want--</span></div> | |
| <div class="transcript-line" data-begin="788.75"><span class="transcript-timestamp">13:08</span><span | |
| class="transcript-text">so update any version.</span></div> | |
| <div class="transcript-line" data-begin="798.07"><span class="transcript-timestamp">13:18</span><span | |
| class="transcript-text">and so then the | |
| versions form a tree.</span></div> | |
| <div class="transcript-line" data-begin="807.96"><span class="transcript-timestamp">13:27</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="808.46"><span class="transcript-timestamp">13:28</span><span | |
| class="transcript-text">So in this model, | |
| maybe you initially</span></div> | |
| <div class="transcript-line" data-begin="810.2"><span class="transcript-timestamp">13:30</span><span | |
| class="transcript-text">have a nice line of versions.</span></div> | |
| <div class="transcript-line" data-begin="812.42"><span class="transcript-timestamp">13:32</span><span | |
| class="transcript-text">But now if I go back to | |
| this version and update it,</span></div> | |
| <div class="transcript-line" data-begin="814.86"><span class="transcript-timestamp">13:34</span><span | |
| class="transcript-text">I branch, get a | |
| new version here.</span></div> | |
| <div class="transcript-line" data-begin="817.34"><span class="transcript-timestamp">13:37</span><span | |
| class="transcript-text">And then I might keep modifying | |
| that version sometimes.</span></div> | |
| <div class="transcript-line" data-begin="820.4"><span class="transcript-timestamp">13:40</span><span | |
| class="transcript-text">Any of these guys can branch.</span></div> | |
| <div class="transcript-line" data-begin="824.24"><span class="transcript-timestamp">13:44</span><span | |
| class="transcript-text">So this is why I call it the | |
| branching universe model, when</span></div> | |
| <div class="transcript-line" data-begin="827.48"><span class="transcript-timestamp">13:47</span><span | |
| class="transcript-text">you update your branch.</span></div> | |
| <div class="transcript-line" data-begin="832.52"><span class="transcript-timestamp">13:52</span><span | |
| class="transcript-text">So no version ever | |
| gets destroyed here.</span></div> | |
| <div class="transcript-line" data-begin="834.38"><span class="transcript-timestamp">13:54</span><span | |
| class="transcript-text">Again, you can | |
| query all versions.</span></div> | |
| <div class="transcript-line" data-begin="836.72"><span class="transcript-timestamp">13:56</span><span | |
| class="transcript-text">But now you can also | |
| update any version.</span></div> | |
| <div class="transcript-line" data-begin="839.36"><span class="transcript-timestamp">13:59</span><span | |
| class="transcript-text">But you just make a new version.</span></div> | |
| <div class="transcript-line" data-begin="840.71"><span class="transcript-timestamp">14:00</span><span | |
| class="transcript-text">It's a totally new world.</span></div> | |
| <div class="transcript-line" data-begin="842.66"><span class="transcript-timestamp">14:02</span><span | |
| class="transcript-text">When I update this | |
| version, this version</span></div> | |
| <div class="transcript-line" data-begin="844.49"><span class="transcript-timestamp">14:04</span><span | |
| class="transcript-text">knows nothing about all the--</span></div> | |
| <div class="transcript-line" data-begin="846.41"><span class="transcript-timestamp">14:06</span><span | |
| class="transcript-text">this doesn't know | |
| about this future.</span></div> | |
| <div class="transcript-line" data-begin="847.94"><span class="transcript-timestamp">14:07</span><span | |
| class="transcript-text">It's created its own future.</span></div> | |
| <div class="transcript-line" data-begin="850.89"><span class="transcript-timestamp">14:10</span><span | |
| class="transcript-text">There's no way to sort of | |
| merge those universes together.</span></div> | |
| <div class="transcript-line" data-begin="854.31"><span class="transcript-timestamp">14:14</span><span | |
| class="transcript-text">It's kind of sad.</span></div> | |
| <div class="transcript-line" data-begin="856.91"><span class="transcript-timestamp">14:16</span><span | |
| class="transcript-text">That's why we have the | |
| third level of persistence,</span></div> | |
| <div class="transcript-line" data-begin="862.22"><span class="transcript-timestamp">14:22</span><span | |
| class="transcript-text">which lets us merge timelines.</span></div> | |
| <div class="transcript-line" data-begin="864.68"><span class="transcript-timestamp">14:24</span><span | |
| class="transcript-text">It's great for lots | |
| of fiction out there.</span></div> | |
| <div class="transcript-line" data-begin="875.88"><span class="transcript-timestamp">14:35</span><span | |
| class="transcript-text">If you've seen the | |
| old TV show Sliders,</span></div> | |
| <div class="transcript-line" data-begin="878.36"><span class="transcript-timestamp">14:38</span><span | |
| class="transcript-text">that would be | |
| confluent persistence.</span></div> | |
| <div class="transcript-line" data-begin="890.83"><span class="transcript-timestamp">14:50</span><span | |
| class="transcript-text">So confluent persistence, | |
| you can combine two versions</span></div> | |
| <div class="transcript-line" data-begin="901.79"><span class="transcript-timestamp">15:01</span><span | |
| class="transcript-text">to create a new version.</span></div> | |
| <div class="transcript-line" data-begin="909.22"><span class="transcript-timestamp">15:09</span><span | |
| class="transcript-text">And in this case, again, you | |
| can't destroy old versions.</span></div> | |
| <div class="transcript-line" data-begin="913.72"><span class="transcript-timestamp">15:13</span><span | |
| class="transcript-text">In persistence, you | |
| never destroy versions.</span></div> | |
| <div class="transcript-line" data-begin="916.26"><span class="transcript-timestamp">15:16</span><span | |
| class="transcript-text">So now the versions form a | |
| DAG, directed acyclic graph.</span></div> | |
| <div class="transcript-line" data-begin="922.52"><span class="transcript-timestamp">15:22</span><span | |
| class="transcript-text">So now we're allowing--</span></div> | |
| <div class="transcript-line" data-begin="924.01"><span class="transcript-timestamp">15:24</span><span | |
| class="transcript-text">OK, you make some | |
| changes, whatever.</span></div> | |
| <div class="transcript-line" data-begin="925.52"><span class="transcript-timestamp">15:25</span><span | |
| class="transcript-text">You branch your universe, | |
| make some changes.</span></div> | |
| <div class="transcript-line" data-begin="930.274"><span class="transcript-timestamp">15:30</span><span | |
| class="transcript-text">And now I can say, OK, take | |
| this version of the data</span></div> | |
| <div class="transcript-line" data-begin="932.44"><span class="transcript-timestamp">15:32</span><span | |
| class="transcript-text">structure and this version | |
| and recombine them.</span></div> | |
| <div class="transcript-line" data-begin="935.51"><span class="transcript-timestamp">15:35</span><span | |
| class="transcript-text">Get a new version, and then | |
| maybe make some more changes.</span></div> | |
| <div class="transcript-line" data-begin="938.73"><span class="transcript-timestamp">15:38</span><span | |
| class="transcript-text">OK, what does combine mean?</span></div> | |
| <div class="transcript-line" data-begin="940.654"><span class="transcript-timestamp">15:40</span><span | |
| class="transcript-text">Well, it depends on | |
| your data structure.</span></div> | |
| <div class="transcript-line" data-begin="942.32"><span class="transcript-timestamp">15:42</span><span | |
| class="transcript-text">A lot of data structures | |
| have combine operations</span></div> | |
| <div class="transcript-line" data-begin="944.42"><span class="transcript-timestamp">15:44</span><span | |
| class="transcript-text">like if you have linked lists, | |
| you have two linked lists,</span></div> | |
| <div class="transcript-line" data-begin="948.029"><span class="transcript-timestamp">15:48</span><span | |
| class="transcript-text">you can concatenate them.</span></div> | |
| <div class="transcript-line" data-begin="949.07"><span class="transcript-timestamp">15:49</span><span | |
| class="transcript-text">That's an easy operation.</span></div> | |
| <div class="transcript-line" data-begin="950.18"><span class="transcript-timestamp">15:50</span><span | |
| class="transcript-text">Even if you have | |
| binary search trees,</span></div> | |
| <div class="transcript-line" data-begin="951.721"><span class="transcript-timestamp">15:51</span><span | |
| class="transcript-text">you can concatenate | |
| them reasonably easy</span></div> | |
| <div class="transcript-line" data-begin="953.75"><span class="transcript-timestamp">15:53</span><span | |
| class="transcript-text">and combine it into one | |
| big binary search tree.</span></div> | |
| <div class="transcript-line" data-begin="956.67"><span class="transcript-timestamp">15:56</span><span | |
| class="transcript-text">So if your data structure | |
| has an operation that</span></div> | |
| <div class="transcript-line" data-begin="959.06"><span class="transcript-timestamp">15:59</span><span | |
| class="transcript-text">takes as input two | |
| data structures,</span></div> | |
| <div class="transcript-line" data-begin="961.85"><span class="transcript-timestamp">16:01</span><span | |
| class="transcript-text">then what we're saying is now | |
| it can take two versions, which</span></div> | |
| <div class="transcript-line" data-begin="965.15"><span class="transcript-timestamp">16:05</span><span | |
| class="transcript-text">is more general.</span></div> | |
| <div class="transcript-line" data-begin="966.43"><span class="transcript-timestamp">16:06</span><span | |
| class="transcript-text">So I could take the | |
| same data structure,</span></div> | |
| <div class="transcript-line" data-begin="968.24"><span class="transcript-timestamp">16:08</span><span | |
| class="transcript-text">make some changes in | |
| one way, separately make</span></div> | |
| <div class="transcript-line" data-begin="970.43"><span class="transcript-timestamp">16:10</span><span | |
| class="transcript-text">some changes in a | |
| different way, and then</span></div> | |
| <div class="transcript-line" data-begin="972.138"><span class="transcript-timestamp">16:12</span><span | |
| class="transcript-text">try to concatenate them | |
| or do something crazy.</span></div> | |
| <div class="transcript-line" data-begin="974.66"><span class="transcript-timestamp">16:14</span><span | |
| class="transcript-text">This is hard to | |
| do, and most of it</span></div> | |
| <div class="transcript-line" data-begin="976.55"><span class="transcript-timestamp">16:16</span><span | |
| class="transcript-text">is an open problem | |
| whether it can be done.</span></div> | |
| <div class="transcript-line" data-begin="979.09"><span class="transcript-timestamp">16:19</span><span | |
| class="transcript-text">But I'll tell you about it.</span></div> | |
| <div class="transcript-line" data-begin="981.59"><span class="transcript-timestamp">16:21</span><span | |
| class="transcript-text">Then there's another level | |
| even more than confluent</span></div> | |
| <div class="transcript-line" data-begin="984.86"><span class="transcript-timestamp">16:24</span><span | |
| class="transcript-text">persistence.</span></div> | |
| <div class="transcript-line" data-begin="986.55"><span class="transcript-timestamp">16:26</span><span | |
| class="transcript-text">This is hard to interpret | |
| in the time travel world,</span></div> | |
| <div class="transcript-line" data-begin="990.59"><span class="transcript-timestamp">16:30</span><span | |
| class="transcript-text">but it would be functional | |
| data structures.</span></div> | |
| <div class="transcript-line" data-begin="992.43"><span class="transcript-timestamp">16:32</span><span | |
| class="transcript-text">If you've ever programmed | |
| in a functional programming</span></div> | |
| <div class="transcript-line" data-begin="994.13"><span class="transcript-timestamp">16:34</span><span | |
| class="transcript-text">language, it's a little bit | |
| annoying from an algorithm's</span></div> | |
| <div class="transcript-line" data-begin="996.8"><span class="transcript-timestamp">16:36</span><span | |
| class="transcript-text">perspective, because it | |
| constrains you to work</span></div> | |
| <div class="transcript-line" data-begin="999.65"><span class="transcript-timestamp">16:39</span><span | |
| class="transcript-text">in a purely functional world.</span></div> | |
| <div class="transcript-line" data-begin="1003.22"><span class="transcript-timestamp">16:43</span><span | |
| class="transcript-text">You can never modify anything.</span></div> | |
| <div class="transcript-line" data-begin="1005.9"><span class="transcript-timestamp">16:45</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="1006.4"><span class="transcript-timestamp">16:46</span><span | |
| class="transcript-text">Now, we don't want | |
| to modify versions.</span></div> | |
| <div class="transcript-line" data-begin="1009.22"><span class="transcript-timestamp">16:49</span><span | |
| class="transcript-text">That's fine.</span></div> | |
| <div class="transcript-line" data-begin="1009.83"><span class="transcript-timestamp">16:49</span><span | |
| class="transcript-text">But in a functional | |
| data structure,</span></div> | |
| <div class="transcript-line" data-begin="1011.288"><span class="transcript-timestamp">16:51</span><span | |
| class="transcript-text">you're not allowed to | |
| modify any nodes ever.</span></div> | |
| <div class="transcript-line" data-begin="1014.11"><span class="transcript-timestamp">16:54</span><span | |
| class="transcript-text">All you can do is | |
| make new notes.</span></div> | |
| <div class="transcript-line" data-begin="1023.67"><span class="transcript-timestamp">17:03</span><span | |
| class="transcript-text">This is constraining, | |
| and you can't always</span></div> | |
| <div class="transcript-line" data-begin="1027.317"><span class="transcript-timestamp">17:07</span><span | |
| class="transcript-text">get optimal running times | |
| in the functional world.</span></div> | |
| <div class="transcript-line" data-begin="1029.4"><span class="transcript-timestamp">17:09</span><span | |
| class="transcript-text">But if you can get a | |
| functional data structure,</span></div> | |
| <div class="transcript-line" data-begin="1031.358"><span class="transcript-timestamp">17:11</span><span | |
| class="transcript-text">you have all these | |
| things, because you</span></div> | |
| <div class="transcript-line" data-begin="1033.3"><span class="transcript-timestamp">17:13</span><span | |
| class="transcript-text">can't destroy anything.</span></div> | |
| <div class="transcript-line" data-begin="1034.259"><span class="transcript-timestamp">17:14</span><span | |
| class="transcript-text">If you can't destroy | |
| nodes, then in particular,</span></div> | |
| <div class="transcript-line" data-begin="1036.216"><span class="transcript-timestamp">17:16</span><span | |
| class="transcript-text">you can't destroy versions.</span></div> | |
| <div class="transcript-line" data-begin="1037.43"><span class="transcript-timestamp">17:17</span><span | |
| class="transcript-text">And all of these things | |
| just work for free.</span></div> | |
| <div class="transcript-line" data-begin="1039.93"><span class="transcript-timestamp">17:19</span><span | |
| class="transcript-text">And so a bunch of | |
| special cases are known,</span></div> | |
| <div class="transcript-line" data-begin="1042.957"><span class="transcript-timestamp">17:22</span><span | |
| class="transcript-text">interesting special | |
| cases, like search trees</span></div> | |
| <div class="transcript-line" data-begin="1044.79"><span class="transcript-timestamp">17:24</span><span | |
| class="transcript-text">you can do in the | |
| functional world.</span></div> | |
| <div class="transcript-line" data-begin="1046.47"><span class="transcript-timestamp">17:26</span><span | |
| class="transcript-text">And that makes all | |
| of these things easy.</span></div> | |
| <div class="transcript-line" data-begin="1049.05"><span class="transcript-timestamp">17:29</span><span | |
| class="transcript-text">So the rest of this | |
| lecture is going</span></div> | |
| <div class="transcript-line" data-begin="1050.79"><span class="transcript-timestamp">17:30</span><span | |
| class="transcript-text">to be general techniques for | |
| doing partial full persistence,</span></div> | |
| <div class="transcript-line" data-begin="1054.27"><span class="transcript-timestamp">17:34</span><span | |
| class="transcript-text">what we know about | |
| confluent, and what</span></div> | |
| <div class="transcript-line" data-begin="1056.25"><span class="transcript-timestamp">17:36</span><span | |
| class="transcript-text">we know about functional, | |
| brief overview.</span></div> | |
| <div class="transcript-line" data-begin="1061.06"><span class="transcript-timestamp">17:41</span><span | |
| class="transcript-text">Any questions about those | |
| goals, problem definitions?</span></div> | |
| <div class="transcript-line" data-begin="1067.64"><span class="transcript-timestamp">17:47</span><span | |
| class="transcript-text">Yeah.</span></div> | |
| <div class="transcript-line" data-begin="1068.191"><span class="transcript-timestamp">17:48</span><span | |
| class="transcript-text">AUDIENCE: I'm still confused | |
| about functional, because--</span></div> | |
| <div class="transcript-line" data-begin="1070.834"><span class="transcript-timestamp">17:50</span><span | |
| class="transcript-text">ERIK DEMAINE: What | |
| does functional mean?</span></div> | |
| <div class="transcript-line" data-begin="1072.5"><span class="transcript-timestamp">17:52</span><span | |
| class="transcript-text">AUDIENCE: [INAUDIBLE]</span></div> | |
| <div class="transcript-line" data-begin="1075.26"><span class="transcript-timestamp">17:55</span><span | |
| class="transcript-text">ERIK DEMAINE: Yeah, I | |
| guess you'll see what--</span></div> | |
| <div class="transcript-line" data-begin="1077.68"><span class="transcript-timestamp">17:57</span><span | |
| class="transcript-text">functional looks like all | |
| the other things, I agree.</span></div> | |
| <div class="transcript-line" data-begin="1080.2"><span class="transcript-timestamp">18:00</span><span | |
| class="transcript-text">You'll see in a moment | |
| how we actually implement</span></div> | |
| <div class="transcript-line" data-begin="1082.36"><span class="transcript-timestamp">18:02</span><span | |
| class="transcript-text">partial and persistence.</span></div> | |
| <div class="transcript-line" data-begin="1083.38"><span class="transcript-timestamp">18:03</span><span | |
| class="transcript-text">We're going to be | |
| changing nodes a lot.</span></div> | |
| <div class="transcript-line" data-begin="1087.49"><span class="transcript-timestamp">18:07</span><span | |
| class="transcript-text">As long as we still | |
| represent the same data</span></div> | |
| <div class="transcript-line" data-begin="1090.67"><span class="transcript-timestamp">18:10</span><span | |
| class="transcript-text">in the old versions, we | |
| don't have to represent it</span></div> | |
| <div class="transcript-line" data-begin="1093.04"><span class="transcript-timestamp">18:13</span><span | |
| class="transcript-text">in the same way.</span></div> | |
| <div class="transcript-line" data-begin="1094.164"><span class="transcript-timestamp">18:14</span><span | |
| class="transcript-text">That lets us do things | |
| more efficiently.</span></div> | |
| <div class="transcript-line" data-begin="1095.83"><span class="transcript-timestamp">18:15</span><span | |
| class="transcript-text">Whereas in functional, | |
| you have to represent</span></div> | |
| <div class="transcript-line" data-begin="1097.72"><span class="transcript-timestamp">18:17</span><span | |
| class="transcript-text">all the old versions | |
| in exactly the way</span></div> | |
| <div class="transcript-line" data-begin="1099.43"><span class="transcript-timestamp">18:19</span><span | |
| class="transcript-text">you used to represent them.</span></div> | |
| <div class="transcript-line" data-begin="1100.794"><span class="transcript-timestamp">18:20</span><span | |
| class="transcript-text">Here we can kind of | |
| mangle things around</span></div> | |
| <div class="transcript-line" data-begin="1102.46"><span class="transcript-timestamp">18:22</span><span | |
| class="transcript-text">and it makes things faster.</span></div> | |
| <div class="transcript-line" data-begin="1103.585"><span class="transcript-timestamp">18:23</span><span | |
| class="transcript-text">Yeah, good question.</span></div> | |
| <div class="transcript-line" data-begin="1105.49"><span class="transcript-timestamp">18:25</span><span | |
| class="transcript-text">So it seems almost the same, | |
| but it's nodes versus versions.</span></div> | |
| <div class="transcript-line" data-begin="1109.882"><span class="transcript-timestamp">18:29</span><span | |
| class="transcript-text">I haven't really | |
| defined a version.</span></div> | |
| <div class="transcript-line" data-begin="1111.34"><span class="transcript-timestamp">18:31</span><span | |
| class="transcript-text">But it's just that all the | |
| queries answer the same way.</span></div> | |
| <div class="transcript-line" data-begin="1114.58"><span class="transcript-timestamp">18:34</span><span | |
| class="transcript-text">That's what you need | |
| for persistence.</span></div> | |
| <div class="transcript-line" data-begin="1118.58"><span class="transcript-timestamp">18:38</span><span | |
| class="transcript-text">Other questions?</span></div> | |
| <div class="transcript-line" data-begin="1120.78"><span class="transcript-timestamp">18:40</span><span | |
| class="transcript-text">All right.</span></div> | |
| <div class="transcript-line" data-begin="1123.62"><span class="transcript-timestamp">18:43</span><span | |
| class="transcript-text">Well, let's do some | |
| real data structures.</span></div> | |
| <div class="transcript-line" data-begin="1129.66"><span class="transcript-timestamp">18:49</span><span | |
| class="transcript-text">We start with | |
| partial persistence.</span></div> | |
| <div class="transcript-line" data-begin="1135.907"><span class="transcript-timestamp">18:55</span><span | |
| class="transcript-text">This is the easiest.</span></div> | |
| <div class="transcript-line" data-begin="1139.68"><span class="transcript-timestamp">18:59</span><span | |
| class="transcript-text">For both partial and | |
| full persistence,</span></div> | |
| <div class="transcript-line" data-begin="1142.08"><span class="transcript-timestamp">19:02</span><span | |
| class="transcript-text">there is the following result. | |
| Any pointer machine data</span></div> | |
| <div class="transcript-line" data-begin="1146.4"><span class="transcript-timestamp">19:06</span><span | |
| class="transcript-text">structure, one catch with a | |
| constant number of pointers</span></div> | |
| <div class="transcript-line" data-begin="1159.66"><span class="transcript-timestamp">19:19</span><span | |
| class="transcript-text">to any node--</span></div> | |
| <div class="transcript-line" data-begin="1162.22"><span class="transcript-timestamp">19:22</span><span | |
| class="transcript-text">so this is constant n degree.</span></div> | |
| <div class="transcript-line" data-begin="1167.726"><span class="transcript-timestamp">19:27</span><span | |
| class="transcript-text">In a pointer machine, you | |
| always have a constant number</span></div> | |
| <div class="transcript-line" data-begin="1170.017"><span class="transcript-timestamp">19:30</span><span | |
| class="transcript-text">of pointers out | |
| of a node at most.</span></div> | |
| <div class="transcript-line" data-begin="1172.54"><span class="transcript-timestamp">19:32</span><span | |
| class="transcript-text">But for this result | |
| to hold, we also</span></div> | |
| <div class="transcript-line" data-begin="1174.54"><span class="transcript-timestamp">19:34</span><span | |
| class="transcript-text">need a constant number of | |
| pointers into any node.</span></div> | |
| <div class="transcript-line" data-begin="1177.28"><span class="transcript-timestamp">19:37</span><span | |
| class="transcript-text">So this is an extra constraint.</span></div> | |
| <div class="transcript-line" data-begin="1182.91"><span class="transcript-timestamp">19:42</span><span | |
| class="transcript-text">Can be transformed into | |
| another data structure that</span></div> | |
| <div class="transcript-line" data-begin="1187.32"><span class="transcript-timestamp">19:47</span><span | |
| class="transcript-text">is partially persistent and does | |
| all the things it used to do--</span></div> | |
| <div class="transcript-line" data-begin="1193.77"><span class="transcript-timestamp">19:53</span><span | |
| class="transcript-text">so I'll just say, can be | |
| made partially persistent.</span></div> | |
| <div class="transcript-line" data-begin="1200.3"><span class="transcript-timestamp">20:00</span><span | |
| class="transcript-text">You have to pay something, but | |
| you have to pay very little--</span></div> | |
| <div class="transcript-line" data-begin="1203.55"><span class="transcript-timestamp">20:03</span><span | |
| class="transcript-text">constant amortized | |
| factor overhead,</span></div> | |
| <div class="transcript-line" data-begin="1212.55"><span class="transcript-timestamp">20:12</span><span | |
| class="transcript-text">multiplicative overhead | |
| and constant amount</span></div> | |
| <div class="transcript-line" data-begin="1221.86"><span class="transcript-timestamp">20:21</span><span | |
| class="transcript-text">of additive space per change | |
| in the data structure.</span></div> | |
| <div class="transcript-line" data-begin="1230.29"><span class="transcript-timestamp">20:30</span><span | |
| class="transcript-text">So every time you do a | |
| modification in your pointer</span></div> | |
| <div class="transcript-line" data-begin="1233.66"><span class="transcript-timestamp">20:33</span><span | |
| class="transcript-text">machine-- you set one of | |
| the fields to something--</span></div> | |
| <div class="transcript-line" data-begin="1236.26"><span class="transcript-timestamp">20:36</span><span | |
| class="transcript-text">you have to store that forever.</span></div> | |
| <div class="transcript-line" data-begin="1237.83"><span class="transcript-timestamp">20:37</span><span | |
| class="transcript-text">So, I mean, this is the | |
| best you could hope to do.</span></div> | |
| <div class="transcript-line" data-begin="1239.98"><span class="transcript-timestamp">20:39</span><span | |
| class="transcript-text">You've got to store | |
| everything that happened.</span></div> | |
| <div class="transcript-line" data-begin="1243.25"><span class="transcript-timestamp">20:43</span><span | |
| class="transcript-text">You pay a constant | |
| factor overhead, eh.</span></div> | |
| <div class="transcript-line" data-begin="1245.76"><span class="transcript-timestamp">20:45</span><span | |
| class="transcript-text">We're theoreticians.</span></div> | |
| <div class="transcript-line" data-begin="1246.67"><span class="transcript-timestamp">20:46</span><span | |
| class="transcript-text">That doesn't matter.</span></div> | |
| <div class="transcript-line" data-begin="1248.17"><span class="transcript-timestamp">20:48</span><span | |
| class="transcript-text">Then you get any data | |
| structure in this world</span></div> | |
| <div class="transcript-line" data-begin="1250.84"><span class="transcript-timestamp">20:50</span><span | |
| class="transcript-text">can be made | |
| partially persistent.</span></div> | |
| <div class="transcript-line" data-begin="1253.27"><span class="transcript-timestamp">20:53</span><span | |
| class="transcript-text">That's nice.</span></div> | |
| <div class="transcript-line" data-begin="1254.026"><span class="transcript-timestamp">20:54</span><span | |
| class="transcript-text">Let's prove it.</span></div> | |
| <div class="transcript-line" data-begin="1260.33"><span class="transcript-timestamp">21:00</span><span | |
| class="transcript-text">OK, the idea is pretty simple.</span></div> | |
| <div class="transcript-line" data-begin="1264.78"><span class="transcript-timestamp">21:04</span><span | |
| class="transcript-text">Pointer machines are all | |
| about nodes and fields.</span></div> | |
| <div class="transcript-line" data-begin="1266.79"><span class="transcript-timestamp">21:06</span><span | |
| class="transcript-text">So we just need to simulate | |
| whatever the data structure is</span></div> | |
| <div class="transcript-line" data-begin="1269.82"><span class="transcript-timestamp">21:09</span><span | |
| class="transcript-text">doing to those nodes | |
| and fields in a way</span></div> | |
| <div class="transcript-line" data-begin="1271.71"><span class="transcript-timestamp">21:11</span><span | |
| class="transcript-text">that we don't lose | |
| all the information</span></div> | |
| <div class="transcript-line" data-begin="1273.54"><span class="transcript-timestamp">21:13</span><span | |
| class="transcript-text">and we can still | |
| search it very quickly.</span></div> | |
| <div class="transcript-line" data-begin="1277.32"><span class="transcript-timestamp">21:17</span><span | |
| class="transcript-text">First idea is to | |
| store back pointers.</span></div> | |
| <div class="transcript-line" data-begin="1281.19"><span class="transcript-timestamp">21:21</span><span | |
| class="transcript-text">And this is why we need the | |
| constant n degree constraint.</span></div> | |
| <div class="transcript-line" data-begin="1287.53"><span class="transcript-timestamp">21:27</span><span | |
| class="transcript-text">So if we have a node--</span></div> | |
| <div class="transcript-line" data-begin="1291.075"><span class="transcript-timestamp">21:31</span><span | |
| class="transcript-text">how do I want to | |
| draw a node here?</span></div> | |
| <div class="transcript-line" data-begin="1295.64"><span class="transcript-timestamp">21:35</span><span | |
| class="transcript-text">So maybe these are the | |
| three fields of the node.</span></div> | |
| <div class="transcript-line" data-begin="1298.7"><span class="transcript-timestamp">21:38</span><span | |
| class="transcript-text">I want to also store | |
| some back pointers.</span></div> | |
| <div class="transcript-line" data-begin="1302.93"><span class="transcript-timestamp">21:42</span><span | |
| class="transcript-text">Whenever there is a node | |
| that points to this node,</span></div> | |
| <div class="transcript-line" data-begin="1308.48"><span class="transcript-timestamp">21:48</span><span | |
| class="transcript-text">I want to have a | |
| back pointer that</span></div> | |
| <div class="transcript-line" data-begin="1310.67"><span class="transcript-timestamp">21:50</span><span | |
| class="transcript-text">points back so I know where | |
| all the pointers came from.</span></div> | |
| <div class="transcript-line" data-begin="1314.21"><span class="transcript-timestamp">21:54</span><span | |
| class="transcript-text">If there's only p pointers, | |
| then this is fine.</span></div> | |
| <div class="transcript-line" data-begin="1317.6"><span class="transcript-timestamp">21:57</span><span | |
| class="transcript-text">There'll be p fields here.</span></div> | |
| <div class="transcript-line" data-begin="1320.96"><span class="transcript-timestamp">22:00</span><span | |
| class="transcript-text">So still constant, still in | |
| the pointier machine model.</span></div> | |
| <div class="transcript-line" data-begin="1323.879"><span class="transcript-timestamp">22:03</span><span | |
| class="transcript-text">OK, I'm going to need | |
| some other stuff too.</span></div> | |
| <div class="transcript-line" data-begin="1328.67"><span class="transcript-timestamp">22:08</span><span | |
| class="transcript-text">So this is a simple thing, | |
| definitely want this.</span></div> | |
| <div class="transcript-line" data-begin="1331.31"><span class="transcript-timestamp">22:11</span><span | |
| class="transcript-text">Because if my nodes | |
| ever move around,</span></div> | |
| <div class="transcript-line" data-begin="1333.47"><span class="transcript-timestamp">22:13</span><span | |
| class="transcript-text">I've got to update | |
| the pointers to them.</span></div> | |
| <div class="transcript-line" data-begin="1335.172"><span class="transcript-timestamp">22:15</span><span | |
| class="transcript-text">And where are those pointers?</span></div> | |
| <div class="transcript-line" data-begin="1336.38"><span class="transcript-timestamp">22:16</span><span | |
| class="transcript-text">Well, the back pointers | |
| tell you where they are.</span></div> | |
| <div class="transcript-line" data-begin="1340.03"><span class="transcript-timestamp">22:20</span><span | |
| class="transcript-text">Nodes will still | |
| be constant size,</span></div> | |
| <div class="transcript-line" data-begin="1342.41"><span class="transcript-timestamp">22:22</span><span | |
| class="transcript-text">remain in pointer | |
| machine data structure.</span></div> | |
| <div class="transcript-line" data-begin="1345.5"><span class="transcript-timestamp">22:25</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="1346.34"><span class="transcript-timestamp">22:26</span><span | |
| class="transcript-text">That's idea one.</span></div> | |
| <div class="transcript-line" data-begin="1348.23"><span class="transcript-timestamp">22:28</span><span | |
| class="transcript-text">Idea two is this part.</span></div> | |
| <div class="transcript-line" data-begin="1355.08"><span class="transcript-timestamp">22:35</span><span | |
| class="transcript-text">This is going to store | |
| something called mods.</span></div> | |
| <div class="transcript-line" data-begin="1359.485"><span class="transcript-timestamp">22:39</span><span | |
| class="transcript-text">It could stand for something, | |
| but I'll leave it as mods.</span></div> | |
| <div class="transcript-line" data-begin="1364.02"><span class="transcript-timestamp">22:44</span><span | |
| class="transcript-text">So these are two of the | |
| fields of the data structure.</span></div> | |
| <div class="transcript-line" data-begin="1376.53"><span class="transcript-timestamp">22:56</span><span | |
| class="transcript-text">Ah, one convenience here | |
| is for back pointers,</span></div> | |
| <div class="transcript-line" data-begin="1381.48"><span class="transcript-timestamp">23:01</span><span | |
| class="transcript-text">I'm only going to store it for | |
| the latest version of the data</span></div> | |
| <div class="transcript-line" data-begin="1384.84"><span class="transcript-timestamp">23:04</span><span | |
| class="transcript-text">structure.</span></div> | |
| <div class="transcript-line" data-begin="1396.31"><span class="transcript-timestamp">23:16</span><span | |
| class="transcript-text">Sorry.</span></div> | |
| <div class="transcript-line" data-begin="1396.81"><span class="transcript-timestamp">23:16</span><span | |
| class="transcript-text">I forgot about that.</span></div> | |
| <div class="transcript-line" data-begin="1399.61"><span class="transcript-timestamp">23:19</span><span | |
| class="transcript-text">We'll come back to that later.</span></div> | |
| <div class="transcript-line" data-begin="1401.397"><span class="transcript-timestamp">23:21</span><span | |
| class="transcript-text">And then the idea is to | |
| store these modifications.</span></div> | |
| <div class="transcript-line" data-begin="1403.48"><span class="transcript-timestamp">23:23</span><span | |
| class="transcript-text">How many modifications?</span></div> | |
| <div class="transcript-line" data-begin="1405.73"><span class="transcript-timestamp">23:25</span><span | |
| class="transcript-text">Let's say up to p, twice p.</span></div> | |
| <div class="transcript-line" data-begin="1414.835"><span class="transcript-timestamp">23:34</span><span | |
| class="transcript-text">p was the bound on the | |
| n degree of a node.</span></div> | |
| <div class="transcript-line" data-begin="1418.64"><span class="transcript-timestamp">23:38</span><span | |
| class="transcript-text">So I'm going to allow 2p | |
| modifications over here.</span></div> | |
| <div class="transcript-line" data-begin="1423.87"><span class="transcript-timestamp">23:43</span><span | |
| class="transcript-text">And what's a | |
| modification look like?</span></div> | |
| <div class="transcript-line" data-begin="1428.78"><span class="transcript-timestamp">23:48</span><span | |
| class="transcript-text">It's going to consist | |
| of three things--</span></div> | |
| <div class="transcript-line" data-begin="1430.77"><span class="transcript-timestamp">23:50</span><span | |
| class="transcript-text">get them in the right order--</span></div> | |
| <div class="transcript-line" data-begin="1433.7"><span class="transcript-timestamp">23:53</span><span | |
| class="transcript-text">the version in which | |
| something was changed,</span></div> | |
| <div class="transcript-line" data-begin="1436.85"><span class="transcript-timestamp">23:56</span><span | |
| class="transcript-text">the field that got changed, | |
| and the value it go changed to.</span></div> | |
| <div class="transcript-line" data-begin="1442.83"><span class="transcript-timestamp">24:02</span><span | |
| class="transcript-text">So the idea is that these | |
| are the fields here.</span></div> | |
| <div class="transcript-line" data-begin="1447.92"><span class="transcript-timestamp">24:07</span><span | |
| class="transcript-text">We're not going to touch those.</span></div> | |
| <div class="transcript-line" data-begin="1449.87"><span class="transcript-timestamp">24:09</span><span | |
| class="transcript-text">Once they're set to something--</span></div> | |
| <div class="transcript-line" data-begin="1451.784"><span class="transcript-timestamp">24:11</span><span | |
| class="transcript-text">or, I mean, whatever | |
| they are initially,</span></div> | |
| <div class="transcript-line" data-begin="1453.45"><span class="transcript-timestamp">24:13</span><span | |
| class="transcript-text">they will stay that way.</span></div> | |
| <div class="transcript-line" data-begin="1455.37"><span class="transcript-timestamp">24:15</span><span | |
| class="transcript-text">And so instead of actually | |
| changing things like the data</span></div> | |
| <div class="transcript-line" data-begin="1458.42"><span class="transcript-timestamp">24:18</span><span | |
| class="transcript-text">structure normally | |
| would, we're just</span></div> | |
| <div class="transcript-line" data-begin="1459.92"><span class="transcript-timestamp">24:19</span><span | |
| class="transcript-text">going to add modifications | |
| here to say, oh,</span></div> | |
| <div class="transcript-line" data-begin="1461.81"><span class="transcript-timestamp">24:21</span><span | |
| class="transcript-text">well at this time, this field | |
| changed to the value of 5.</span></div> | |
| <div class="transcript-line" data-begin="1465.41"><span class="transcript-timestamp">24:25</span><span | |
| class="transcript-text">And then later on, it | |
| changed to the value 7.</span></div> | |
| <div class="transcript-line" data-begin="1467.72"><span class="transcript-timestamp">24:27</span><span | |
| class="transcript-text">And then later on, this one | |
| changed to the value 23,</span></div> | |
| <div class="transcript-line" data-begin="1471.38"><span class="transcript-timestamp">24:31</span><span | |
| class="transcript-text">whatever.</span></div> | |
| <div class="transcript-line" data-begin="1472.32"><span class="transcript-timestamp">24:32</span><span | |
| class="transcript-text">So that's what | |
| they'll look like.</span></div> | |
| <div class="transcript-line" data-begin="1476.292"><span class="transcript-timestamp">24:36</span><span | |
| class="transcript-text">There's a limit to how many--</span></div> | |
| <div class="transcript-line" data-begin="1477.5"><span class="transcript-timestamp">24:37</span><span | |
| class="transcript-text">we can only store a constant | |
| number of mods to each node.</span></div> | |
| <div class="transcript-line" data-begin="1480.92"><span class="transcript-timestamp">24:40</span><span | |
| class="transcript-text">And our constant will be 2p.</span></div> | |
| <div class="transcript-line" data-begin="1484.58"><span class="transcript-timestamp">24:44</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="1485.08"><span class="transcript-timestamp">24:45</span><span | |
| class="transcript-text">Those are the | |
| ideas, and now it's</span></div> | |
| <div class="transcript-line" data-begin="1486.22"><span class="transcript-timestamp">24:46</span><span | |
| class="transcript-text">just a matter of | |
| making this all work</span></div> | |
| <div class="transcript-line" data-begin="1487.761"><span class="transcript-timestamp">24:47</span><span | |
| class="transcript-text">and analyzing that it's | |
| constant amortized overhead.</span></div> | |
| <div class="transcript-line" data-begin="1493.26"><span class="transcript-timestamp">24:53</span><span | |
| class="transcript-text">So first thing is if you | |
| want to read a field,</span></div> | |
| <div class="transcript-line" data-begin="1506.23"><span class="transcript-timestamp">25:06</span><span | |
| class="transcript-text">how would I read a field?</span></div> | |
| <div class="transcript-line" data-begin="1508.09"><span class="transcript-timestamp">25:08</span><span | |
| class="transcript-text">This is really easy.</span></div> | |
| <div class="transcript-line" data-begin="1511.72"><span class="transcript-timestamp">25:11</span><span | |
| class="transcript-text">First you look at what the | |
| field is in the node itself.</span></div> | |
| <div class="transcript-line" data-begin="1515.92"><span class="transcript-timestamp">25:15</span><span | |
| class="transcript-text">But then it might | |
| have been changed.</span></div> | |
| <div class="transcript-line" data-begin="1517.831"><span class="transcript-timestamp">25:17</span><span | |
| class="transcript-text">And so remember when | |
| I say read the field,</span></div> | |
| <div class="transcript-line" data-begin="1519.58"><span class="transcript-timestamp">25:19</span><span | |
| class="transcript-text">I actually mean while | |
| I'm given some version,</span></div> | |
| <div class="transcript-line" data-begin="1521.6"><span class="transcript-timestamp">25:21</span><span | |
| class="transcript-text">v, I want to know what is the | |
| value of this field at version</span></div> | |
| <div class="transcript-line" data-begin="1524.655"><span class="transcript-timestamp">25:24</span><span | |
| class="transcript-text">v, because I want to be able | |
| to look at any of the old data</span></div> | |
| <div class="transcript-line" data-begin="1528.28"><span class="transcript-timestamp">25:28</span><span | |
| class="transcript-text">structures too.</span></div> | |
| <div class="transcript-line" data-begin="1529.63"><span class="transcript-timestamp">25:29</span><span | |
| class="transcript-text">So this would be at | |
| version v. I just</span></div> | |
| <div class="transcript-line" data-begin="1537.37"><span class="transcript-timestamp">25:37</span><span | |
| class="transcript-text">look through all | |
| the modifications.</span></div> | |
| <div class="transcript-line" data-begin="1538.84"><span class="transcript-timestamp">25:38</span><span | |
| class="transcript-text">There's constantly many, | |
| so it takes constant time</span></div> | |
| <div class="transcript-line" data-begin="1540.923"><span class="transcript-timestamp">25:40</span><span | |
| class="transcript-text">to just flip through them | |
| and say, well, what changes</span></div> | |
| <div class="transcript-line" data-begin="1543.73"><span class="transcript-timestamp">25:43</span><span | |
| class="transcript-text">have happened up to version v?</span></div> | |
| <div class="transcript-line" data-begin="1546.16"><span class="transcript-timestamp">25:46</span><span | |
| class="transcript-text">So I look at mods | |
| with version less than</span></div> | |
| <div class="transcript-line" data-begin="1556.75"><span class="transcript-timestamp">25:56</span><span | |
| class="transcript-text">or equal to v. That will be all | |
| the changes that happened up</span></div> | |
| <div class="transcript-line" data-begin="1559.45"><span class="transcript-timestamp">25:59</span><span | |
| class="transcript-text">to this point.</span></div> | |
| <div class="transcript-line" data-begin="1560.77"><span class="transcript-timestamp">26:00</span><span | |
| class="transcript-text">I see, did this field change?</span></div> | |
| <div class="transcript-line" data-begin="1562.06"><span class="transcript-timestamp">26:02</span><span | |
| class="transcript-text">I look at the latest one.</span></div> | |
| <div class="transcript-line" data-begin="1563.71"><span class="transcript-timestamp">26:03</span><span | |
| class="transcript-text">That will be how I read | |
| the field of the node, so</span></div> | |
| <div class="transcript-line" data-begin="1567.25"><span class="transcript-timestamp">26:07</span><span | |
| class="transcript-text">constant time.</span></div> | |
| <div class="transcript-line" data-begin="1568.517"><span class="transcript-timestamp">26:08</span><span | |
| class="transcript-text">There's lots of ways to make | |
| this efficient in practice.</span></div> | |
| <div class="transcript-line" data-begin="1570.85"><span class="transcript-timestamp">26:10</span><span | |
| class="transcript-text">But for our purposes, | |
| it doesn't matter.</span></div> | |
| <div class="transcript-line" data-begin="1573.73"><span class="transcript-timestamp">26:13</span><span | |
| class="transcript-text">It's constant.</span></div> | |
| <div class="transcript-line" data-begin="1576.01"><span class="transcript-timestamp">26:16</span><span | |
| class="transcript-text">The hard part is how | |
| do you change a field?</span></div> | |
| <div class="transcript-line" data-begin="1578.89"><span class="transcript-timestamp">26:18</span><span | |
| class="transcript-text">Because there might not be | |
| any room in the mod structure.</span></div> | |
| <div class="transcript-line" data-begin="1595.85"><span class="transcript-timestamp">26:35</span><span | |
| class="transcript-text">So to modify, say we want to | |
| set node.field equal to x.</span></div> | |
| <div class="transcript-line" data-begin="1607.24"><span class="transcript-timestamp">26:47</span><span | |
| class="transcript-text">What we do is first | |
| we check, is there</span></div> | |
| <div class="transcript-line" data-begin="1612.74"><span class="transcript-timestamp">26:52</span><span | |
| class="transcript-text">any space in the mod structure?</span></div> | |
| <div class="transcript-line" data-begin="1614.27"><span class="transcript-timestamp">26:54</span><span | |
| class="transcript-text">If there's any blank mods, | |
| so if the node is not full,</span></div> | |
| <div class="transcript-line" data-begin="1623.08"><span class="transcript-timestamp">27:03</span><span | |
| class="transcript-text">we just add a mod.</span></div> | |
| <div class="transcript-line" data-begin="1626.63"><span class="transcript-timestamp">27:06</span><span | |
| class="transcript-text">So a mod will look | |
| like now field x.</span></div> | |
| <div class="transcript-line" data-begin="1633.106"><span class="transcript-timestamp">27:13</span><span | |
| class="transcript-text">Just throw that in there.</span></div> | |
| <div class="transcript-line" data-begin="1635.81"><span class="transcript-timestamp">27:15</span><span | |
| class="transcript-text">Because right at this moment--</span></div> | |
| <div class="transcript-line" data-begin="1637.65"><span class="transcript-timestamp">27:17</span><span | |
| class="transcript-text">so we maintain a time | |
| counter, just increment</span></div> | |
| <div class="transcript-line" data-begin="1639.56"><span class="transcript-timestamp">27:19</span><span | |
| class="transcript-text">it ever time we do a change.</span></div> | |
| <div class="transcript-line" data-begin="1641.93"><span class="transcript-timestamp">27:21</span><span | |
| class="transcript-text">This field changed that value.</span></div> | |
| <div class="transcript-line" data-begin="1643.32"><span class="transcript-timestamp">27:23</span><span | |
| class="transcript-text">So that's the easy case.</span></div> | |
| <div class="transcript-line" data-begin="1644.54"><span class="transcript-timestamp">27:24</span><span | |
| class="transcript-text">The trouble, of course, | |
| is if the node is full--</span></div> | |
| <div class="transcript-line" data-begin="1649.34"><span class="transcript-timestamp">27:29</span><span | |
| class="transcript-text">the moment you've | |
| all been waiting for.</span></div> | |
| <div class="transcript-line" data-begin="1651.067"><span class="transcript-timestamp">27:31</span><span | |
| class="transcript-text">So what we're going to do | |
| here is make a new node.</span></div> | |
| <div class="transcript-line" data-begin="1653.15"><span class="transcript-timestamp">27:33</span><span | |
| class="transcript-text">We've ran out of space.</span></div> | |
| <div class="transcript-line" data-begin="1654.69"><span class="transcript-timestamp">27:34</span><span | |
| class="transcript-text">So we need to make a new node.</span></div> | |
| <div class="transcript-line" data-begin="1656.064"><span class="transcript-timestamp">27:36</span><span | |
| class="transcript-text">We're not going to touch the old | |
| node, just going to let it sit.</span></div> | |
| <div class="transcript-line" data-begin="1658.73"><span class="transcript-timestamp">27:38</span><span | |
| class="transcript-text">It still maintains all | |
| those old versions.</span></div> | |
| <div class="transcript-line" data-begin="1660.53"><span class="transcript-timestamp">27:40</span><span | |
| class="transcript-text">Now we want a new node | |
| that represents the latest</span></div> | |
| <div class="transcript-line" data-begin="1663.23"><span class="transcript-timestamp">27:43</span><span | |
| class="transcript-text">and greatest of this node.</span></div> | |
| <div class="transcript-line" data-begin="1664.97"><span class="transcript-timestamp">27:44</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="1665.49"><span class="transcript-timestamp">27:45</span><span | |
| class="transcript-text">So make a new node.</span></div> | |
| <div class="transcript-line" data-begin="1671.42"><span class="transcript-timestamp">27:51</span><span | |
| class="transcript-text">I'll call it node prime to | |
| distinguish from node, where</span></div> | |
| <div class="transcript-line" data-begin="1677.06"><span class="transcript-timestamp">27:57</span><span | |
| class="transcript-text">with all the mods, and this | |
| modification in particular,</span></div> | |
| <div class="transcript-line" data-begin="1684.705"><span class="transcript-timestamp">28:04</span><span | |
| class="transcript-text">applied.</span></div> | |
| <div class="transcript-line" data-begin="1687.77"><span class="transcript-timestamp">28:07</span><span | |
| class="transcript-text">OK, so we make a new | |
| version of this node.</span></div> | |
| <div class="transcript-line" data-begin="1691.16"><span class="transcript-timestamp">28:11</span><span | |
| class="transcript-text">It's going to have some | |
| different fields, whatever</span></div> | |
| <div class="transcript-line" data-begin="1695.37"><span class="transcript-timestamp">28:15</span><span | |
| class="transcript-text">was the latest version | |
| represented by those mods.</span></div> | |
| <div class="transcript-line" data-begin="1698.73"><span class="transcript-timestamp">28:18</span><span | |
| class="transcript-text">It's still going to | |
| have back pointers,</span></div> | |
| <div class="transcript-line" data-begin="1700.525"><span class="transcript-timestamp">28:20</span><span | |
| class="transcript-text">so we have to maintain | |
| all those back pointers.</span></div> | |
| <div class="transcript-line" data-begin="1704.81"><span class="transcript-timestamp">28:24</span><span | |
| class="transcript-text">And now the mod, | |
| initially, is going</span></div> | |
| <div class="transcript-line" data-begin="1706.4"><span class="transcript-timestamp">28:26</span><span | |
| class="transcript-text">to be empty, because we | |
| just applied them all.</span></div> | |
| <div class="transcript-line" data-begin="1709.34"><span class="transcript-timestamp">28:29</span><span | |
| class="transcript-text">So this new node doesn't | |
| have any recent mods.</span></div> | |
| <div class="transcript-line" data-begin="1712.46"><span class="transcript-timestamp">28:32</span><span | |
| class="transcript-text">Old node represents | |
| the old versions.</span></div> | |
| <div class="transcript-line" data-begin="1714.32"><span class="transcript-timestamp">28:34</span><span | |
| class="transcript-text">This node is going to | |
| represent the new versions.</span></div> | |
| <div class="transcript-line" data-begin="1717.935"><span class="transcript-timestamp">28:37</span><span | |
| class="transcript-text">What's wrong with this picture?</span></div> | |
| <div class="transcript-line" data-begin="1719.42"><span class="transcript-timestamp">28:39</span><span | |
| class="transcript-text">AUDIENCE: Update pointers.</span></div> | |
| <div class="transcript-line" data-begin="1720.77"><span class="transcript-timestamp">28:40</span><span | |
| class="transcript-text">ERIK DEMAINE: Update pointers.</span></div> | |
| <div class="transcript-line" data-begin="1722.12"><span class="transcript-timestamp">28:42</span><span | |
| class="transcript-text">Yeah, there's pointers | |
| to the old version</span></div> | |
| <div class="transcript-line" data-begin="1723.89"><span class="transcript-timestamp">28:43</span><span | |
| class="transcript-text">of the node, which are fine for | |
| the old versions of the data</span></div> | |
| <div class="transcript-line" data-begin="1727.58"><span class="transcript-timestamp">28:47</span><span | |
| class="transcript-text">structure.</span></div> | |
| <div class="transcript-line" data-begin="1728.259"><span class="transcript-timestamp">28:48</span><span | |
| class="transcript-text">But for the latest version | |
| of the data structure,</span></div> | |
| <div class="transcript-line" data-begin="1730.3"><span class="transcript-timestamp">28:50</span><span | |
| class="transcript-text">this node has moved | |
| to this new location.</span></div> | |
| <div class="transcript-line" data-begin="1733.56"><span class="transcript-timestamp">28:53</span><span | |
| class="transcript-text">So if there are any old | |
| pointers to that node,</span></div> | |
| <div class="transcript-line" data-begin="1736.07"><span class="transcript-timestamp">28:56</span><span | |
| class="transcript-text">we've got to update them | |
| in the current version.</span></div> | |
| <div class="transcript-line" data-begin="1738.44"><span class="transcript-timestamp">28:58</span><span | |
| class="transcript-text">We have to update them to | |
| point to this node instead.</span></div> | |
| <div class="transcript-line" data-begin="1740.648"><span class="transcript-timestamp">29:00</span><span | |
| class="transcript-text">The old versions are fine, but | |
| the new version is in trouble.</span></div> | |
| <div class="transcript-line" data-begin="1744.06"><span class="transcript-timestamp">29:04</span><span | |
| class="transcript-text">Other questions or | |
| all the same answer?</span></div> | |
| <div class="transcript-line" data-begin="1746.12"><span class="transcript-timestamp">29:06</span><span | |
| class="transcript-text">Yeah.</span></div> | |
| <div class="transcript-line" data-begin="1746.791"><span class="transcript-timestamp">29:06</span><span | |
| class="transcript-text">AUDIENCE: So if you wanted | |
| to read an old version</span></div> | |
| <div class="transcript-line" data-begin="1750.719"><span class="transcript-timestamp">29:10</span><span | |
| class="transcript-text">but you just have the | |
| new version, [INAUDIBLE]?</span></div> | |
| <div class="transcript-line" data-begin="1755.63"><span class="transcript-timestamp">29:15</span><span | |
| class="transcript-text">ERIK DEMAINE: OK--</span></div> | |
| <div class="transcript-line" data-begin="1756.555"><span class="transcript-timestamp">29:16</span><span | |
| class="transcript-text">AUDIENCE: [INAUDIBLE]</span></div> | |
| <div class="transcript-line" data-begin="1757.43"><span class="transcript-timestamp">29:17</span><span | |
| class="transcript-text">ERIK DEMAINE: The | |
| question is essentially,</span></div> | |
| <div class="transcript-line" data-begin="1759.18"><span class="transcript-timestamp">29:19</span><span | |
| class="transcript-text">how do we hold on to versions?</span></div> | |
| <div class="transcript-line" data-begin="1762.059"><span class="transcript-timestamp">29:22</span><span | |
| class="transcript-text">Essentially, you can think of | |
| a version of the data structure</span></div> | |
| <div class="transcript-line" data-begin="1764.6"><span class="transcript-timestamp">29:24</span><span | |
| class="transcript-text">as where the root node is.</span></div> | |
| <div class="transcript-line" data-begin="1766.404"><span class="transcript-timestamp">29:26</span><span | |
| class="transcript-text">That's probably the easiest.</span></div> | |
| <div class="transcript-line" data-begin="1767.57"><span class="transcript-timestamp">29:27</span><span | |
| class="transcript-text">I mean, in general, we're | |
| representing versions</span></div> | |
| <div class="transcript-line" data-begin="1769.528"><span class="transcript-timestamp">29:29</span><span | |
| class="transcript-text">by a number, v. But we | |
| always start at the root.</span></div> | |
| <div class="transcript-line" data-begin="1773.12"><span class="transcript-timestamp">29:33</span><span | |
| class="transcript-text">And so you've given | |
| the data structure,</span></div> | |
| <div class="transcript-line" data-begin="1775.077"><span class="transcript-timestamp">29:35</span><span | |
| class="transcript-text">which is represented | |
| by the root node.</span></div> | |
| <div class="transcript-line" data-begin="1776.66"><span class="transcript-timestamp">29:36</span><span | |
| class="transcript-text">And you say, search | |
| for the value 5.</span></div> | |
| <div class="transcript-line" data-begin="1780.02"><span class="transcript-timestamp">29:40</span><span | |
| class="transcript-text">Is it in this binary | |
| search tree or whatever?</span></div> | |
| <div class="transcript-line" data-begin="1783.289"><span class="transcript-timestamp">29:43</span><span | |
| class="transcript-text">And then you just start | |
| navigating from the root,</span></div> | |
| <div class="transcript-line" data-begin="1785.33"><span class="transcript-timestamp">29:45</span><span | |
| class="transcript-text">but you know I'm inversion | |
| a million or whatever.</span></div> | |
| <div class="transcript-line" data-begin="1789.56"><span class="transcript-timestamp">29:49</span><span | |
| class="transcript-text">I know what version | |
| I'm looking for.</span></div> | |
| <div class="transcript-line" data-begin="1791.34"><span class="transcript-timestamp">29:51</span><span | |
| class="transcript-text">So you start with the root, | |
| which never changes, let's say.</span></div> | |
| <div class="transcript-line" data-begin="1796.04"><span class="transcript-timestamp">29:56</span><span | |
| class="transcript-text">And then you follow | |
| pointers that</span></div> | |
| <div class="transcript-line" data-begin="1798.32"><span class="transcript-timestamp">29:58</span><span | |
| class="transcript-text">essentially tell | |
| you for that version</span></div> | |
| <div class="transcript-line" data-begin="1800.06"><span class="transcript-timestamp">30:00</span><span | |
| class="transcript-text">where you should be going.</span></div> | |
| <div class="transcript-line" data-begin="1801.38"><span class="transcript-timestamp">30:01</span><span | |
| class="transcript-text">I guess at the root version, | |
| it's a little trickier.</span></div> | |
| <div class="transcript-line" data-begin="1803.78"><span class="transcript-timestamp">30:03</span><span | |
| class="transcript-text">You probably want a little array | |
| that says for this version,</span></div> | |
| <div class="transcript-line" data-begin="1807.71"><span class="transcript-timestamp">30:07</span><span | |
| class="transcript-text">here's the root node.</span></div> | |
| <div class="transcript-line" data-begin="1808.9"><span class="transcript-timestamp">30:08</span><span | |
| class="transcript-text">But that's a special case.</span></div> | |
| <div class="transcript-line" data-begin="1811.13"><span class="transcript-timestamp">30:11</span><span | |
| class="transcript-text">Yeah.</span></div> | |
| <div class="transcript-line" data-begin="1811.67"><span class="transcript-timestamp">30:11</span><span | |
| class="transcript-text">Another question?</span></div> | |
| <div class="transcript-line" data-begin="1813.234"><span class="transcript-timestamp">30:13</span><span | |
| class="transcript-text">AUDIENCE: So on the | |
| new node that you</span></div> | |
| <div class="transcript-line" data-begin="1815.222"><span class="transcript-timestamp">30:15</span><span | |
| class="transcript-text">created, the fields that you | |
| copied, you also have to have</span></div> | |
| <div class="transcript-line" data-begin="1819.606"><span class="transcript-timestamp">30:19</span><span | |
| class="transcript-text">a version for them, right?</span></div> | |
| <div class="transcript-line" data-begin="1820.689"><span class="transcript-timestamp">30:20</span><span | |
| class="transcript-text">Because [INAUDIBLE]?</span></div> | |
| <div class="transcript-line" data-begin="1826.67"><span class="transcript-timestamp">30:26</span><span | |
| class="transcript-text">ERIK DEMAINE: These--</span></div> | |
| <div class="transcript-line" data-begin="1827.731"><span class="transcript-timestamp">30:27</span><span | |
| class="transcript-text">AUDIENCE: Or do you | |
| version the whole node?</span></div> | |
| <div class="transcript-line" data-begin="1830.19"><span class="transcript-timestamp">30:30</span><span | |
| class="transcript-text">ERIK DEMAINE: Here we're | |
| versioning the whole node.</span></div> | |
| <div class="transcript-line" data-begin="1832.65"><span class="transcript-timestamp">30:32</span><span | |
| class="transcript-text">The original field | |
| values represent</span></div> | |
| <div class="transcript-line" data-begin="1834.6"><span class="transcript-timestamp">30:34</span><span | |
| class="transcript-text">what was originally there, | |
| whenever this node was created.</span></div> | |
| <div class="transcript-line" data-begin="1837.94"><span class="transcript-timestamp">30:37</span><span | |
| class="transcript-text">Then the mods specify what | |
| time the fields change.</span></div> | |
| <div class="transcript-line" data-begin="1840.25"><span class="transcript-timestamp">30:40</span><span | |
| class="transcript-text">So I don't think | |
| we need times here.</span></div> | |
| <div class="transcript-line" data-begin="1844.2"><span class="transcript-timestamp">30:44</span><span | |
| class="transcript-text">All right.</span></div> | |
| <div class="transcript-line" data-begin="1845.326"><span class="transcript-timestamp">30:45</span><span | |
| class="transcript-text">So we've got to update | |
| two kinds of pointers.</span></div> | |
| <div class="transcript-line" data-begin="1847.2"><span class="transcript-timestamp">30:47</span><span | |
| class="transcript-text">There's regular | |
| pointers, which live</span></div> | |
| <div class="transcript-line" data-begin="1848.81"><span class="transcript-timestamp">30:48</span><span | |
| class="transcript-text">in the fields, which are | |
| things pointing to the node.</span></div> | |
| <div class="transcript-line" data-begin="1852.14"><span class="transcript-timestamp">30:52</span><span | |
| class="transcript-text">But then there's | |
| also back pointers.</span></div> | |
| <div class="transcript-line" data-begin="1853.64"><span class="transcript-timestamp">30:53</span><span | |
| class="transcript-text">Because if this is | |
| a pointer to a node,</span></div> | |
| <div class="transcript-line" data-begin="1855.909"><span class="transcript-timestamp">30:55</span><span | |
| class="transcript-text">then there'll be a back | |
| pointer back to the node.</span></div> | |
| <div class="transcript-line" data-begin="1857.95"><span class="transcript-timestamp">30:57</span><span | |
| class="transcript-text">And all of those have to change.</span></div> | |
| <div class="transcript-line" data-begin="1860.62"><span class="transcript-timestamp">31:00</span><span | |
| class="transcript-text">Conveniently, the back | |
| pointers are easy.</span></div> | |
| <div class="transcript-line" data-begin="1871.7"><span class="transcript-timestamp">31:11</span><span | |
| class="transcript-text">So if they're back | |
| pointers to the node,</span></div> | |
| <div class="transcript-line" data-begin="1873.535"><span class="transcript-timestamp">31:13</span><span | |
| class="transcript-text">we change them to | |
| the node prime.</span></div> | |
| <div class="transcript-line" data-begin="1874.91"><span class="transcript-timestamp">31:14</span><span | |
| class="transcript-text">How do we find | |
| the back pointers?</span></div> | |
| <div class="transcript-line" data-begin="1876.08"><span class="transcript-timestamp">31:16</span><span | |
| class="transcript-text">Well, we just follow | |
| all the pointers</span></div> | |
| <div class="transcript-line" data-begin="1877.621"><span class="transcript-timestamp">31:17</span><span | |
| class="transcript-text">and then there will be | |
| back pointers there.</span></div> | |
| <div class="transcript-line" data-begin="1881.33"><span class="transcript-timestamp">31:21</span><span | |
| class="transcript-text">Because I said we're | |
| only maintaining</span></div> | |
| <div class="transcript-line" data-begin="1883.04"><span class="transcript-timestamp">31:23</span><span | |
| class="transcript-text">backed pointers for | |
| the latest version,</span></div> | |
| <div class="transcript-line" data-begin="1885.65"><span class="transcript-timestamp">31:25</span><span | |
| class="transcript-text">I don't need to preserve | |
| the old versions</span></div> | |
| <div class="transcript-line" data-begin="1888.299"><span class="transcript-timestamp">31:28</span><span | |
| class="transcript-text">of those backed pointers.</span></div> | |
| <div class="transcript-line" data-begin="1889.34"><span class="transcript-timestamp">31:29</span><span | |
| class="transcript-text">So I just go in | |
| and I change them.</span></div> | |
| <div class="transcript-line" data-begin="1891.025"><span class="transcript-timestamp">31:31</span><span | |
| class="transcript-text">It takes constant time, | |
| because the constant number</span></div> | |
| <div class="transcript-line" data-begin="1893.15"><span class="transcript-timestamp">31:33</span><span | |
| class="transcript-text">of things I point to, each | |
| one as a back pointer.</span></div> | |
| <div class="transcript-line" data-begin="1895.7"><span class="transcript-timestamp">31:35</span><span | |
| class="transcript-text">So this is cheap.</span></div> | |
| <div class="transcript-line" data-begin="1897.13"><span class="transcript-timestamp">31:37</span><span | |
| class="transcript-text">There's no persistence here.</span></div> | |
| <div class="transcript-line" data-begin="1899.21"><span class="transcript-timestamp">31:39</span><span | |
| class="transcript-text">That's an advantage of | |
| partial persistence.</span></div> | |
| <div class="transcript-line" data-begin="1901.94"><span class="transcript-timestamp">31:41</span><span | |
| class="transcript-text">The hard part is | |
| updating the pointers</span></div> | |
| <div class="transcript-line" data-begin="1904.37"><span class="transcript-timestamp">31:44</span><span | |
| class="transcript-text">because those live in fields.</span></div> | |
| <div class="transcript-line" data-begin="1905.684"><span class="transcript-timestamp">31:45</span><span | |
| class="transcript-text">I need to remember the old | |
| versions of those fields.</span></div> | |
| <div class="transcript-line" data-begin="1907.85"><span class="transcript-timestamp">31:47</span><span | |
| class="transcript-text">And that we do recursively.</span></div> | |
| <div class="transcript-line" data-begin="1918.746"><span class="transcript-timestamp">31:58</span><span | |
| class="transcript-text">Because to change | |
| those pointers,</span></div> | |
| <div class="transcript-line" data-begin="1920.12"><span class="transcript-timestamp">32:00</span><span | |
| class="transcript-text">that's a field update.</span></div> | |
| <div class="transcript-line" data-begin="1921.17"><span class="transcript-timestamp">32:01</span><span | |
| class="transcript-text">That's something | |
| exactly of this form.</span></div> | |
| <div class="transcript-line" data-begin="1922.94"><span class="transcript-timestamp">32:02</span><span | |
| class="transcript-text">So that's the same operation | |
| but on a different node.</span></div> | |
| <div class="transcript-line" data-begin="1925.97"><span class="transcript-timestamp">32:05</span><span | |
| class="transcript-text">So I just do that.</span></div> | |
| <div class="transcript-line" data-begin="1927.44"><span class="transcript-timestamp">32:07</span><span | |
| class="transcript-text">I claim this is good.</span></div> | |
| <div class="transcript-line" data-begin="1928.76"><span class="transcript-timestamp">32:08</span><span | |
| class="transcript-text">That's the end of the algorithm.</span></div> | |
| <div class="transcript-line" data-begin="1931.4"><span class="transcript-timestamp">32:11</span><span | |
| class="transcript-text">Now we need to analyze it.</span></div> | |
| <div class="transcript-line" data-begin="1944.886"><span class="transcript-timestamp">32:24</span><span | |
| class="transcript-text">How do we analyze it?</span></div> | |
| <div class="transcript-line" data-begin="1945.76"><span class="transcript-timestamp">32:25</span><span | |
| class="transcript-text">Any guesses?</span></div> | |
| <div class="transcript-line" data-begin="1949.498"><span class="transcript-timestamp">32:29</span><span | |
| class="transcript-text">AUDIENCE: Amortize it.</span></div> | |
| <div class="transcript-line" data-begin="1950.5"><span class="transcript-timestamp">32:30</span><span | |
| class="transcript-text">ERIK DEMAINE: Amortized | |
| analysis, exactly</span></div> | |
| <div class="transcript-line" data-begin="1952.208"><span class="transcript-timestamp">32:32</span><span | |
| class="transcript-text">the answer I was looking for.</span></div> | |
| <div class="transcript-line" data-begin="1953.62"><span class="transcript-timestamp">32:33</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="1954.58"><span class="transcript-timestamp">32:34</span><span | |
| class="transcript-text">[INAUDIBLE] amortization.</span></div> | |
| <div class="transcript-line" data-begin="1956.29"><span class="transcript-timestamp">32:36</span><span | |
| class="transcript-text">The most powerful | |
| technique in amortization</span></div> | |
| <div class="transcript-line" data-begin="1958.33"><span class="transcript-timestamp">32:38</span><span | |
| class="transcript-text">is probably the | |
| potential method.</span></div> | |
| <div class="transcript-line" data-begin="1960.46"><span class="transcript-timestamp">32:40</span><span | |
| class="transcript-text">So we're going to use that.</span></div> | |
| <div class="transcript-line" data-begin="1962.37"><span class="transcript-timestamp">32:42</span><span | |
| class="transcript-text">There's a sort of more--</span></div> | |
| <div class="transcript-line" data-begin="1964.36"><span class="transcript-timestamp">32:44</span><span | |
| class="transcript-text">you'll see a charging | |
| argument in a moment.</span></div> | |
| <div class="transcript-line" data-begin="1970.914"><span class="transcript-timestamp">32:50</span><span | |
| class="transcript-text">We want the potential function | |
| to represent when this data</span></div> | |
| <div class="transcript-line" data-begin="1973.33"><span class="transcript-timestamp">32:53</span><span | |
| class="transcript-text">structure is in a bad state.</span></div> | |
| <div class="transcript-line" data-begin="1975.3"><span class="transcript-timestamp">32:55</span><span | |
| class="transcript-text">Intuitively, it's in a bad state | |
| when a lot of nodes are full.</span></div> | |
| <div class="transcript-line" data-begin="1978.807"><span class="transcript-timestamp">32:58</span><span | |
| class="transcript-text">Because then as soon as | |
| you make a change in them,</span></div> | |
| <div class="transcript-line" data-begin="1980.89"><span class="transcript-timestamp">33:00</span><span | |
| class="transcript-text">they will burst, and you have | |
| to do all this crazy recursion</span></div> | |
| <div class="transcript-line" data-begin="1983.68"><span class="transcript-timestamp">33:03</span><span | |
| class="transcript-text">and stuff.</span></div> | |
| <div class="transcript-line" data-begin="1984.58"><span class="transcript-timestamp">33:04</span><span | |
| class="transcript-text">This case is nice and cheap.</span></div> | |
| <div class="transcript-line" data-begin="1985.99"><span class="transcript-timestamp">33:05</span><span | |
| class="transcript-text">We just add a modification, | |
| constant time.</span></div> | |
| <div class="transcript-line" data-begin="1988.68"><span class="transcript-timestamp">33:08</span><span | |
| class="transcript-text">This case, not so nice | |
| because we recurse.</span></div> | |
| <div class="transcript-line" data-begin="1990.43"><span class="transcript-timestamp">33:10</span><span | |
| class="transcript-text">And then that's going | |
| to cause more recursions</span></div> | |
| <div class="transcript-line" data-begin="1992.74"><span class="transcript-timestamp">33:12</span><span | |
| class="transcript-text">and all sorts of | |
| chaos could happen.</span></div> | |
| <div class="transcript-line" data-begin="1996.04"><span class="transcript-timestamp">33:16</span><span | |
| class="transcript-text">So there's probably a few | |
| different potential functions</span></div> | |
| <div class="transcript-line" data-begin="2000.03"><span class="transcript-timestamp">33:20</span><span | |
| class="transcript-text">that would work here.</span></div> | |
| <div class="transcript-line" data-begin="2001.08"><span class="transcript-timestamp">33:21</span><span | |
| class="transcript-text">And an old version | |
| of these nodes I said</span></div> | |
| <div class="transcript-line" data-begin="2003.15"><span class="transcript-timestamp">33:23</span><span | |
| class="transcript-text">should be the number | |
| of full nodes.</span></div> | |
| <div class="transcript-line" data-begin="2005.07"><span class="transcript-timestamp">33:25</span><span | |
| class="transcript-text">But I think we can make | |
| life a little bit easier</span></div> | |
| <div class="transcript-line" data-begin="2007.68"><span class="transcript-timestamp">33:27</span><span | |
| class="transcript-text">by the following.</span></div> | |
| <div class="transcript-line" data-begin="2012.39"><span class="transcript-timestamp">33:32</span><span | |
| class="transcript-text">Basically, the total | |
| number of modifications--</span></div> | |
| <div class="transcript-line" data-begin="2016.674"><span class="transcript-timestamp">33:36</span><span | |
| class="transcript-text">not quite the total, | |
| almost the total.</span></div> | |
| <div class="transcript-line" data-begin="2019.8"><span class="transcript-timestamp">33:39</span><span | |
| class="transcript-text">So I'm going to do c times | |
| the sum of the number of mods</span></div> | |
| <div class="transcript-line" data-begin="2029.76"><span class="transcript-timestamp">33:49</span><span | |
| class="transcript-text">in latest version nodes.</span></div> | |
| <div class="transcript-line" data-begin="2039.16"><span class="transcript-timestamp">33:59</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="2040.53"><span class="transcript-timestamp">34:00</span><span | |
| class="transcript-text">So because we sort | |
| of really only</span></div> | |
| <div class="transcript-line" data-begin="2042.984"><span class="transcript-timestamp">34:02</span><span | |
| class="transcript-text">care about-- we're only | |
| changing the latest version,</span></div> | |
| <div class="transcript-line" data-begin="2045.15"><span class="transcript-timestamp">34:05</span><span | |
| class="transcript-text">so I really only | |
| care about nodes that</span></div> | |
| <div class="transcript-line" data-begin="2047.07"><span class="transcript-timestamp">34:07</span><span | |
| class="transcript-text">live in the latest version.</span></div> | |
| <div class="transcript-line" data-begin="2048.57"><span class="transcript-timestamp">34:08</span><span | |
| class="transcript-text">What do I mean by this?</span></div> | |
| <div class="transcript-line" data-begin="2049.659"><span class="transcript-timestamp">34:09</span><span | |
| class="transcript-text">Well, when I made | |
| this new node prime,</span></div> | |
| <div class="transcript-line" data-begin="2051.909"><span class="transcript-timestamp">34:11</span><span | |
| class="transcript-text">this becomes the new | |
| representation of that node.</span></div> | |
| <div class="transcript-line" data-begin="2054"><span class="transcript-timestamp">34:14</span><span | |
| class="transcript-text">The old version is dead.</span></div> | |
| <div class="transcript-line" data-begin="2055.69"><span class="transcript-timestamp">34:15</span><span | |
| class="transcript-text">We will never change it again.</span></div> | |
| <div class="transcript-line" data-begin="2058.56"><span class="transcript-timestamp">34:18</span><span | |
| class="transcript-text">If we're modifying, we will | |
| never even look at it again.</span></div> | |
| <div class="transcript-line" data-begin="2061.08"><span class="transcript-timestamp">34:21</span><span | |
| class="transcript-text">Because now everything | |
| points to here.</span></div> | |
| <div class="transcript-line" data-begin="2064.805"><span class="transcript-timestamp">34:24</span><span | |
| class="transcript-text">So I don't really | |
| care about that node.</span></div> | |
| <div class="transcript-line" data-begin="2066.429"><span class="transcript-timestamp">34:26</span><span | |
| class="transcript-text">It's got a ton of mods.</span></div> | |
| <div class="transcript-line" data-begin="2067.69"><span class="transcript-timestamp">34:27</span><span | |
| class="transcript-text">But what's nice is that when | |
| I create this new node, now</span></div> | |
| <div class="transcript-line" data-begin="2070.38"><span class="transcript-timestamp">34:30</span><span | |
| class="transcript-text">the mod list is empty.</span></div> | |
| <div class="transcript-line" data-begin="2071.882"><span class="transcript-timestamp">34:31</span><span | |
| class="transcript-text">So I start from scratch, | |
| just like reinstalling</span></div> | |
| <div class="transcript-line" data-begin="2073.84"><span class="transcript-timestamp">34:33</span><span | |
| class="transcript-text">your operating system.</span></div> | |
| <div class="transcript-line" data-begin="2074.87"><span class="transcript-timestamp">34:34</span><span | |
| class="transcript-text">It's a good feeling.</span></div> | |
| <div class="transcript-line" data-begin="2078.01"><span class="transcript-timestamp">34:38</span><span | |
| class="transcript-text">And so the potential goes down | |
| by, I guess, c times 2 times p.</span></div> | |
| <div class="transcript-line" data-begin="2085.09"><span class="transcript-timestamp">34:45</span><span | |
| class="transcript-text">When I do this change, potential | |
| goes down by basically p.</span></div> | |
| <div class="transcript-line" data-begin="2089.764"><span class="transcript-timestamp">34:49</span><span | |
| class="transcript-text">AUDIENCE: Is c any constant or--</span></div> | |
| <div class="transcript-line" data-begin="2092.23"><span class="transcript-timestamp">34:52</span><span | |
| class="transcript-text">ERIK DEMAINE: c will be a | |
| constant to be determined.</span></div> | |
| <div class="transcript-line" data-begin="2095.44"><span class="transcript-timestamp">34:55</span><span | |
| class="transcript-text">I mean, it could be 1.</span></div> | |
| <div class="transcript-line" data-begin="2097.18"><span class="transcript-timestamp">34:57</span><span | |
| class="transcript-text">It depends how you | |
| want to define it.</span></div> | |
| <div class="transcript-line" data-begin="2098.77"><span class="transcript-timestamp">34:58</span><span | |
| class="transcript-text">I'm going to use the CLRS | |
| notion of amortized cost, which</span></div> | |
| <div class="transcript-line" data-begin="2102.13"><span class="transcript-timestamp">35:02</span><span | |
| class="transcript-text">is actual cost plus | |
| change in potential.</span></div> | |
| <div class="transcript-line" data-begin="2106.777"><span class="transcript-timestamp">35:06</span><span | |
| class="transcript-text">And then I need a | |
| constant here, because I'm</span></div> | |
| <div class="transcript-line" data-begin="2108.61"><span class="transcript-timestamp">35:08</span><span | |
| class="transcript-text">measuring a running time versus | |
| some combinatorial quantity.</span></div> | |
| <div class="transcript-line" data-begin="2112.85"><span class="transcript-timestamp">35:12</span><span | |
| class="transcript-text">So this will be to match the | |
| running time that we'll get to.</span></div> | |
| <div class="transcript-line" data-begin="2117.41"><span class="transcript-timestamp">35:17</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="2117.99"><span class="transcript-timestamp">35:17</span><span | |
| class="transcript-text">So what is amortized cost?</span></div> | |
| <div class="transcript-line" data-begin="2122.29"><span class="transcript-timestamp">35:22</span><span | |
| class="transcript-text">There's sort of two | |
| cases modification.</span></div> | |
| <div class="transcript-line" data-begin="2124.92"><span class="transcript-timestamp">35:24</span><span | |
| class="transcript-text">There's the cheap case | |
| and the not so cheap case.</span></div> | |
| <div class="transcript-line" data-begin="2128.44"><span class="transcript-timestamp">35:28</span><span | |
| class="transcript-text">In general, amortized cost--</span></div> | |
| <div class="transcript-line" data-begin="2134.98"><span class="transcript-timestamp">35:34</span><span | |
| class="transcript-text">in both cases, it's | |
| going to be at most--</span></div> | |
| <div class="transcript-line" data-begin="2137.92"><span class="transcript-timestamp">35:37</span><span | |
| class="transcript-text">well, first of all, we | |
| do some constant work</span></div> | |
| <div class="transcript-line" data-begin="2139.81"><span class="transcript-timestamp">35:39</span><span | |
| class="transcript-text">just to figure out all this | |
| stuff, make copies, whatever.</span></div> | |
| <div class="transcript-line" data-begin="2144.64"><span class="transcript-timestamp">35:44</span><span | |
| class="transcript-text">So that's some constant time.</span></div> | |
| <div class="transcript-line" data-begin="2149.68"><span class="transcript-timestamp">35:49</span><span | |
| class="transcript-text">That's the part that I don't | |
| want to try to measure.</span></div> | |
| <div class="transcript-line" data-begin="2152.92"><span class="transcript-timestamp">35:52</span><span | |
| class="transcript-text">Then potentially, | |
| we add a new mod.</span></div> | |
| <div class="transcript-line" data-begin="2155.14"><span class="transcript-timestamp">35:55</span><span | |
| class="transcript-text">If we add a mod, that | |
| increases the potential by c.</span></div> | |
| <div class="transcript-line" data-begin="2159.43"><span class="transcript-timestamp">35:59</span><span | |
| class="transcript-text">Because we're just counting | |
| mods, multiplying by c.</span></div> | |
| <div class="transcript-line" data-begin="2162.07"><span class="transcript-timestamp">36:02</span><span | |
| class="transcript-text">So we might get plus 1 mod.</span></div> | |
| <div class="transcript-line" data-begin="2164.702"><span class="transcript-timestamp">36:04</span><span | |
| class="transcript-text">This is going to | |
| be an upper bound.</span></div> | |
| <div class="transcript-line" data-begin="2166.16"><span class="transcript-timestamp">36:06</span><span | |
| class="transcript-text">We don't always add 1, but | |
| worst case, we always had 1,</span></div> | |
| <div class="transcript-line" data-begin="2169.72"><span class="transcript-timestamp">36:09</span><span | |
| class="transcript-text">let's say.</span></div> | |
| <div class="transcript-line" data-begin="2171.88"><span class="transcript-timestamp">36:11</span><span | |
| class="transcript-text">And then there's | |
| this annoying part.</span></div> | |
| <div class="transcript-line" data-begin="2174.22"><span class="transcript-timestamp">36:14</span><span | |
| class="transcript-text">And this might happen, | |
| might not happen.</span></div> | |
| <div class="transcript-line" data-begin="2176.5"><span class="transcript-timestamp">36:16</span><span | |
| class="transcript-text">So then there's a plus maybe.</span></div> | |
| <div class="transcript-line" data-begin="2180.34"><span class="transcript-timestamp">36:20</span><span | |
| class="transcript-text">If this happens, we | |
| decrease the potential</span></div> | |
| <div class="transcript-line" data-begin="2183.31"><span class="transcript-timestamp">36:23</span><span | |
| class="transcript-text">because we empty out the | |
| mods for that node in terms</span></div> | |
| <div class="transcript-line" data-begin="2186.31"><span class="transcript-timestamp">36:26</span><span | |
| class="transcript-text">of the latest version.</span></div> | |
| <div class="transcript-line" data-begin="2187.72"><span class="transcript-timestamp">36:27</span><span | |
| class="transcript-text">So then we get a negative | |
| 2cp, change in potential.</span></div> | |
| <div class="transcript-line" data-begin="2194.5"><span class="transcript-timestamp">36:34</span><span | |
| class="transcript-text">And then we'd have to pay | |
| I guess up to p recursions.</span></div> | |
| <div class="transcript-line" data-begin="2209.25"><span class="transcript-timestamp">36:49</span><span | |
| class="transcript-text">Because we have to--</span></div> | |
| <div class="transcript-line" data-begin="2211.52"><span class="transcript-timestamp">36:51</span><span | |
| class="transcript-text">how many pointers | |
| are there to me?</span></div> | |
| <div class="transcript-line" data-begin="2213.36"><span class="transcript-timestamp">36:53</span><span | |
| class="transcript-text">Well, at most p of them, because | |
| there are at most p pointers</span></div> | |
| <div class="transcript-line" data-begin="2218.49"><span class="transcript-timestamp">36:58</span><span | |
| class="transcript-text">to any node.</span></div> | |
| <div class="transcript-line" data-begin="2222.75"><span class="transcript-timestamp">37:02</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="2223.35"><span class="transcript-timestamp">37:03</span><span | |
| class="transcript-text">This is kind of a weird--</span></div> | |
| <div class="transcript-line" data-begin="2225.11"><span class="transcript-timestamp">37:05</span><span | |
| class="transcript-text">it's not exactly algebra here.</span></div> | |
| <div class="transcript-line" data-begin="2226.51"><span class="transcript-timestamp">37:06</span><span | |
| class="transcript-text">I have this thing, recursions.</span></div> | |
| <div class="transcript-line" data-begin="2229.736"><span class="transcript-timestamp">37:09</span><span | |
| class="transcript-text">But if you think about | |
| how this would expand,</span></div> | |
| <div class="transcript-line" data-begin="2231.61"><span class="transcript-timestamp">37:11</span><span | |
| class="transcript-text">all right, this | |
| is constant time.</span></div> | |
| <div class="transcript-line" data-begin="2233.16"><span class="transcript-timestamp">37:13</span><span | |
| class="transcript-text">That's good.</span></div> | |
| <div class="transcript-line" data-begin="2234.02"><span class="transcript-timestamp">37:14</span><span | |
| class="transcript-text">And then if we do this--</span></div> | |
| <div class="transcript-line" data-begin="2235.02"><span class="transcript-timestamp">37:15</span><span | |
| class="transcript-text">I'll put a question mark here.</span></div> | |
| <div class="transcript-line" data-begin="2236.16"><span class="transcript-timestamp">37:16</span><span | |
| class="transcript-text">It might be here.</span></div> | |
| <div class="transcript-line" data-begin="2236.868"><span class="transcript-timestamp">37:16</span><span | |
| class="transcript-text">It might not.</span></div> | |
| <div class="transcript-line" data-begin="2238.11"><span class="transcript-timestamp">37:18</span><span | |
| class="transcript-text">If it's not here, find constant.</span></div> | |
| <div class="transcript-line" data-begin="2239.82"><span class="transcript-timestamp">37:19</span><span | |
| class="transcript-text">If it is here, then this gets | |
| expanded into this thing.</span></div> | |
| <div class="transcript-line" data-begin="2244.28"><span class="transcript-timestamp">37:24</span><span | |
| class="transcript-text">It's a weird way to | |
| write a recurrence.</span></div> | |
| <div class="transcript-line" data-begin="2246.13"><span class="transcript-timestamp">37:26</span><span | |
| class="transcript-text">But we get p times whatever | |
| is in this right hand side.</span></div> | |
| <div class="transcript-line" data-begin="2250.54"><span class="transcript-timestamp">37:30</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="2251.04"><span class="transcript-timestamp">37:31</span><span | |
| class="transcript-text">But then there's this minus 2cp.</span></div> | |
| <div class="transcript-line" data-begin="2253.44"><span class="transcript-timestamp">37:33</span><span | |
| class="transcript-text">So we're going to | |
| get p times 2c here.</span></div> | |
| <div class="transcript-line" data-begin="2256.56"><span class="transcript-timestamp">37:36</span><span | |
| class="transcript-text">That's the initial cost.</span></div> | |
| <div class="transcript-line" data-begin="2257.85"><span class="transcript-timestamp">37:37</span><span | |
| class="transcript-text">So that will cancel with this.</span></div> | |
| <div class="transcript-line" data-begin="2260.04"><span class="transcript-timestamp">37:40</span><span | |
| class="transcript-text">And then we might get | |
| another recursion.</span></div> | |
| <div class="transcript-line" data-begin="2261.91"><span class="transcript-timestamp">37:41</span><span | |
| class="transcript-text">But every time we get a | |
| recursion, all the terms</span></div> | |
| <div class="transcript-line" data-begin="2263.91"><span class="transcript-timestamp">37:43</span><span | |
| class="transcript-text">cancel.</span></div> | |
| <div class="transcript-line" data-begin="2264.899"><span class="transcript-timestamp">37:44</span><span | |
| class="transcript-text">So it doesn't matter | |
| whether this is here or not.</span></div> | |
| <div class="transcript-line" data-begin="2266.94"><span class="transcript-timestamp">37:46</span><span | |
| class="transcript-text">You get 0, which is great.</span></div> | |
| <div class="transcript-line" data-begin="2269.61"><span class="transcript-timestamp">37:49</span><span | |
| class="transcript-text">And you're left with | |
| the original 2c.</span></div> | |
| <div class="transcript-line" data-begin="2273.4"><span class="transcript-timestamp">37:53</span><span | |
| class="transcript-text">Constant.</span></div> | |
| <div class="transcript-line" data-begin="2275.41"><span class="transcript-timestamp">37:55</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="2276.3"><span class="transcript-timestamp">37:56</span><span | |
| class="transcript-text">[INAUDIBLE] potential functions | |
| are always a little crazy.</span></div> | |
| <div class="transcript-line" data-begin="2279.12"><span class="transcript-timestamp">37:59</span><span | |
| class="transcript-text">What's happening here is | |
| that, OK, maybe you add a mod.</span></div> | |
| <div class="transcript-line" data-begin="2283.53"><span class="transcript-timestamp">38:03</span><span | |
| class="transcript-text">That's cheap.</span></div> | |
| <div class="transcript-line" data-begin="2285.15"><span class="transcript-timestamp">38:05</span><span | |
| class="transcript-text">But when we have to do this | |
| work and we have to do this</span></div> | |
| <div class="transcript-line" data-begin="2288.15"><span class="transcript-timestamp">38:08</span><span | |
| class="transcript-text">recursion-- this is up to | |
| 2p updates or recursions--</span></div> | |
| <div class="transcript-line" data-begin="2294.39"><span class="transcript-timestamp">38:14</span><span | |
| class="transcript-text">we are charging it to the | |
| emptying of this node.</span></div> | |
| <div class="transcript-line" data-begin="2297.27"><span class="transcript-timestamp">38:17</span><span | |
| class="transcript-text">The number of mods | |
| went from 2p down to 0.</span></div> | |
| <div class="transcript-line" data-begin="2301.11"><span class="transcript-timestamp">38:21</span><span | |
| class="transcript-text">And so we're just | |
| charging this update cost</span></div> | |
| <div class="transcript-line" data-begin="2302.94"><span class="transcript-timestamp">38:22</span><span | |
| class="transcript-text">to that modification.</span></div> | |
| <div class="transcript-line" data-begin="2304.059"><span class="transcript-timestamp">38:24</span><span | |
| class="transcript-text">So if you like charging schemes, | |
| this is much more intuitive.</span></div> | |
| <div class="transcript-line" data-begin="2306.6"><span class="transcript-timestamp">38:26</span><span | |
| class="transcript-text">But with charging schemes, | |
| it's always a little careful.</span></div> | |
| <div class="transcript-line" data-begin="2308.5"><span class="transcript-timestamp">38:28</span><span | |
| class="transcript-text">You have to make sure | |
| you're not double charging.</span></div> | |
| <div class="transcript-line" data-begin="2310.86"><span class="transcript-timestamp">38:30</span><span | |
| class="transcript-text">Here it's obvious that | |
| you're not double charging.</span></div> | |
| <div class="transcript-line" data-begin="2314.79"><span class="transcript-timestamp">38:34</span><span | |
| class="transcript-text">Kind of a cool and magical.</span></div> | |
| <div class="transcript-line" data-begin="2317.07"><span class="transcript-timestamp">38:37</span><span | |
| class="transcript-text">This is a paper by | |
| Driscoll, Sarnak, Sleator,</span></div> | |
| <div class="transcript-line" data-begin="2322.01"><span class="transcript-timestamp">38:42</span><span | |
| class="transcript-text">Tarjan from 1989.</span></div> | |
| <div class="transcript-line" data-begin="2323.82"><span class="transcript-timestamp">38:43</span><span | |
| class="transcript-text">So it's very early | |
| days of amortization.</span></div> | |
| <div class="transcript-line" data-begin="2325.62"><span class="transcript-timestamp">38:45</span><span | |
| class="transcript-text">But they knew how to do it.</span></div> | |
| <div class="transcript-line" data-begin="2327.76"><span class="transcript-timestamp">38:47</span><span | |
| class="transcript-text">Question?</span></div> | |
| <div class="transcript-line" data-begin="2328.521"><span class="transcript-timestamp">38:48</span><span | |
| class="transcript-text">AUDIENCE: [INAUDIBLE]</span></div> | |
| <div class="transcript-line" data-begin="2330.504"><span class="transcript-timestamp">38:50</span><span | |
| class="transcript-text">ERIK DEMAINE: What happens | |
| if you overflow the root?</span></div> | |
| <div class="transcript-line" data-begin="2332.67"><span class="transcript-timestamp">38:52</span><span | |
| class="transcript-text">Yeah, I never thought about | |
| the root before today.</span></div> | |
| <div class="transcript-line" data-begin="2334.753"><span class="transcript-timestamp">38:54</span><span | |
| class="transcript-text">But I think the way | |
| to fix the root is</span></div> | |
| <div class="transcript-line" data-begin="2337.35"><span class="transcript-timestamp">38:57</span><span | |
| class="transcript-text">just you have one big table | |
| that says, for a given version--</span></div> | |
| <div class="transcript-line" data-begin="2342.78"><span class="transcript-timestamp">39:02</span><span | |
| class="transcript-text">I guess a simple | |
| way would be to say,</span></div> | |
| <div class="transcript-line" data-begin="2344.326"><span class="transcript-timestamp">39:04</span><span | |
| class="transcript-text">not only is a version | |
| a number, but it's also</span></div> | |
| <div class="transcript-line" data-begin="2346.2"><span class="transcript-timestamp">39:06</span><span | |
| class="transcript-text">a pointer to the root.</span></div> | |
| <div class="transcript-line" data-begin="2347.13"><span class="transcript-timestamp">39:07</span><span | |
| class="transcript-text">There we go.</span></div> | |
| <div class="transcript-line" data-begin="2347.629"><span class="transcript-timestamp">39:07</span><span | |
| class="transcript-text">Pointer machine.</span></div> | |
| <div class="transcript-line" data-begin="2349.242"><span class="transcript-timestamp">39:09</span><span | |
| class="transcript-text">So that way you're just | |
| always explicitly maintaining</span></div> | |
| <div class="transcript-line" data-begin="2351.45"><span class="transcript-timestamp">39:11</span><span | |
| class="transcript-text">the root copy or the pointer.</span></div> | |
| <div class="transcript-line" data-begin="2355.11"><span class="transcript-timestamp">39:15</span><span | |
| class="transcript-text">Because otherwise, | |
| you're in trouble.</span></div> | |
| <div class="transcript-line" data-begin="2358.71"><span class="transcript-timestamp">39:18</span><span | |
| class="transcript-text">AUDIENCE: Then can you | |
| go back to [INAUDIBLE].</span></div> | |
| <div class="transcript-line" data-begin="2361.53"><span class="transcript-timestamp">39:21</span><span | |
| class="transcript-text">ERIK DEMAINE: So in order | |
| to refer to an old version,</span></div> | |
| <div class="transcript-line" data-begin="2364.31"><span class="transcript-timestamp">39:24</span><span | |
| class="transcript-text">you have to have the | |
| pointer to that root node.</span></div> | |
| <div class="transcript-line" data-begin="2366.75"><span class="transcript-timestamp">39:26</span><span | |
| class="transcript-text">If you want to do it just | |
| from a version number,</span></div> | |
| <div class="transcript-line" data-begin="2369.336"><span class="transcript-timestamp">39:29</span><span | |
| class="transcript-text">look at the data structure.</span></div> | |
| <div class="transcript-line" data-begin="2370.46"><span class="transcript-timestamp">39:30</span><span | |
| class="transcript-text">Just from a version | |
| number, you would</span></div> | |
| <div class="transcript-line" data-begin="2371.45"><span class="transcript-timestamp">39:31</span><span | |
| class="transcript-text">need some kind of | |
| lookup table, which</span></div> | |
| <div class="transcript-line" data-begin="2373.249"><span class="transcript-timestamp">39:33</span><span | |
| class="transcript-text">is outside the pointer machine.</span></div> | |
| <div class="transcript-line" data-begin="2374.54"><span class="transcript-timestamp">39:34</span><span | |
| class="transcript-text">So you could do it | |
| in a real computer,</span></div> | |
| <div class="transcript-line" data-begin="2376.28"><span class="transcript-timestamp">39:36</span><span | |
| class="transcript-text">but a pointer machine is | |
| not technically allowed.</span></div> | |
| <div class="transcript-line" data-begin="2379.21"><span class="transcript-timestamp">39:39</span><span | |
| class="transcript-text">So it's slightly awkward.</span></div> | |
| <div class="transcript-line" data-begin="2380.57"><span class="transcript-timestamp">39:40</span><span | |
| class="transcript-text">No arrays are allowed | |
| in pointer machines,</span></div> | |
| <div class="transcript-line" data-begin="2382.4"><span class="transcript-timestamp">39:42</span><span | |
| class="transcript-text">in case that wasn't clear.</span></div> | |
| <div class="transcript-line" data-begin="2383.483"><span class="transcript-timestamp">39:43</span><span | |
| class="transcript-text">Another question?</span></div> | |
| <div class="transcript-line" data-begin="2384.274"><span class="transcript-timestamp">39:44</span><span | |
| class="transcript-text">AUDIENCE: [INAUDIBLE] constant | |
| space to store for [INAUDIBLE].</span></div> | |
| <div class="transcript-line" data-begin="2388.72"><span class="transcript-timestamp">39:48</span><span | |
| class="transcript-text">And also, what if we have | |
| really big numbers [INAUDIBLE]?</span></div> | |
| <div class="transcript-line" data-begin="2394.294"><span class="transcript-timestamp">39:54</span><span | |
| class="transcript-text">ERIK DEMAINE: In this model, | |
| in the pointer machine model,</span></div> | |
| <div class="transcript-line" data-begin="2396.71"><span class="transcript-timestamp">39:56</span><span | |
| class="transcript-text">we're assuming that whatever | |
| the data is in the items</span></div> | |
| <div class="transcript-line" data-begin="2398.93"><span class="transcript-timestamp">39:58</span><span | |
| class="transcript-text">take constant space each.</span></div> | |
| <div class="transcript-line" data-begin="2401.48"><span class="transcript-timestamp">40:01</span><span | |
| class="transcript-text">If you want to know about | |
| bigger things in here,</span></div> | |
| <div class="transcript-line" data-begin="2403.67"><span class="transcript-timestamp">40:03</span><span | |
| class="transcript-text">then refer to future lectures.</span></div> | |
| <div class="transcript-line" data-begin="2405.45"><span class="transcript-timestamp">40:05</span><span | |
| class="transcript-text">This is time travel, after all.</span></div> | |
| <div class="transcript-line" data-begin="2406.91"><span class="transcript-timestamp">40:06</span><span | |
| class="transcript-text">Just go to a future | |
| class and then come back.</span></div> | |
| <div class="transcript-line" data-begin="2409.2"><span class="transcript-timestamp">40:09</span><span | |
| class="transcript-text">[LAUGHS] So we'll get | |
| there, but right now,</span></div> | |
| <div class="transcript-line" data-begin="2411.92"><span class="transcript-timestamp">40:11</span><span | |
| class="transcript-text">we're not thinking | |
| about what's in here.</span></div> | |
| <div class="transcript-line" data-begin="2415.121"><span class="transcript-timestamp">40:15</span><span | |
| class="transcript-text">Whatever big thing | |
| you're trying to store,</span></div> | |
| <div class="transcript-line" data-begin="2416.87"><span class="transcript-timestamp">40:16</span><span | |
| class="transcript-text">you reduce it down to | |
| constant size things.</span></div> | |
| <div class="transcript-line" data-begin="2419.81"><span class="transcript-timestamp">40:19</span><span | |
| class="transcript-text">And then you spread them around | |
| nodes of a pointer machine.</span></div> | |
| <div class="transcript-line" data-begin="2422.84"><span class="transcript-timestamp">40:22</span><span | |
| class="transcript-text">How you do that, that's | |
| up to the data structure.</span></div> | |
| <div class="transcript-line" data-begin="2425.25"><span class="transcript-timestamp">40:25</span><span | |
| class="transcript-text">We're just transforming the | |
| data structure to be persistent.</span></div> | |
| <div class="transcript-line" data-begin="2428"><span class="transcript-timestamp">40:28</span><span | |
| class="transcript-text">OK, you could ask about other | |
| models than pointer machines,</span></div> | |
| <div class="transcript-line" data-begin="2430.458"><span class="transcript-timestamp">40:30</span><span | |
| class="transcript-text">but we're going to stick | |
| to pointer machines here.</span></div> | |
| <div class="transcript-line" data-begin="2434.53"><span class="transcript-timestamp">40:34</span><span | |
| class="transcript-text">All right.</span></div> | |
| <div class="transcript-line" data-begin="2436.22"><span class="transcript-timestamp">40:36</span><span | |
| class="transcript-text">That was partial persistence.</span></div> | |
| <div class="transcript-line" data-begin="2438.11"><span class="transcript-timestamp">40:38</span><span | |
| class="transcript-text">Let's do full persistence.</span></div> | |
| <div class="transcript-line" data-begin="2441.54"><span class="transcript-timestamp">40:41</span><span | |
| class="transcript-text">That was too easy.</span></div> | |
| <div class="transcript-line" data-begin="2446.3"><span class="transcript-timestamp">40:46</span><span | |
| class="transcript-text">Same paper does | |
| full persistence.</span></div> | |
| <div class="transcript-line" data-begin="2448.97"><span class="transcript-timestamp">40:48</span><span | |
| class="transcript-text">Systems That was just a warm up.</span></div> | |
| <div class="transcript-line" data-begin="2450.427"><span class="transcript-timestamp">40:50</span><span | |
| class="transcript-text">Full persistence is actually | |
| not that much harder.</span></div> | |
| <div class="transcript-line" data-begin="2455.07"><span class="transcript-timestamp">40:55</span><span | |
| class="transcript-text">So let me tell you | |
| basically what changes.</span></div> | |
| <div class="transcript-line" data-begin="2464.24"><span class="transcript-timestamp">41:04</span><span | |
| class="transcript-text">There are two issues.</span></div> | |
| <div class="transcript-line" data-begin="2465.55"><span class="transcript-timestamp">41:05</span><span | |
| class="transcript-text">One is that everything here | |
| has to change and not by much.</span></div> | |
| <div class="transcript-line" data-begin="2469.44"><span class="transcript-timestamp">41:09</span><span | |
| class="transcript-text">We're still going to | |
| use back pointers.</span></div> | |
| <div class="transcript-line" data-begin="2471.37"><span class="transcript-timestamp">41:11</span><span | |
| class="transcript-text">We're still going | |
| to have my mods.</span></div> | |
| <div class="transcript-line" data-begin="2472.86"><span class="transcript-timestamp">41:12</span><span | |
| class="transcript-text">The number of mods is going | |
| to be slightly different</span></div> | |
| <div class="transcript-line" data-begin="2475.026"><span class="transcript-timestamp">41:15</span><span | |
| class="transcript-text">but basically the same.</span></div> | |
| <div class="transcript-line" data-begin="2476.91"><span class="transcript-timestamp">41:16</span><span | |
| class="transcript-text">Back pointers no longer just | |
| refer to the latest version.</span></div> | |
| <div class="transcript-line" data-begin="2479.327"><span class="transcript-timestamp">41:19</span><span | |
| class="transcript-text">We have to maintain back | |
| pointers in all versions.</span></div> | |
| <div class="transcript-line" data-begin="2481.41"><span class="transcript-timestamp">41:21</span><span | |
| class="transcript-text">So that's annoying.</span></div> | |
| <div class="transcript-line" data-begin="2482.97"><span class="transcript-timestamp">41:22</span><span | |
| class="transcript-text">But hey, that's life.</span></div> | |
| <div class="transcript-line" data-begin="2484.274"><span class="transcript-timestamp">41:24</span><span | |
| class="transcript-text">The amortization, the | |
| potential function</span></div> | |
| <div class="transcript-line" data-begin="2485.94"><span class="transcript-timestamp">41:25</span><span | |
| class="transcript-text">will change slightly | |
| but basically not much.</span></div> | |
| <div class="transcript-line" data-begin="2490.85"><span class="transcript-timestamp">41:30</span><span | |
| class="transcript-text">Sort of the bigger issue you | |
| might first wonder about,</span></div> | |
| <div class="transcript-line" data-begin="2493.116"><span class="transcript-timestamp">41:33</span><span | |
| class="transcript-text">and it's actually the most | |
| challenging technically,</span></div> | |
| <div class="transcript-line" data-begin="2495.24"><span class="transcript-timestamp">41:35</span><span | |
| class="transcript-text">is versions are | |
| no longer numbers.</span></div> | |
| <div class="transcript-line" data-begin="2497.49"><span class="transcript-timestamp">41:37</span><span | |
| class="transcript-text">Because it's not a line.</span></div> | |
| <div class="transcript-line" data-begin="2499.14"><span class="transcript-timestamp">41:39</span><span | |
| class="transcript-text">Versions are nodes in a tree.</span></div> | |
| <div class="transcript-line" data-begin="2501.247"><span class="transcript-timestamp">41:41</span><span | |
| class="transcript-text">You should probably | |
| call them vertices</span></div> | |
| <div class="transcript-line" data-begin="2502.83"><span class="transcript-timestamp">41:42</span><span | |
| class="transcript-text">in a tree to distinguish them | |
| from nodes in the pointer</span></div> | |
| <div class="transcript-line" data-begin="2505.121"><span class="transcript-timestamp">41:45</span><span | |
| class="transcript-text">machine.</span></div> | |
| <div class="transcript-line" data-begin="2506.58"><span class="transcript-timestamp">41:46</span><span | |
| class="transcript-text">OK, so you've got | |
| this tree of versions.</span></div> | |
| <div class="transcript-line" data-begin="2508.53"><span class="transcript-timestamp">41:48</span><span | |
| class="transcript-text">And then versions are just | |
| some point on that tree.</span></div> | |
| <div class="transcript-line" data-begin="2513.93"><span class="transcript-timestamp">41:53</span><span | |
| class="transcript-text">This is annoying | |
| because we like lines.</span></div> | |
| <div class="transcript-line" data-begin="2517.02"><span class="transcript-timestamp">41:57</span><span | |
| class="transcript-text">We don't like trees as much.</span></div> | |
| <div class="transcript-line" data-begin="2518.77"><span class="transcript-timestamp">41:58</span><span | |
| class="transcript-text">So what we're going to | |
| do is linearize the tree.</span></div> | |
| <div class="transcript-line" data-begin="2524.32"><span class="transcript-timestamp">42:04</span><span | |
| class="transcript-text">Like, when in doubt, cheat.</span></div> | |
| <div class="transcript-line" data-begin="2532.2"><span class="transcript-timestamp">42:12</span><span | |
| class="transcript-text">How do we do this?</span></div> | |
| <div class="transcript-line" data-begin="2533.88"><span class="transcript-timestamp">42:13</span><span | |
| class="transcript-text">With tree traversal.</span></div> | |
| <div class="transcript-line" data-begin="2535.31"><span class="transcript-timestamp">42:15</span><span | |
| class="transcript-text">Imagine I'm going to draw | |
| a super complicated tree</span></div> | |
| <div class="transcript-line" data-begin="2538.24"><span class="transcript-timestamp">42:18</span><span | |
| class="transcript-text">of versions.</span></div> | |
| <div class="transcript-line" data-begin="2539.37"><span class="transcript-timestamp">42:19</span><span | |
| class="transcript-text">Say there are three versions.</span></div> | |
| <div class="transcript-line" data-begin="2541.66"><span class="transcript-timestamp">42:21</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="2542.807"><span class="transcript-timestamp">42:22</span><span | |
| class="transcript-text">I don't want to number | |
| them, because that would be</span></div> | |
| <div class="transcript-line" data-begin="2544.89"><span class="transcript-timestamp">42:24</span><span | |
| class="transcript-text">kind of begging the question.</span></div> | |
| <div class="transcript-line" data-begin="2546.33"><span class="transcript-timestamp">42:26</span><span | |
| class="transcript-text">So let's just call | |
| them x, y, and z.</span></div> | |
| <div class="transcript-line" data-begin="2553.08"><span class="transcript-timestamp">42:33</span><span | |
| class="transcript-text">All right.</span></div> | |
| <div class="transcript-line" data-begin="2554.384"><span class="transcript-timestamp">42:34</span><span | |
| class="transcript-text">I mean, it's a directed | |
| tree, because we</span></div> | |
| <div class="transcript-line" data-begin="2556.05"><span class="transcript-timestamp">42:36</span><span | |
| class="transcript-text">have the older versions.</span></div> | |
| <div class="transcript-line" data-begin="2557.464"><span class="transcript-timestamp">42:37</span><span | |
| class="transcript-text">This is like the | |
| original version.</span></div> | |
| <div class="transcript-line" data-begin="2558.88"><span class="transcript-timestamp">42:38</span><span | |
| class="transcript-text">And we made a change.</span></div> | |
| <div class="transcript-line" data-begin="2559.754"><span class="transcript-timestamp">42:39</span><span | |
| class="transcript-text">We made a different change | |
| on the same version.</span></div> | |
| <div class="transcript-line" data-begin="2562.69"><span class="transcript-timestamp">42:42</span><span | |
| class="transcript-text">What I'd like to do is a | |
| traversal of that tree,</span></div> | |
| <div class="transcript-line" data-begin="2565.52"><span class="transcript-timestamp">42:45</span><span | |
| class="transcript-text">like a regular, as if you're | |
| going to sort those nodes.</span></div> | |
| <div class="transcript-line" data-begin="2568.17"><span class="transcript-timestamp">42:48</span><span | |
| class="transcript-text">Actually, let me use | |
| color, high def here.</span></div> | |
| <div class="transcript-line" data-begin="2573.42"><span class="transcript-timestamp">42:53</span><span | |
| class="transcript-text">So here's our | |
| traversal of the tree.</span></div> | |
| <div class="transcript-line" data-begin="2579.03"><span class="transcript-timestamp">42:59</span><span | |
| class="transcript-text">And I want to look at the | |
| first and the last time I</span></div> | |
| <div class="transcript-line" data-begin="2581.79"><span class="transcript-timestamp">43:01</span><span | |
| class="transcript-text">visit each node.</span></div> | |
| <div class="transcript-line" data-begin="2582.73"><span class="transcript-timestamp">43:02</span><span | |
| class="transcript-text">So here's the first | |
| time I visit x.</span></div> | |
| <div class="transcript-line" data-begin="2585.36"><span class="transcript-timestamp">43:05</span><span | |
| class="transcript-text">So I'll write this is | |
| the beginning of x.</span></div> | |
| <div class="transcript-line" data-begin="2589.25"><span class="transcript-timestamp">43:09</span><span | |
| class="transcript-text">Capital X. Then this is | |
| the first time I visit y,</span></div> | |
| <div class="transcript-line" data-begin="2593.55"><span class="transcript-timestamp">43:13</span><span | |
| class="transcript-text">so it's beginning of y.</span></div> | |
| <div class="transcript-line" data-begin="2595.53"><span class="transcript-timestamp">43:15</span><span | |
| class="transcript-text">And then this is the last time | |
| I visit y, so it's the end of y.</span></div> | |
| <div class="transcript-line" data-begin="2599.07"><span class="transcript-timestamp">43:19</span><span | |
| class="transcript-text">And then, don't care.</span></div> | |
| <div class="transcript-line" data-begin="2600.77"><span class="transcript-timestamp">43:20</span><span | |
| class="transcript-text">Then this is the beginning of z.</span></div> | |
| <div class="transcript-line" data-begin="2604.8"><span class="transcript-timestamp">43:24</span><span | |
| class="transcript-text">And this is the end of z.</span></div> | |
| <div class="transcript-line" data-begin="2607.23"><span class="transcript-timestamp">43:27</span><span | |
| class="transcript-text">And then this is the end x.</span></div> | |
| <div class="transcript-line" data-begin="2609.48"><span class="transcript-timestamp">43:29</span><span | |
| class="transcript-text">If I write those sequentially, | |
| I get bxbyeybzez,</span></div> | |
| <div class="transcript-line" data-begin="2618.83"><span class="transcript-timestamp">43:38</span><span | |
| class="transcript-text">because this is so easy, ex.</span></div> | |
| <div class="transcript-line" data-begin="2622.4"><span class="transcript-timestamp">43:42</span><span | |
| class="transcript-text">OK, you can think of these | |
| as parentheses, right?</span></div> | |
| <div class="transcript-line" data-begin="2625.53"><span class="transcript-timestamp">43:45</span><span | |
| class="transcript-text">For whatever reason I chose b | |
| and e for beginning and ending,</span></div> | |
| <div class="transcript-line" data-begin="2628.46"><span class="transcript-timestamp">43:48</span><span | |
| class="transcript-text">but this is like open | |
| parens, close parens.</span></div> | |
| <div class="transcript-line" data-begin="2630.36"><span class="transcript-timestamp">43:50</span><span | |
| class="transcript-text">This is easy to | |
| do in linear time.</span></div> | |
| <div class="transcript-line" data-begin="2632.31"><span class="transcript-timestamp">43:52</span><span | |
| class="transcript-text">I think you all know how.</span></div> | |
| <div class="transcript-line" data-begin="2633.69"><span class="transcript-timestamp">43:53</span><span | |
| class="transcript-text">Except it's not | |
| a static problem.</span></div> | |
| <div class="transcript-line" data-begin="2635.066"><span class="transcript-timestamp">43:55</span><span | |
| class="transcript-text">Versions are changing | |
| all the time.</span></div> | |
| <div class="transcript-line" data-begin="2636.523"><span class="transcript-timestamp">43:56</span><span | |
| class="transcript-text">We're adding versions.</span></div> | |
| <div class="transcript-line" data-begin="2637.5"><span class="transcript-timestamp">43:57</span><span | |
| class="transcript-text">We're never deleting | |
| versions, but we're always</span></div> | |
| <div class="transcript-line" data-begin="2639.458"><span class="transcript-timestamp">43:59</span><span | |
| class="transcript-text">adding stuff to here.</span></div> | |
| <div class="transcript-line" data-begin="2640.422"><span class="transcript-timestamp">44:00</span><span | |
| class="transcript-text">It's a little | |
| awkward, but the idea</span></div> | |
| <div class="transcript-line" data-begin="2641.88"><span class="transcript-timestamp">44:01</span><span | |
| class="transcript-text">is I want to | |
| maintain this order,</span></div> | |
| <div class="transcript-line" data-begin="2645.84"><span class="transcript-timestamp">44:05</span><span | |
| class="transcript-text">maintain the begin and | |
| the end of each you</span></div> | |
| <div class="transcript-line" data-begin="2656.01"><span class="transcript-timestamp">44:16</span><span | |
| class="transcript-text">might say subtree of versions.</span></div> | |
| <div class="transcript-line" data-begin="2663.52"><span class="transcript-timestamp">44:23</span><span | |
| class="transcript-text">This string, from | |
| bx to ex, represents</span></div> | |
| <div class="transcript-line" data-begin="2665.77"><span class="transcript-timestamp">44:25</span><span | |
| class="transcript-text">all of the stuff in x's | |
| subtree, in the rooted tree</span></div> | |
| <div class="transcript-line" data-begin="2669.82"><span class="transcript-timestamp">44:29</span><span | |
| class="transcript-text">starting at x.</span></div> | |
| <div class="transcript-line" data-begin="2673.89"><span class="transcript-timestamp">44:33</span><span | |
| class="transcript-text">How do I maintain that?</span></div> | |
| <div class="transcript-line" data-begin="2680.55"><span class="transcript-timestamp">44:40</span><span | |
| class="transcript-text">Using a data structure.</span></div> | |
| <div class="transcript-line" data-begin="2696.49"><span class="transcript-timestamp">44:56</span><span | |
| class="transcript-text">So we're going to use something, | |
| a data structure we haven't yet</span></div> | |
| <div class="transcript-line" data-begin="2700.83"><span class="transcript-timestamp">45:00</span><span | |
| class="transcript-text">seen.</span></div> | |
| <div class="transcript-line" data-begin="2702.21"><span class="transcript-timestamp">45:02</span><span | |
| class="transcript-text">It will be in lecture 8.</span></div> | |
| <div class="transcript-line" data-begin="2704.899"><span class="transcript-timestamp">45:04</span><span | |
| class="transcript-text">This is a time travel | |
| data structure,</span></div> | |
| <div class="transcript-line" data-begin="2706.44"><span class="transcript-timestamp">45:06</span><span | |
| class="transcript-text">so I'm allowed to do that.</span></div> | |
| <div class="transcript-line" data-begin="2710.28"><span class="transcript-timestamp">45:10</span><span | |
| class="transcript-text">So order maintenance | |
| data structure.</span></div> | |
| <div class="transcript-line" data-begin="2714.15"><span class="transcript-timestamp">45:14</span><span | |
| class="transcript-text">You can think of this as | |
| a magical linked list.</span></div> | |
| <div class="transcript-line" data-begin="2716.97"><span class="transcript-timestamp">45:16</span><span | |
| class="transcript-text">Let me tell you what the | |
| magical linked list can do.</span></div> | |
| <div class="transcript-line" data-begin="2719.52"><span class="transcript-timestamp">45:19</span><span | |
| class="transcript-text">You can insert--</span></div> | |
| <div class="transcript-line" data-begin="2722.871"><span class="transcript-timestamp">45:22</span><span | |
| class="transcript-text">I'm going to call it | |
| an item, because node</span></div> | |
| <div class="transcript-line" data-begin="2724.62"><span class="transcript-timestamp">45:24</span><span | |
| class="transcript-text">would be kind of confusing | |
| given where we are right now.</span></div> | |
| <div class="transcript-line" data-begin="2728.64"><span class="transcript-timestamp">45:28</span><span | |
| class="transcript-text">You can insert a new item in | |
| the list immediately before</span></div> | |
| <div class="transcript-line" data-begin="2732.48"><span class="transcript-timestamp">45:32</span><span | |
| class="transcript-text">or after a given item.</span></div> | |
| <div class="transcript-line" data-begin="2737.41"><span class="transcript-timestamp">45:37</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="2737.91"><span class="transcript-timestamp">45:37</span><span | |
| class="transcript-text">This is like a | |
| regular linked list.</span></div> | |
| <div class="transcript-line" data-begin="2741.39"><span class="transcript-timestamp">45:41</span><span | |
| class="transcript-text">Here's a regular linked list.</span></div> | |
| <div class="transcript-line" data-begin="2744.75"><span class="transcript-timestamp">45:44</span><span | |
| class="transcript-text">And if I'm given a particular | |
| item like this one,</span></div> | |
| <div class="transcript-line" data-begin="2748.29"><span class="transcript-timestamp">45:48</span><span | |
| class="transcript-text">I can say, well, insert | |
| a new item right here.</span></div> | |
| <div class="transcript-line" data-begin="2751.19"><span class="transcript-timestamp">45:51</span><span | |
| class="transcript-text">You say, OK.</span></div> | |
| <div class="transcript-line" data-begin="2751.721"><span class="transcript-timestamp">45:51</span><span | |
| class="transcript-text">Fine.</span></div> | |
| <div class="transcript-line" data-begin="2752.22"><span class="transcript-timestamp">45:52</span><span | |
| class="transcript-text">I'll just make a new node and | |
| relink here, relink there.</span></div> | |
| <div class="transcript-line" data-begin="2757.06"><span class="transcript-timestamp">45:57</span><span | |
| class="transcript-text">Constant time, right?</span></div> | |
| <div class="transcript-line" data-begin="2758.19"><span class="transcript-timestamp">45:58</span><span | |
| class="transcript-text">So in an order maintenance | |
| data structure,</span></div> | |
| <div class="transcript-line" data-begin="2760.05"><span class="transcript-timestamp">46:00</span><span | |
| class="transcript-text">you can do this | |
| in constant time.</span></div> | |
| <div class="transcript-line" data-begin="2761.94"><span class="transcript-timestamp">46:01</span><span | |
| class="transcript-text">Wow!</span></div> | |
| <div class="transcript-line" data-begin="2762.9"><span class="transcript-timestamp">46:02</span><span | |
| class="transcript-text">So amazing.</span></div> | |
| <div class="transcript-line" data-begin="2765.18"><span class="transcript-timestamp">46:05</span><span | |
| class="transcript-text">OK, catch is the second | |
| operation you can do.</span></div> | |
| <div class="transcript-line" data-begin="2768.41"><span class="transcript-timestamp">46:08</span><span | |
| class="transcript-text">Maybe I'll number these.</span></div> | |
| <div class="transcript-line" data-begin="2769.41"><span class="transcript-timestamp">46:09</span><span | |
| class="transcript-text">This is the update.</span></div> | |
| <div class="transcript-line" data-begin="2770.97"><span class="transcript-timestamp">46:10</span><span | |
| class="transcript-text">Then there's the query.</span></div> | |
| <div class="transcript-line" data-begin="2773.49"><span class="transcript-timestamp">46:13</span><span | |
| class="transcript-text">The query is, what | |
| is the relative order</span></div> | |
| <div class="transcript-line" data-begin="2777.99"><span class="transcript-timestamp">46:17</span><span | |
| class="transcript-text">of two notes, of two items?</span></div> | |
| <div class="transcript-line" data-begin="2784.7"><span class="transcript-timestamp">46:24</span><span | |
| class="transcript-text">x and y.</span></div> | |
| <div class="transcript-line" data-begin="2787.09"><span class="transcript-timestamp">46:27</span><span | |
| class="transcript-text">So now I give you this | |
| node and this node.</span></div> | |
| <div class="transcript-line" data-begin="2789.98"><span class="transcript-timestamp">46:29</span><span | |
| class="transcript-text">And I say, which is to the left?</span></div> | |
| <div class="transcript-line" data-begin="2792.42"><span class="transcript-timestamp">46:32</span><span | |
| class="transcript-text">Which is earlier in the order?</span></div> | |
| <div class="transcript-line" data-begin="2794.03"><span class="transcript-timestamp">46:34</span><span | |
| class="transcript-text">I want to know, is x | |
| basically less than y</span></div> | |
| <div class="transcript-line" data-begin="2796.07"><span class="transcript-timestamp">46:36</span><span | |
| class="transcript-text">in terms of the | |
| order in the list?</span></div> | |
| <div class="transcript-line" data-begin="2797.69"><span class="transcript-timestamp">46:37</span><span | |
| class="transcript-text">Or is y less than x?</span></div> | |
| <div class="transcript-line" data-begin="2801.136"><span class="transcript-timestamp">46:41</span><span | |
| class="transcript-text">And an order maintenance | |
| data structure</span></div> | |
| <div class="transcript-line" data-begin="2802.76"><span class="transcript-timestamp">46:42</span><span | |
| class="transcript-text">can do this in constant time.</span></div> | |
| <div class="transcript-line" data-begin="2805.91"><span class="transcript-timestamp">46:45</span><span | |
| class="transcript-text">Now it doesn't look like your | |
| mother's linked list, I guess.</span></div> | |
| <div class="transcript-line" data-begin="2810.486"><span class="transcript-timestamp">46:50</span><span | |
| class="transcript-text">It's not the link list | |
| you learned in school.</span></div> | |
| <div class="transcript-line" data-begin="2812.36"><span class="transcript-timestamp">46:52</span><span | |
| class="transcript-text">It's a magical linked | |
| list that can somehow</span></div> | |
| <div class="transcript-line" data-begin="2814.7"><span class="transcript-timestamp">46:54</span><span | |
| class="transcript-text">answer these queries.</span></div> | |
| <div class="transcript-line" data-begin="2815.81"><span class="transcript-timestamp">46:55</span><span | |
| class="transcript-text">How?</span></div> | |
| <div class="transcript-line" data-begin="2816.51"><span class="transcript-timestamp">46:56</span><span | |
| class="transcript-text">Go to lecture 7.</span></div> | |
| <div class="transcript-line" data-begin="2818.77"><span class="transcript-timestamp">46:58</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="2819.27"><span class="transcript-timestamp">46:59</span><span | |
| class="transcript-text">Forward reference, | |
| lecture 8, sorry.</span></div> | |
| <div class="transcript-line" data-begin="2823.174"><span class="transcript-timestamp">47:03</span><span | |
| class="transcript-text">For now, we're just going to | |
| assume that this magical data</span></div> | |
| <div class="transcript-line" data-begin="2825.59"><span class="transcript-timestamp">47:05</span><span | |
| class="transcript-text">structure exists.</span></div> | |
| <div class="transcript-line" data-begin="2826.74"><span class="transcript-timestamp">47:06</span><span | |
| class="transcript-text">So in constant | |
| time, this is great.</span></div> | |
| <div class="transcript-line" data-begin="2829.34"><span class="transcript-timestamp">47:09</span><span | |
| class="transcript-text">Because if we're maintaining | |
| these b's and e's, we</span></div> | |
| <div class="transcript-line" data-begin="2831.68"><span class="transcript-timestamp">47:11</span><span | |
| class="transcript-text">want to maintain the order | |
| that these things appear in.</span></div> | |
| <div class="transcript-line" data-begin="2836.09"><span class="transcript-timestamp">47:16</span><span | |
| class="transcript-text">If we want to create | |
| a new version,</span></div> | |
| <div class="transcript-line" data-begin="2837.62"><span class="transcript-timestamp">47:17</span><span | |
| class="transcript-text">like suppose we were | |
| just creating version z,</span></div> | |
| <div class="transcript-line" data-begin="2840.41"><span class="transcript-timestamp">47:20</span><span | |
| class="transcript-text">well, it used to be everything | |
| without this bz, ez.</span></div> | |
| <div class="transcript-line" data-begin="2843.14"><span class="transcript-timestamp">47:23</span><span | |
| class="transcript-text">And we'd just insert two | |
| items in here, bz and ez.</span></div> | |
| <div class="transcript-line" data-begin="2847.215"><span class="transcript-timestamp">47:27</span><span | |
| class="transcript-text">They're right next | |
| to each other.</span></div> | |
| <div class="transcript-line" data-begin="2848.59"><span class="transcript-timestamp">47:28</span><span | |
| class="transcript-text">And if we were given version | |
| x, we could just say,</span></div> | |
| <div class="transcript-line" data-begin="2850.82"><span class="transcript-timestamp">47:30</span><span | |
| class="transcript-text">oh, we'll look at ex and insert | |
| two items right before it.</span></div> | |
| <div class="transcript-line" data-begin="2854.3"><span class="transcript-timestamp">47:34</span><span | |
| class="transcript-text">Or you can put them | |
| right after bx.</span></div> | |
| <div class="transcript-line" data-begin="2856.069"><span class="transcript-timestamp">47:36</span><span | |
| class="transcript-text">I mean, there's no | |
| actual order here.</span></div> | |
| <div class="transcript-line" data-begin="2857.61"><span class="transcript-timestamp">47:37</span><span | |
| class="transcript-text">So it could have been y first | |
| and then z or z first and then</span></div> | |
| <div class="transcript-line" data-begin="2860.69"><span class="transcript-timestamp">47:40</span><span | |
| class="transcript-text">y.</span></div> | |
| <div class="transcript-line" data-begin="2862.07"><span class="transcript-timestamp">47:42</span><span | |
| class="transcript-text">So it's really easy to add a | |
| new version in constant time.</span></div> | |
| <div class="transcript-line" data-begin="2864.61"><span class="transcript-timestamp">47:44</span><span | |
| class="transcript-text">You just do two of | |
| these insert operations.</span></div> | |
| <div class="transcript-line" data-begin="2867.59"><span class="transcript-timestamp">47:47</span><span | |
| class="transcript-text">And now you have this magical | |
| order operation, which</span></div> | |
| <div class="transcript-line" data-begin="2870.68"><span class="transcript-timestamp">47:50</span><span | |
| class="transcript-text">if I'm given two versions--</span></div> | |
| <div class="transcript-line" data-begin="2874.5"><span class="transcript-timestamp">47:54</span><span | |
| class="transcript-text">I don't know, v and w--</span></div> | |
| <div class="transcript-line" data-begin="2876.8"><span class="transcript-timestamp">47:56</span><span | |
| class="transcript-text">and I want to know is | |
| v an ancestor of w,</span></div> | |
| <div class="transcript-line" data-begin="2880.25"><span class="transcript-timestamp">48:00</span><span | |
| class="transcript-text">now I can do it | |
| in constant time.</span></div> | |
| <div class="transcript-line" data-begin="2882.39"><span class="transcript-timestamp">48:02</span><span | |
| class="transcript-text">So this lets me do a third | |
| operation, which is, is version</span></div> | |
| <div class="transcript-line" data-begin="2889.7"><span class="transcript-timestamp">48:09</span><span | |
| class="transcript-text">v an ancestor of version w?</span></div> | |
| <div class="transcript-line" data-begin="2901.85"><span class="transcript-timestamp">48:21</span><span | |
| class="transcript-text">Because that's going to | |
| be true if and only if bv</span></div> | |
| <div class="transcript-line" data-begin="2906.35"><span class="transcript-timestamp">48:26</span><span | |
| class="transcript-text">is an ev nest around bw and ew.</span></div> | |
| <div class="transcript-line" data-begin="2919.71"><span class="transcript-timestamp">48:39</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="2920.29"><span class="transcript-timestamp">48:40</span><span | |
| class="transcript-text">So that's just three tests.</span></div> | |
| <div class="transcript-line" data-begin="2921.92"><span class="transcript-timestamp">48:41</span><span | |
| class="transcript-text">They're probably not | |
| all even necessary.</span></div> | |
| <div class="transcript-line" data-begin="2923.98"><span class="transcript-timestamp">48:43</span><span | |
| class="transcript-text">This one always holds.</span></div> | |
| <div class="transcript-line" data-begin="2925.39"><span class="transcript-timestamp">48:45</span><span | |
| class="transcript-text">But if these guys fit in between | |
| these guys, then you know--</span></div> | |
| <div class="transcript-line" data-begin="2930.67"><span class="transcript-timestamp">48:50</span><span | |
| class="transcript-text">now, what this tells us, | |
| what we care about here,</span></div> | |
| <div class="transcript-line" data-begin="2934.81"><span class="transcript-timestamp">48:54</span><span | |
| class="transcript-text">is reading fields.</span></div> | |
| <div class="transcript-line" data-begin="2938.02"><span class="transcript-timestamp">48:58</span><span | |
| class="transcript-text">When we read a field, | |
| we said, oh, we'll</span></div> | |
| <div class="transcript-line" data-begin="2940.3"><span class="transcript-timestamp">49:00</span><span | |
| class="transcript-text">apply all the modifications | |
| that apply to version</span></div> | |
| <div class="transcript-line" data-begin="2942.67"><span class="transcript-timestamp">49:02</span><span | |
| class="transcript-text">v. Before that, that | |
| was a linear order.</span></div> | |
| <div class="transcript-line" data-begin="2944.51"><span class="transcript-timestamp">49:04</span><span | |
| class="transcript-text">So it's just all versions | |
| less than or equal to v. Now</span></div> | |
| <div class="transcript-line" data-begin="2946.9"><span class="transcript-timestamp">49:06</span><span | |
| class="transcript-text">it's all versions that are | |
| ancestors of v. Given a mod,</span></div> | |
| <div class="transcript-line" data-begin="2950.8"><span class="transcript-timestamp">49:10</span><span | |
| class="transcript-text">we need to know, does this | |
| mod apply to my version?</span></div> | |
| <div class="transcript-line" data-begin="2953.83"><span class="transcript-timestamp">49:13</span><span | |
| class="transcript-text">And now I tell you, I can | |
| do that in constant time</span></div> | |
| <div class="transcript-line" data-begin="2956.56"><span class="transcript-timestamp">49:16</span><span | |
| class="transcript-text">through magic.</span></div> | |
| <div class="transcript-line" data-begin="2957.61"><span class="transcript-timestamp">49:17</span><span | |
| class="transcript-text">I just test these | |
| order relations.</span></div> | |
| <div class="transcript-line" data-begin="2960.34"><span class="transcript-timestamp">49:20</span><span | |
| class="transcript-text">If they hold, then that | |
| mod applies to my version.</span></div> | |
| <div class="transcript-line" data-begin="2964.36"><span class="transcript-timestamp">49:24</span><span | |
| class="transcript-text">So w's the version | |
| we're testing.</span></div> | |
| <div class="transcript-line" data-begin="2967.36"><span class="transcript-timestamp">49:27</span><span | |
| class="transcript-text">v is some version in the mod.</span></div> | |
| <div class="transcript-line" data-begin="2969.43"><span class="transcript-timestamp">49:29</span><span | |
| class="transcript-text">And I want to know, am | |
| descendant of that version?</span></div> | |
| <div class="transcript-line" data-begin="2972.07"><span class="transcript-timestamp">49:32</span><span | |
| class="transcript-text">If so, the mod applies.</span></div> | |
| <div class="transcript-line" data-begin="2974.1"><span class="transcript-timestamp">49:34</span><span | |
| class="transcript-text">And I update what the field is.</span></div> | |
| <div class="transcript-line" data-begin="2976.63"><span class="transcript-timestamp">49:36</span><span | |
| class="transcript-text">I can do all pairwise ancestor | |
| checks and figure out,</span></div> | |
| <div class="transcript-line" data-begin="2979.03"><span class="transcript-timestamp">49:39</span><span | |
| class="transcript-text">what is the most recent | |
| version in my ancestor history</span></div> | |
| <div class="transcript-line" data-begin="2983.2"><span class="transcript-timestamp">49:43</span><span | |
| class="transcript-text">that modified a given field?</span></div> | |
| <div class="transcript-line" data-begin="2984.85"><span class="transcript-timestamp">49:44</span><span | |
| class="transcript-text">That lets me read a | |
| field in constant time.</span></div> | |
| <div class="transcript-line" data-begin="2987.08"><span class="transcript-timestamp">49:47</span><span | |
| class="transcript-text">Constants are getting | |
| kind of big at this point,</span></div> | |
| <div class="transcript-line" data-begin="2989.08"><span class="transcript-timestamp">49:49</span><span | |
| class="transcript-text">but it can be done.</span></div> | |
| <div class="transcript-line" data-begin="2993.27"><span class="transcript-timestamp">49:53</span><span | |
| class="transcript-text">Clear?</span></div> | |
| <div class="transcript-line" data-begin="2994.55"><span class="transcript-timestamp">49:54</span><span | |
| class="transcript-text">A little bit of | |
| a black box here.</span></div> | |
| <div class="transcript-line" data-begin="2996.85"><span class="transcript-timestamp">49:56</span><span | |
| class="transcript-text">But now we've gotten | |
| as far as reading.</span></div> | |
| <div class="transcript-line" data-begin="3001.92"><span class="transcript-timestamp">50:01</span><span | |
| class="transcript-text">And we don't need | |
| to change much else.</span></div> | |
| <div class="transcript-line" data-begin="3004.75"><span class="transcript-timestamp">50:04</span><span | |
| class="transcript-text">So this is good news</span></div> | |
| <div class="transcript-line" data-begin="3011.78"><span class="transcript-timestamp">50:11</span><span | |
| class="transcript-text">Maybe I'll give you | |
| a bit of a diff.</span></div> | |
| <div class="transcript-line" data-begin="3015.28"><span class="transcript-timestamp">50:15</span><span | |
| class="transcript-text">So full persistence, | |
| fully persistent theorem--</span></div> | |
| <div class="transcript-line" data-begin="3026.34"><span class="transcript-timestamp">50:26</span><span | |
| class="transcript-text">done.</span></div> | |
| <div class="transcript-line" data-begin="3027.21"><span class="transcript-timestamp">50:27</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="3027.71"><span class="transcript-timestamp">50:27</span><span | |
| class="transcript-text">Same theorem just | |
| with full persistence.</span></div> | |
| <div class="transcript-line" data-begin="3030.08"><span class="transcript-timestamp">50:30</span><span | |
| class="transcript-text">How do we do it?</span></div> | |
| <div class="transcript-line" data-begin="3031.23"><span class="transcript-timestamp">50:31</span><span | |
| class="transcript-text">We store back pointers | |
| now for all versions.</span></div> | |
| <div class="transcript-line" data-begin="3035.542"><span class="transcript-timestamp">50:35</span><span | |
| class="transcript-text">It's a little bit annoying.</span></div> | |
| <div class="transcript-line" data-begin="3036.87"><span class="transcript-timestamp">50:36</span><span | |
| class="transcript-text">But how many mods do we use?</span></div> | |
| <div class="transcript-line" data-begin="3040.832"><span class="transcript-timestamp">50:40</span><span | |
| class="transcript-text">There's lots of ways | |
| to get this to work,</span></div> | |
| <div class="transcript-line" data-begin="3042.54"><span class="transcript-timestamp">50:42</span><span | |
| class="transcript-text">but I'm going to | |
| change this number</span></div> | |
| <div class="transcript-line" data-begin="3044.89"><span class="transcript-timestamp">50:44</span><span | |
| class="transcript-text">to 2 times d plus p plus 1.</span></div> | |
| <div class="transcript-line" data-begin="3051.702"><span class="transcript-timestamp">50:51</span><span | |
| class="transcript-text">Wait, what's d? d is the | |
| number of fields here.</span></div> | |
| <div class="transcript-line" data-begin="3056.45"><span class="transcript-timestamp">50:56</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="3057.14"><span class="transcript-timestamp">50:57</span><span | |
| class="transcript-text">We said it was | |
| constant number fields.</span></div> | |
| <div class="transcript-line" data-begin="3059.15"><span class="transcript-timestamp">50:59</span><span | |
| class="transcript-text">I never said what that constant | |
| is. d for out degree, I guess.</span></div> | |
| <div class="transcript-line" data-begin="3063.68"><span class="transcript-timestamp">51:03</span><span | |
| class="transcript-text">So p is in degree, max in | |
| degree. d is max out degree.</span></div> | |
| <div class="transcript-line" data-begin="3069.289"><span class="transcript-timestamp">51:09</span><span | |
| class="transcript-text">So just slightly more-- | |
| that main reason for this</span></div> | |
| <div class="transcript-line" data-begin="3071.33"><span class="transcript-timestamp">51:11</span><span | |
| class="transcript-text">is because back pointers now | |
| are treated like everyone else.</span></div> | |
| <div class="transcript-line" data-begin="3074.45"><span class="transcript-timestamp">51:14</span><span | |
| class="transcript-text">We have to treat both the out | |
| pointers and the in pointers</span></div> | |
| <div class="transcript-line" data-begin="3077.434"><span class="transcript-timestamp">51:17</span><span | |
| class="transcript-text">as basically the same.</span></div> | |
| <div class="transcript-line" data-begin="3078.35"><span class="transcript-timestamp">51:18</span><span | |
| class="transcript-text">So instead of p, | |
| we have d plus p.</span></div> | |
| <div class="transcript-line" data-begin="3079.88"><span class="transcript-timestamp">51:19</span><span | |
| class="transcript-text">And there's a plus | |
| 1 just for safety.</span></div> | |
| <div class="transcript-line" data-begin="3083.231"><span class="transcript-timestamp">51:23</span><span | |
| class="transcript-text">It gets my amortization | |
| to work, hopefully.</span></div> | |
| <div class="transcript-line" data-begin="3088.33"><span class="transcript-timestamp">51:28</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="3089.32"><span class="transcript-timestamp">51:29</span><span | |
| class="transcript-text">Not much else-- this | |
| page is all the same.</span></div> | |
| <div class="transcript-line" data-begin="3092.43"><span class="transcript-timestamp">51:32</span><span | |
| class="transcript-text">Mods are still, you give | |
| versions, fields, values,</span></div> | |
| <div class="transcript-line" data-begin="3095.83"><span class="transcript-timestamp">51:35</span><span | |
| class="transcript-text">reading.</span></div> | |
| <div class="transcript-line" data-begin="3096.62"><span class="transcript-timestamp">51:36</span><span | |
| class="transcript-text">OK, well, this is no longer | |
| less than or equal to v. But</span></div> | |
| <div class="transcript-line" data-begin="3101.03"><span class="transcript-timestamp">51:41</span><span | |
| class="transcript-text">this is now with a version, sort | |
| of the nearest version, that's</span></div> | |
| <div class="transcript-line" data-begin="3107.06"><span class="transcript-timestamp">51:47</span><span | |
| class="transcript-text">an ancestor of v.</span></div> | |
| <div class="transcript-line" data-begin="3110.66"><span class="transcript-timestamp">51:50</span><span | |
| class="transcript-text">That's what we were | |
| just talking about.</span></div> | |
| <div class="transcript-line" data-begin="3112.719"><span class="transcript-timestamp">51:52</span><span | |
| class="transcript-text">So that can be done | |
| in constant time.</span></div> | |
| <div class="transcript-line" data-begin="3114.26"><span class="transcript-timestamp">51:54</span><span | |
| class="transcript-text">Check it for all of | |
| them, constant work.</span></div> | |
| <div class="transcript-line" data-begin="3117.4"><span class="transcript-timestamp">51:57</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="3118.13"><span class="transcript-timestamp">51:58</span><span | |
| class="transcript-text">That was the first part.</span></div> | |
| <div class="transcript-line" data-begin="3124.71"><span class="transcript-timestamp">52:04</span><span | |
| class="transcript-text">Now we get to the hard | |
| part, which is modification.</span></div> | |
| <div class="transcript-line" data-begin="3127.16"><span class="transcript-timestamp">52:07</span><span | |
| class="transcript-text">This is going to be different.</span></div> | |
| <div class="transcript-line" data-begin="3128.41"><span class="transcript-timestamp">52:08</span><span | |
| class="transcript-text">Maybe you I should just erase--</span></div> | |
| <div class="transcript-line" data-begin="3130.81"><span class="transcript-timestamp">52:10</span><span | |
| class="transcript-text">yeah, I think I'll | |
| erase everything,</span></div> | |
| <div class="transcript-line" data-begin="3133.69"><span class="transcript-timestamp">52:13</span><span | |
| class="transcript-text">except the first clause.</span></div> | |
| <div class="transcript-line" data-begin="3144.27"><span class="transcript-timestamp">52:24</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="3144.89"><span class="transcript-timestamp">52:24</span><span | |
| class="transcript-text">If a node is not | |
| full, we'll just</span></div> | |
| <div class="transcript-line" data-begin="3146.91"><span class="transcript-timestamp">52:26</span><span | |
| class="transcript-text">add a mod, just like before.</span></div> | |
| <div class="transcript-line" data-begin="3148.46"><span class="transcript-timestamp">52:28</span><span | |
| class="transcript-text">What changes is | |
| when a node is full.</span></div> | |
| <div class="transcript-line" data-begin="3156"><span class="transcript-timestamp">52:36</span><span | |
| class="transcript-text">Here we have to do something | |
| completely different.</span></div> | |
| <div class="transcript-line" data-begin="3158.22"><span class="transcript-timestamp">52:38</span><span | |
| class="transcript-text">Why?</span></div> | |
| <div class="transcript-line" data-begin="3158.91"><span class="transcript-timestamp">52:38</span><span | |
| class="transcript-text">Because if we just | |
| make a new version</span></div> | |
| <div class="transcript-line" data-begin="3161.07"><span class="transcript-timestamp">52:41</span><span | |
| class="transcript-text">of this node that has empty | |
| mods, this one's still full.</span></div> | |
| <div class="transcript-line" data-begin="3165.05"><span class="transcript-timestamp">52:45</span><span | |
| class="transcript-text">And I can keep modifying | |
| the same version.</span></div> | |
| <div class="transcript-line" data-begin="3168.81"><span class="transcript-timestamp">52:48</span><span | |
| class="transcript-text">This new node that I just erased | |
| represents some new version.</span></div> | |
| <div class="transcript-line" data-begin="3172.83"><span class="transcript-timestamp">52:52</span><span | |
| class="transcript-text">But if I keep modifying | |
| an old version, which</span></div> | |
| <div class="transcript-line" data-begin="3174.72"><span class="transcript-timestamp">52:54</span><span | |
| class="transcript-text">I can do in full persistence, | |
| this node keeps being full.</span></div> | |
| <div class="transcript-line" data-begin="3177.76"><span class="transcript-timestamp">52:57</span><span | |
| class="transcript-text">And I keep paying | |
| potentially huge cost.</span></div> | |
| <div class="transcript-line" data-begin="3180.019"><span class="transcript-timestamp">53:00</span><span | |
| class="transcript-text">If all the nodes were full, | |
| and when I make this change</span></div> | |
| <div class="transcript-line" data-begin="3182.31"><span class="transcript-timestamp">53:02</span><span | |
| class="transcript-text">every node gets | |
| copied, and then I</span></div> | |
| <div class="transcript-line" data-begin="3184.764"><span class="transcript-timestamp">53:04</span><span | |
| class="transcript-text">make a change to | |
| the same version,</span></div> | |
| <div class="transcript-line" data-begin="3186.18"><span class="transcript-timestamp">53:06</span><span | |
| class="transcript-text">every node gets copied again.</span></div> | |
| <div class="transcript-line" data-begin="3187.388"><span class="transcript-timestamp">53:07</span><span | |
| class="transcript-text">This is going to take | |
| linear time per operation.</span></div> | |
| <div class="transcript-line" data-begin="3189.86"><span class="transcript-timestamp">53:09</span><span | |
| class="transcript-text">So I can't do the old strategy.</span></div> | |
| <div class="transcript-line" data-begin="3191.94"><span class="transcript-timestamp">53:11</span><span | |
| class="transcript-text">I need to somehow make | |
| this node less full.</span></div> | |
| <div class="transcript-line" data-begin="3195.304"><span class="transcript-timestamp">53:15</span><span | |
| class="transcript-text">This is where we're | |
| definitely not functional.</span></div> | |
| <div class="transcript-line" data-begin="3197.22"><span class="transcript-timestamp">53:17</span><span | |
| class="transcript-text">None of this was | |
| functional, but now I'm</span></div> | |
| <div class="transcript-line" data-begin="3199.05"><span class="transcript-timestamp">53:19</span><span | |
| class="transcript-text">going to change an old node, not | |
| just make a new one in a more</span></div> | |
| <div class="transcript-line" data-begin="3204.24"><span class="transcript-timestamp">53:24</span><span | |
| class="transcript-text">drastic way.</span></div> | |
| <div class="transcript-line" data-begin="3205.86"><span class="transcript-timestamp">53:25</span><span | |
| class="transcript-text">Before I was adding a mod.</span></div> | |
| <div class="transcript-line" data-begin="3207.06"><span class="transcript-timestamp">53:27</span><span | |
| class="transcript-text">That's not a | |
| functional operation.</span></div> | |
| <div class="transcript-line" data-begin="3208.56"><span class="transcript-timestamp">53:28</span><span | |
| class="transcript-text">Now I'm actually going to remove | |
| mods from a node to rebalance.</span></div> | |
| <div class="transcript-line" data-begin="3213.87"><span class="transcript-timestamp">53:33</span><span | |
| class="transcript-text">So what I'd like to do is | |
| split the node into two halves.</span></div> | |
| <div class="transcript-line" data-begin="3223.05"><span class="transcript-timestamp">53:43</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="3223.55"><span class="transcript-timestamp">53:43</span><span | |
| class="transcript-text">So I had some big | |
| node that was--</span></div> | |
| <div class="transcript-line" data-begin="3226.295"><span class="transcript-timestamp">53:46</span><span | |
| class="transcript-text">I'll draw it-- completely full.</span></div> | |
| <div class="transcript-line" data-begin="3230.19"><span class="transcript-timestamp">53:50</span><span | |
| class="transcript-text">Now I'm going to make two nodes.</span></div> | |
| <div class="transcript-line" data-begin="3232.89"><span class="transcript-timestamp">53:52</span><span | |
| class="transcript-text">Here we go.</span></div> | |
| <div class="transcript-line" data-begin="3239.02"><span class="transcript-timestamp">53:59</span><span | |
| class="transcript-text">This one is going | |
| to be half full.</span></div> | |
| <div class="transcript-line" data-begin="3241.03"><span class="transcript-timestamp">54:01</span><span | |
| class="transcript-text">This one's going to | |
| be half full of mods.</span></div> | |
| <div class="transcript-line" data-begin="3244.93"><span class="transcript-timestamp">54:04</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="3245.46"><span class="transcript-timestamp">54:05</span><span | |
| class="transcript-text">The only question left is, what | |
| do I do with all these things?</span></div> | |
| <div class="transcript-line" data-begin="3252.15"><span class="transcript-timestamp">54:12</span><span | |
| class="transcript-text">Basically what I'd like | |
| to do is have the--</span></div> | |
| <div class="transcript-line" data-begin="3254.7"><span class="transcript-timestamp">54:14</span><span | |
| class="transcript-text">on the one hand, I want | |
| to have the old node.</span></div> | |
| <div class="transcript-line" data-begin="3258.72"><span class="transcript-timestamp">54:18</span><span | |
| class="transcript-text">It's just where it used to be.</span></div> | |
| <div class="transcript-line" data-begin="3260.55"><span class="transcript-timestamp">54:20</span><span | |
| class="transcript-text">I've just removed half of | |
| the mods, the second half,</span></div> | |
| <div class="transcript-line" data-begin="3263.82"><span class="transcript-timestamp">54:23</span><span | |
| class="transcript-text">the later half.</span></div> | |
| <div class="transcript-line" data-begin="3265.71"><span class="transcript-timestamp">54:25</span><span | |
| class="transcript-text">What does that mean?</span></div> | |
| <div class="transcript-line" data-begin="3266.74"><span class="transcript-timestamp">54:26</span><span | |
| class="transcript-text">I don't know.</span></div> | |
| <div class="transcript-line" data-begin="3267.42"><span class="transcript-timestamp">54:27</span><span | |
| class="transcript-text">Figure it out.</span></div> | |
| <div class="transcript-line" data-begin="3269.32"><span class="transcript-timestamp">54:29</span><span | |
| class="transcript-text">It's linearized.</span></div> | |
| <div class="transcript-line" data-begin="3271.05"><span class="transcript-timestamp">54:31</span><span | |
| class="transcript-text">I haven't thought | |
| deeply about that.</span></div> | |
| <div class="transcript-line" data-begin="3272.71"><span class="transcript-timestamp">54:32</span><span | |
| class="transcript-text">Now we're going to make a | |
| new node with the second half</span></div> | |
| <div class="transcript-line" data-begin="3276.3"><span class="transcript-timestamp">54:36</span><span | |
| class="transcript-text">of the mods.</span></div> | |
| <div class="transcript-line" data-begin="3280.16"><span class="transcript-timestamp">54:40</span><span | |
| class="transcript-text">It's more painful | |
| than I thought.</span></div> | |
| <div class="transcript-line" data-begin="3281.64"><span class="transcript-timestamp">54:41</span><span | |
| class="transcript-text">In reality, these mods represent | |
| a tree of modifications.</span></div> | |
| <div class="transcript-line" data-begin="3285.18"><span class="transcript-timestamp">54:45</span><span | |
| class="transcript-text">And what you need to do is | |
| find a partition of that tree</span></div> | |
| <div class="transcript-line" data-begin="3288.45"><span class="transcript-timestamp">54:48</span><span | |
| class="transcript-text">into two roughly equal halves.</span></div> | |
| <div class="transcript-line" data-begin="3291"><span class="transcript-timestamp">54:51</span><span | |
| class="transcript-text">You can actually do a | |
| one third, 2/3 split.</span></div> | |
| <div class="transcript-line" data-begin="3292.87"><span class="transcript-timestamp">54:52</span><span | |
| class="transcript-text">That's also in a future lecture, | |
| which whose number I forget.</span></div> | |
| <div class="transcript-line" data-begin="3297.049"><span class="transcript-timestamp">54:57</span><span | |
| class="transcript-text">So really, you're | |
| splitting this tree</span></div> | |
| <div class="transcript-line" data-begin="3298.59"><span class="transcript-timestamp">54:58</span><span | |
| class="transcript-text">into two roughly | |
| balanced halves.</span></div> | |
| <div class="transcript-line" data-begin="3301.44"><span class="transcript-timestamp">55:01</span><span | |
| class="transcript-text">And so this 2 might actually | |
| need to change to a 3,</span></div> | |
| <div class="transcript-line" data-begin="3303.75"><span class="transcript-timestamp">55:03</span><span | |
| class="transcript-text">but it's a constant.</span></div> | |
| <div class="transcript-line" data-begin="3306.33"><span class="transcript-timestamp">55:06</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="3307.59"><span class="transcript-timestamp">55:07</span><span | |
| class="transcript-text">What I want is for | |
| this to represent</span></div> | |
| <div class="transcript-line" data-begin="3309.33"><span class="transcript-timestamp">55:09</span><span | |
| class="transcript-text">a subtree of versions.</span></div> | |
| <div class="transcript-line" data-begin="3310.35"><span class="transcript-timestamp">55:10</span><span | |
| class="transcript-text">Let me draw the picture.</span></div> | |
| <div class="transcript-line" data-begin="3311.86"><span class="transcript-timestamp">55:11</span><span | |
| class="transcript-text">So here's a tree of versions | |
| represented by the old mods.</span></div> | |
| <div class="transcript-line" data-begin="3315.18"><span class="transcript-timestamp">55:15</span><span | |
| class="transcript-text">I'd like to cut out a | |
| subtree rooted at some node.</span></div> | |
| <div class="transcript-line" data-begin="3318.58"><span class="transcript-timestamp">55:18</span><span | |
| class="transcript-text">So let's just assume | |
| for now this has exactly</span></div> | |
| <div class="transcript-line" data-begin="3321.54"><span class="transcript-timestamp">55:21</span><span | |
| class="transcript-text">half the nodes.</span></div> | |
| <div class="transcript-line" data-begin="3322.89"><span class="transcript-timestamp">55:22</span><span | |
| class="transcript-text">And this has half the nodes.</span></div> | |
| <div class="transcript-line" data-begin="3325.47"><span class="transcript-timestamp">55:25</span><span | |
| class="transcript-text">In reality, I think it | |
| can be one third, 2/3.</span></div> | |
| <div class="transcript-line" data-begin="3329.18"><span class="transcript-timestamp">55:29</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="3329.68"><span class="transcript-timestamp">55:29</span><span | |
| class="transcript-text">But let's keep it convenient.</span></div> | |
| <div class="transcript-line" data-begin="3332.93"><span class="transcript-timestamp">55:32</span><span | |
| class="transcript-text">So I want the new | |
| node to represent</span></div> | |
| <div class="transcript-line" data-begin="3334.75"><span class="transcript-timestamp">55:34</span><span | |
| class="transcript-text">this subtree and this node | |
| to represent everything else.</span></div> | |
| <div class="transcript-line" data-begin="3337.63"><span class="transcript-timestamp">55:37</span><span | |
| class="transcript-text">This node is as if this | |
| stuff hasn't happened yet.</span></div> | |
| <div class="transcript-line" data-begin="3341.65"><span class="transcript-timestamp">55:41</span><span | |
| class="transcript-text">I mean, so it represents all | |
| these old versions that do not,</span></div> | |
| <div class="transcript-line" data-begin="3344.714"><span class="transcript-timestamp">55:44</span><span | |
| class="transcript-text">that are not in the subtree.</span></div> | |
| <div class="transcript-line" data-begin="3345.88"><span class="transcript-timestamp">55:45</span><span | |
| class="transcript-text">This represents all | |
| the latest stuff.</span></div> | |
| <div class="transcript-line" data-begin="3347.8"><span class="transcript-timestamp">55:47</span><span | |
| class="transcript-text">So what I'm going to | |
| do is like before, I</span></div> | |
| <div class="transcript-line" data-begin="3349.75"><span class="transcript-timestamp">55:49</span><span | |
| class="transcript-text">want to apply some | |
| mods to these fields.</span></div> | |
| <div class="transcript-line" data-begin="3354.09"><span class="transcript-timestamp">55:54</span><span | |
| class="transcript-text">And whatever minds were | |
| relevant at this point, whatever</span></div> | |
| <div class="transcript-line" data-begin="3358.32"><span class="transcript-timestamp">55:58</span><span | |
| class="transcript-text">had been applied, I apply | |
| those to the fields here.</span></div> | |
| <div class="transcript-line" data-begin="3362.61"><span class="transcript-timestamp">56:02</span><span | |
| class="transcript-text">And so that means I can | |
| remove all of these mods.</span></div> | |
| <div class="transcript-line" data-begin="3366.9"><span class="transcript-timestamp">56:06</span><span | |
| class="transcript-text">I only cared about these ones.</span></div> | |
| <div class="transcript-line" data-begin="3369.36"><span class="transcript-timestamp">56:09</span><span | |
| class="transcript-text">Update these fields accordingly.</span></div> | |
| <div class="transcript-line" data-begin="3371.22"><span class="transcript-timestamp">56:11</span><span | |
| class="transcript-text">I still have the other mods to | |
| represent all the other changes</span></div> | |
| <div class="transcript-line" data-begin="3374.04"><span class="transcript-timestamp">56:14</span><span | |
| class="transcript-text">that could be in that subtree.</span></div> | |
| <div class="transcript-line" data-begin="3376.03"><span class="transcript-timestamp">56:16</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="3376.53"><span class="transcript-timestamp">56:16</span><span | |
| class="transcript-text">So we actually split the tree, | |
| and we apply mods to new nodes.</span></div> | |
| <div class="transcript-line" data-begin="3398.68"><span class="transcript-timestamp">56:38</span><span | |
| class="transcript-text">Anything else I need to say?</span></div> | |
| <div class="transcript-line" data-begin="3402.542"><span class="transcript-timestamp">56:42</span><span | |
| class="transcript-text">Oh, now we need to | |
| update pointers.</span></div> | |
| <div class="transcript-line" data-begin="3404"><span class="transcript-timestamp">56:44</span><span | |
| class="transcript-text">That's always the fun part.</span></div> | |
| <div class="transcript-line" data-begin="3409.55"><span class="transcript-timestamp">56:49</span><span | |
| class="transcript-text">Let's go over here.</span></div> | |
| <div class="transcript-line" data-begin="3425.3"><span class="transcript-timestamp">57:05</span><span | |
| class="transcript-text">So old node hasn't moved.</span></div> | |
| <div class="transcript-line" data-begin="3427.49"><span class="transcript-timestamp">57:07</span><span | |
| class="transcript-text">But this new node has moved.</span></div> | |
| <div class="transcript-line" data-begin="3429.15"><span class="transcript-timestamp">57:09</span><span | |
| class="transcript-text">So for all of these | |
| versions, I want</span></div> | |
| <div class="transcript-line" data-begin="3433.88"><span class="transcript-timestamp">57:13</span><span | |
| class="transcript-text">to change the pointer that | |
| used to point to old node</span></div> | |
| <div class="transcript-line" data-begin="3438.02"><span class="transcript-timestamp">57:18</span><span | |
| class="transcript-text">should now point to new node.</span></div> | |
| <div class="transcript-line" data-begin="3440.806"><span class="transcript-timestamp">57:20</span><span | |
| class="transcript-text">In this version, it's fine.</span></div> | |
| <div class="transcript-line" data-begin="3441.93"><span class="transcript-timestamp">57:21</span><span | |
| class="transcript-text">It should still | |
| point to old node,</span></div> | |
| <div class="transcript-line" data-begin="3443.15"><span class="transcript-timestamp">57:23</span><span | |
| class="transcript-text">because this represents | |
| all those old versions.</span></div> | |
| <div class="transcript-line" data-begin="3445.28"><span class="transcript-timestamp">57:25</span><span | |
| class="transcript-text">But for the new version, | |
| that version in the subtree,</span></div> | |
| <div class="transcript-line" data-begin="3448.17"><span class="transcript-timestamp">57:28</span><span | |
| class="transcript-text">I've got to point here instead.</span></div> | |
| <div class="transcript-line" data-begin="3450.781"><span class="transcript-timestamp">57:30</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="3451.28"><span class="transcript-timestamp">57:31</span><span | |
| class="transcript-text">So how many pointers could | |
| there be to this node</span></div> | |
| <div class="transcript-line" data-begin="3457.33"><span class="transcript-timestamp">57:37</span><span | |
| class="transcript-text">that need to change.</span></div> | |
| <div class="transcript-line" data-begin="3458.85"><span class="transcript-timestamp">57:38</span><span | |
| class="transcript-text">That's a tricky part | |
| in this analysis.</span></div> | |
| <div class="transcript-line" data-begin="3461.63"><span class="transcript-timestamp">57:41</span><span | |
| class="transcript-text">Think about it for a while.</span></div> | |
| <div class="transcript-line" data-begin="3465.2"><span class="transcript-timestamp">57:45</span><span | |
| class="transcript-text">I mean, in this | |
| new node, whatever</span></div> | |
| <div class="transcript-line" data-begin="3467.2"><span class="transcript-timestamp">57:47</span><span | |
| class="transcript-text">is pointed to by either here or | |
| here in the new node also has</span></div> | |
| <div class="transcript-line" data-begin="3470.222"><span class="transcript-timestamp">57:50</span><span | |
| class="transcript-text">a return pointer.</span></div> | |
| <div class="transcript-line" data-begin="3470.93"><span class="transcript-timestamp">57:50</span><span | |
| class="transcript-text">All pointers are bidirectional.</span></div> | |
| <div class="transcript-line" data-begin="3472.13"><span class="transcript-timestamp">57:52</span><span | |
| class="transcript-text">So we don't really care | |
| about whether they're forward</span></div> | |
| <div class="transcript-line" data-begin="3474.338"><span class="transcript-timestamp">57:54</span><span | |
| class="transcript-text">or backward.</span></div> | |
| <div class="transcript-line" data-begin="3474.926"><span class="transcript-timestamp">57:54</span><span | |
| class="transcript-text">How many pointers | |
| are there here?</span></div> | |
| <div class="transcript-line" data-begin="3476.3"><span class="transcript-timestamp">57:56</span><span | |
| class="transcript-text">Well, there's d here | |
| and there's p here.</span></div> | |
| <div class="transcript-line" data-begin="3479.36"><span class="transcript-timestamp">57:59</span><span | |
| class="transcript-text">But then there's also | |
| some additional pointers</span></div> | |
| <div class="transcript-line" data-begin="3481.28"><span class="transcript-timestamp">58:01</span><span | |
| class="transcript-text">represented over here.</span></div> | |
| <div class="transcript-line" data-begin="3482.75"><span class="transcript-timestamp">58:02</span><span | |
| class="transcript-text">How many?</span></div> | |
| <div class="transcript-line" data-begin="3484.1"><span class="transcript-timestamp">58:04</span><span | |
| class="transcript-text">Well, if we assume this | |
| magical 50/50 split,</span></div> | |
| <div class="transcript-line" data-begin="3486.89"><span class="transcript-timestamp">58:06</span><span | |
| class="transcript-text">there's right now d plus p plus | |
| 1 mods over here, half of them.</span></div> | |
| <div class="transcript-line" data-begin="3492.92"><span class="transcript-timestamp">58:12</span><span | |
| class="transcript-text">Each of them might be a pointer | |
| to some other place, which</span></div> | |
| <div class="transcript-line" data-begin="3496.1"><span class="transcript-timestamp">58:16</span><span | |
| class="transcript-text">has a return pointer | |
| in that version.</span></div> | |
| <div class="transcript-line" data-begin="3498.715"><span class="transcript-timestamp">58:18</span><span | |
| class="transcript-text">So number of back pointers | |
| that we need to update</span></div> | |
| <div class="transcript-line" data-begin="3503.69"><span class="transcript-timestamp">58:23</span><span | |
| class="transcript-text">is going to be this, 2 | |
| times d 2 times p plus 1.</span></div> | |
| <div class="transcript-line" data-begin="3510.7"><span class="transcript-timestamp">58:30</span><span | |
| class="transcript-text">So recursively update at | |
| most 2 times d plus 2 times p</span></div> | |
| <div class="transcript-line" data-begin="3521.85"><span class="transcript-timestamp">58:41</span><span | |
| class="transcript-text">plus 1 pointers to the node.</span></div> | |
| <div class="transcript-line" data-begin="3530.27"><span class="transcript-timestamp">58:50</span><span | |
| class="transcript-text">The good news is this is | |
| really only half of them</span></div> | |
| <div class="transcript-line" data-begin="3532.55"><span class="transcript-timestamp">58:52</span><span | |
| class="transcript-text">or some fraction of them.</span></div> | |
| <div class="transcript-line" data-begin="3534.85"><span class="transcript-timestamp">58:54</span><span | |
| class="transcript-text">It used to be--</span></div> | |
| <div class="transcript-line" data-begin="3537.417"><span class="transcript-timestamp">58:57</span><span | |
| class="transcript-text">well, there were | |
| more pointers before.</span></div> | |
| <div class="transcript-line" data-begin="3539"><span class="transcript-timestamp">58:59</span><span | |
| class="transcript-text">We don't have to | |
| deal with these ones.</span></div> | |
| <div class="transcript-line" data-begin="3540.29"><span class="transcript-timestamp">59:00</span><span | |
| class="transcript-text">That's where we're | |
| saving, and that's</span></div> | |
| <div class="transcript-line" data-begin="3541.831"><span class="transcript-timestamp">59:01</span><span | |
| class="transcript-text">why this amortization works.</span></div> | |
| <div class="transcript-line" data-begin="3543.622"><span class="transcript-timestamp">59:03</span><span | |
| class="transcript-text">Let me give you a potential | |
| function that makes this work--</span></div> | |
| <div class="transcript-line" data-begin="3552.95"><span class="transcript-timestamp">59:12</span><span | |
| class="transcript-text">is minus c times sum of the | |
| number of empty mod slots.</span></div> | |
| <div class="transcript-line" data-begin="3563.76"><span class="transcript-timestamp">59:23</span><span | |
| class="transcript-text">It's kind of the same | |
| potential but before</span></div> | |
| <div class="transcript-line" data-begin="3566.37"><span class="transcript-timestamp">59:26</span><span | |
| class="transcript-text">we had this notion of | |
| dead and alive nodes.</span></div> | |
| <div class="transcript-line" data-begin="3568.53"><span class="transcript-timestamp">59:28</span><span | |
| class="transcript-text">Now everything's alive | |
| because everything</span></div> | |
| <div class="transcript-line" data-begin="3570.45"><span class="transcript-timestamp">59:30</span><span | |
| class="transcript-text">could change at any moment.</span></div> | |
| <div class="transcript-line" data-begin="3571.98"><span class="transcript-timestamp">59:31</span><span | |
| class="transcript-text">So instead, I'm going to | |
| measure how much room I have</span></div> | |
| <div class="transcript-line" data-begin="3576.03"><span class="transcript-timestamp">59:36</span><span | |
| class="transcript-text">in each node.</span></div> | |
| <div class="transcript-line" data-begin="3577.134"><span class="transcript-timestamp">59:37</span><span | |
| class="transcript-text">Before I had no | |
| room in this node.</span></div> | |
| <div class="transcript-line" data-begin="3578.55"><span class="transcript-timestamp">59:38</span><span | |
| class="transcript-text">Now I have half the | |
| space in both nodes.</span></div> | |
| <div class="transcript-line" data-begin="3581.76"><span class="transcript-timestamp">59:41</span><span | |
| class="transcript-text">So that's good news.</span></div> | |
| <div class="transcript-line" data-begin="3584.07"><span class="transcript-timestamp">59:44</span><span | |
| class="transcript-text">Whenever we have | |
| this recursion, we</span></div> | |
| <div class="transcript-line" data-begin="3588.3"><span class="transcript-timestamp">59:48</span><span | |
| class="transcript-text">can charge it to a | |
| potential decrease.</span></div> | |
| <div class="transcript-line" data-begin="3596.63"><span class="transcript-timestamp">59:56</span><span | |
| class="transcript-text">Fee goes down by--</span></div> | |
| <div class="transcript-line" data-begin="3601.16"><span class="transcript-timestamp">1:00:01</span><span | |
| class="transcript-text">because I have a | |
| negative sign here--</span></div> | |
| <div class="transcript-line" data-begin="3603.72"><span class="transcript-timestamp">1:00:03</span><span | |
| class="transcript-text">c times, oh man, 2 times | |
| d plus p plus 1, I think.</span></div> | |
| <div class="transcript-line" data-begin="3613.74"><span class="transcript-timestamp">1:00:13</span><span | |
| class="transcript-text">Because there's d plus | |
| p plus 1 space here,</span></div> | |
| <div class="transcript-line" data-begin="3615.78"><span class="transcript-timestamp">1:00:15</span><span | |
| class="transcript-text">d plus p plus 1 space here.</span></div> | |
| <div class="transcript-line" data-begin="3617.23"><span class="transcript-timestamp">1:00:17</span><span | |
| class="transcript-text">I mean, we added | |
| one whole new node.</span></div> | |
| <div class="transcript-line" data-begin="3618.99"><span class="transcript-timestamp">1:00:18</span><span | |
| class="transcript-text">And total capacity | |
| of a node in mods</span></div> | |
| <div class="transcript-line" data-begin="3620.82"><span class="transcript-timestamp">1:00:20</span><span | |
| class="transcript-text">is 2 times d plus p plus 1.</span></div> | |
| <div class="transcript-line" data-begin="3623.61"><span class="transcript-timestamp">1:00:23</span><span | |
| class="transcript-text">So we get that times c.</span></div> | |
| <div class="transcript-line" data-begin="3626.01"><span class="transcript-timestamp">1:00:26</span><span | |
| class="transcript-text">And this is basically | |
| just enough,</span></div> | |
| <div class="transcript-line" data-begin="3628.53"><span class="transcript-timestamp">1:00:28</span><span | |
| class="transcript-text">because this is 2 times | |
| d plus 2 times p plus 2.</span></div> | |
| <div class="transcript-line" data-begin="3632.01"><span class="transcript-timestamp">1:00:32</span><span | |
| class="transcript-text">And here we have a plus 1.</span></div> | |
| <div class="transcript-line" data-begin="3634.14"><span class="transcript-timestamp">1:00:34</span><span | |
| class="transcript-text">And so the recursion gets | |
| annihilated by 2 times d plus</span></div> | |
| <div class="transcript-line" data-begin="3639.69"><span class="transcript-timestamp">1:00:39</span><span | |
| class="transcript-text">2 times p plus 1.</span></div> | |
| <div class="transcript-line" data-begin="3641.28"><span class="transcript-timestamp">1:00:41</span><span | |
| class="transcript-text">And then there's one | |
| c left over to absorb</span></div> | |
| <div class="transcript-line" data-begin="3643.44"><span class="transcript-timestamp">1:00:43</span><span | |
| class="transcript-text">whatever constant cost there | |
| was to do all this other work.</span></div> | |
| <div class="transcript-line" data-begin="3647.241"><span class="transcript-timestamp">1:00:47</span><span | |
| class="transcript-text">So I got the constants | |
| just to work,</span></div> | |
| <div class="transcript-line" data-begin="3651.57"><span class="transcript-timestamp">1:00:51</span><span | |
| class="transcript-text">except that I cheated and it's | |
| really a one third, 2/3 split.</span></div> | |
| <div class="transcript-line" data-begin="3654.34"><span class="transcript-timestamp">1:00:54</span><span | |
| class="transcript-text">So probably all of these | |
| constants have to change,</span></div> | |
| <div class="transcript-line" data-begin="3657.09"><span class="transcript-timestamp">1:00:57</span><span | |
| class="transcript-text">such is life.</span></div> | |
| <div class="transcript-line" data-begin="3658.102"><span class="transcript-timestamp">1:00:58</span><span | |
| class="transcript-text">But I think you get the idea.</span></div> | |
| <div class="transcript-line" data-begin="3661.49"><span class="transcript-timestamp">1:01:01</span><span | |
| class="transcript-text">Any questions about | |
| full persistence?</span></div> | |
| <div class="transcript-line" data-begin="3667.11"><span class="transcript-timestamp">1:01:07</span><span | |
| class="transcript-text">This is fun stuff, time travel.</span></div> | |
| <div class="transcript-line" data-begin="3670.2"><span class="transcript-timestamp">1:01:10</span><span | |
| class="transcript-text">Yeah?</span></div> | |
| <div class="transcript-line" data-begin="3671.426"><span class="transcript-timestamp">1:01:11</span><span | |
| class="transcript-text">AUDIENCE: So in the first | |
| half of the thing where</span></div> | |
| <div class="transcript-line" data-begin="3674.63"><span class="transcript-timestamp">1:01:14</span><span | |
| class="transcript-text">the if, there's room | |
| you can put it in.</span></div> | |
| <div class="transcript-line" data-begin="3676.583"><span class="transcript-timestamp">1:01:16</span><span | |
| class="transcript-text">ERIK DEMAINE: Right.</span></div> | |
| <div class="transcript-line" data-begin="3677.056"><span class="transcript-timestamp">1:01:17</span><span | |
| class="transcript-text">AUDIENCE: I have a | |
| question about how</span></div> | |
| <div class="transcript-line" data-begin="3677.919"><span class="transcript-timestamp">1:01:17</span><span | |
| class="transcript-text">we represent the version.</span></div> | |
| <div class="transcript-line" data-begin="3679.421"><span class="transcript-timestamp">1:01:19</span><span | |
| class="transcript-text">Because before when we said | |
| restore now [INAUDIBLE].</span></div> | |
| <div class="transcript-line" data-begin="3683.016"><span class="transcript-timestamp">1:01:23</span><span | |
| class="transcript-text">It made more sense if now was | |
| like a timestamp or something.</span></div> | |
| <div class="transcript-line" data-begin="3685.92"><span class="transcript-timestamp">1:01:25</span><span | |
| class="transcript-text">ERIK DEMAINE: OK.</span></div> | |
| <div class="transcript-line" data-begin="3686.67"><span class="transcript-timestamp">1:01:26</span><span | |
| class="transcript-text">Right, so how do we represent a | |
| version even here or anywhere?</span></div> | |
| <div class="transcript-line" data-begin="3691.47"><span class="transcript-timestamp">1:01:31</span><span | |
| class="transcript-text">When we do a modification, an | |
| update, in the data structure,</span></div> | |
| <div class="transcript-line" data-begin="3694.23"><span class="transcript-timestamp">1:01:34</span><span | |
| class="transcript-text">we want to return | |
| the new version.</span></div> | |
| <div class="transcript-line" data-begin="3696.42"><span class="transcript-timestamp">1:01:36</span><span | |
| class="transcript-text">Basically, we're going | |
| to actually store</span></div> | |
| <div class="transcript-line" data-begin="3699.81"><span class="transcript-timestamp">1:01:39</span><span | |
| class="transcript-text">the DAG of versions.</span></div> | |
| <div class="transcript-line" data-begin="3701.042"><span class="transcript-timestamp">1:01:41</span><span | |
| class="transcript-text">And a version is going to | |
| be represented by a pointer</span></div> | |
| <div class="transcript-line" data-begin="3703.25"><span class="transcript-timestamp">1:01:43</span><span | |
| class="transcript-text">into this DAG.</span></div> | |
| <div class="transcript-line" data-begin="3704.4"><span class="transcript-timestamp">1:01:44</span><span | |
| class="transcript-text">One of the nodes in this | |
| DAG becomes a version.</span></div> | |
| <div class="transcript-line" data-begin="3707.34"><span class="transcript-timestamp">1:01:47</span><span | |
| class="transcript-text">Every node in this DAG is | |
| going to store a pointer</span></div> | |
| <div class="transcript-line" data-begin="3710.4"><span class="transcript-timestamp">1:01:50</span><span | |
| class="transcript-text">to the corresponding b character | |
| and a corresponding e character</span></div> | |
| <div class="transcript-line" data-begin="3713.64"><span class="transcript-timestamp">1:01:53</span><span | |
| class="transcript-text">in this data | |
| structure, which then</span></div> | |
| <div class="transcript-line" data-begin="3716.46"><span class="transcript-timestamp">1:01:56</span><span | |
| class="transcript-text">lets you do anything you want.</span></div> | |
| <div class="transcript-line" data-begin="3717.924"><span class="transcript-timestamp">1:01:57</span><span | |
| class="transcript-text">Then you can query | |
| against that version,</span></div> | |
| <div class="transcript-line" data-begin="3719.59"><span class="transcript-timestamp">1:01:59</span><span | |
| class="transcript-text">whether it's an ancestor | |
| of another version.</span></div> | |
| <div class="transcript-line" data-begin="3721.69"><span class="transcript-timestamp">1:02:01</span><span | |
| class="transcript-text">So yeah, I didn't mention that.</span></div> | |
| <div class="transcript-line" data-begin="3722.981"><span class="transcript-timestamp">1:02:02</span><span | |
| class="transcript-text">Versions are nodes in here.</span></div> | |
| <div class="transcript-line" data-begin="3724.23"><span class="transcript-timestamp">1:02:04</span><span | |
| class="transcript-text">Nodes in here have pointers | |
| to the b's and e's.</span></div> | |
| <div class="transcript-line" data-begin="3726.647"><span class="transcript-timestamp">1:02:06</span><span | |
| class="transcript-text">And vice versa, the b's | |
| and e's have pointers back</span></div> | |
| <div class="transcript-line" data-begin="3728.73"><span class="transcript-timestamp">1:02:08</span><span | |
| class="transcript-text">to the corresponding | |
| version node.</span></div> | |
| <div class="transcript-line" data-begin="3730.731"><span class="transcript-timestamp">1:02:10</span><span | |
| class="transcript-text">And then you can keep | |
| track of everything.</span></div> | |
| <div class="transcript-line" data-begin="3732.48"><span class="transcript-timestamp">1:02:12</span><span | |
| class="transcript-text">Good question.</span></div> | |
| <div class="transcript-line" data-begin="3734.79"><span class="transcript-timestamp">1:02:14</span><span | |
| class="transcript-text">Yeah?</span></div> | |
| <div class="transcript-line" data-begin="3735.39"><span class="transcript-timestamp">1:02:15</span><span | |
| class="transcript-text">AUDIENCE: [INAUDIBLE] question.</span></div> | |
| <div class="transcript-line" data-begin="3736.27"><span class="transcript-timestamp">1:02:16</span><span | |
| class="transcript-text">Remind me what d is in this.</span></div> | |
| <div class="transcript-line" data-begin="3737.15"><span class="transcript-timestamp">1:02:17</span><span | |
| class="transcript-text">ERIK DEMAINE: Oh, d was | |
| the maximum out degree.</span></div> | |
| <div class="transcript-line" data-begin="3739.108"><span class="transcript-timestamp">1:02:19</span><span | |
| class="transcript-text">It's the number of fields in | |
| a node, as defined right here.</span></div> | |
| <div class="transcript-line" data-begin="3746.97"><span class="transcript-timestamp">1:02:26</span><span | |
| class="transcript-text">Other questions?</span></div> | |
| <div class="transcript-line" data-begin="3749.701"><span class="transcript-timestamp">1:02:29</span><span | |
| class="transcript-text">Whew.</span></div> | |
| <div class="transcript-line" data-begin="3750.2"><span class="transcript-timestamp">1:02:30</span><span | |
| class="transcript-text">OK, a little breather.</span></div> | |
| <div class="transcript-line" data-begin="3751.305"><span class="transcript-timestamp">1:02:31</span><span | |
| class="transcript-text">That was partial persistence, | |
| full persistence.</span></div> | |
| <div class="transcript-line" data-begin="3753.45"><span class="transcript-timestamp">1:02:33</span><span | |
| class="transcript-text">This is, unfortunately, the | |
| end of the really good results.</span></div> | |
| <div class="transcript-line" data-begin="3756.73"><span class="transcript-timestamp">1:02:36</span><span | |
| class="transcript-text">As long as we have | |
| constant degree nodes,</span></div> | |
| <div class="transcript-line" data-begin="3758.65"><span class="transcript-timestamp">1:02:38</span><span | |
| class="transcript-text">in and out degree, | |
| we can do all.</span></div> | |
| <div class="transcript-line" data-begin="3761.32"><span class="transcript-timestamp">1:02:41</span><span | |
| class="transcript-text">We can do for | |
| persistence for free.</span></div> | |
| <div class="transcript-line" data-begin="3764.83"><span class="transcript-timestamp">1:02:44</span><span | |
| class="transcript-text">Obviously there are practical | |
| constants involved here.</span></div> | |
| <div class="transcript-line" data-begin="3767.08"><span class="transcript-timestamp">1:02:47</span><span | |
| class="transcript-text">But in theory, you | |
| can do this perfectly.</span></div> | |
| <div class="transcript-line" data-begin="3773.17"><span class="transcript-timestamp">1:02:53</span><span | |
| class="transcript-text">Before we go on to | |
| confluence, there</span></div> | |
| <div class="transcript-line" data-begin="3774.83"><span class="transcript-timestamp">1:02:54</span><span | |
| class="transcript-text">is one positive result, | |
| which is what if you</span></div> | |
| <div class="transcript-line" data-begin="3778.21"><span class="transcript-timestamp">1:02:58</span><span | |
| class="transcript-text">don't like amortize bounds.</span></div> | |
| <div class="transcript-line" data-begin="3780.615"><span class="transcript-timestamp">1:03:00</span><span | |
| class="transcript-text">There are various reasons | |
| amortize bounds might not</span></div> | |
| <div class="transcript-line" data-begin="3782.74"><span class="transcript-timestamp">1:03:02</span><span | |
| class="transcript-text">be good.</span></div> | |
| <div class="transcript-line" data-begin="3783.07"><span class="transcript-timestamp">1:03:03</span><span | |
| class="transcript-text">Maybe you really care | |
| about every operation</span></div> | |
| <div class="transcript-line" data-begin="3784.861"><span class="transcript-timestamp">1:03:04</span><span | |
| class="transcript-text">being no slower than it was | |
| except by a constant factor.</span></div> | |
| <div class="transcript-line" data-begin="3788.74"><span class="transcript-timestamp">1:03:08</span><span | |
| class="transcript-text">We're amortizing here, so some | |
| operations get really slow.</span></div> | |
| <div class="transcript-line" data-begin="3791.5"><span class="transcript-timestamp">1:03:11</span><span | |
| class="transcript-text">But the others are all | |
| fast to compensate.</span></div> | |
| <div class="transcript-line" data-begin="3794.11"><span class="transcript-timestamp">1:03:14</span><span | |
| class="transcript-text">You can deamortize, it's called.</span></div> | |
| <div class="transcript-line" data-begin="3802.6"><span class="transcript-timestamp">1:03:22</span><span | |
| class="transcript-text">You can get constant | |
| worst case slowdown</span></div> | |
| <div class="transcript-line" data-begin="3810.28"><span class="transcript-timestamp">1:03:30</span><span | |
| class="transcript-text">for partial persistence.</span></div> | |
| <div class="transcript-line" data-begin="3816.77"><span class="transcript-timestamp">1:03:36</span><span | |
| class="transcript-text">This is a result of Garret | |
| Brodle from the late '90s, '97.</span></div> | |
| <div class="transcript-line" data-begin="3824.26"><span class="transcript-timestamp">1:03:44</span><span | |
| class="transcript-text">For full persistence-- | |
| so it's an open problem.</span></div> | |
| <div class="transcript-line" data-begin="3827.149"><span class="transcript-timestamp">1:03:47</span><span | |
| class="transcript-text">I don't know if people | |
| have worked on that.</span></div> | |
| <div class="transcript-line" data-begin="3835.801"><span class="transcript-timestamp">1:03:55</span><span | |
| class="transcript-text">All right.</span></div> | |
| <div class="transcript-line" data-begin="3836.3"><span class="transcript-timestamp">1:03:56</span><span | |
| class="transcript-text">So some, mostly good results.</span></div> | |
| <div class="transcript-line" data-begin="3839.515"><span class="transcript-timestamp">1:03:59</span><span | |
| class="transcript-text">Let's move on to confluent | |
| persistence where things</span></div> | |
| <div class="transcript-line" data-begin="3841.64"><span class="transcript-timestamp">1:04:01</span><span | |
| class="transcript-text">get a lot more challenging.</span></div> | |
| <div class="transcript-line" data-begin="3857.511"><span class="transcript-timestamp">1:04:17</span><span | |
| class="transcript-text">Lots of things go out the window | |
| with confluent persistence.</span></div> | |
| <div class="transcript-line" data-begin="3860.01"><span class="transcript-timestamp">1:04:20</span><span | |
| class="transcript-text">In particular, your | |
| versions are now a DAG.</span></div> | |
| <div class="transcript-line" data-begin="3863.52"><span class="transcript-timestamp">1:04:23</span><span | |
| class="transcript-text">It's a lot harder | |
| to linearize a DAG.</span></div> | |
| <div class="transcript-line" data-begin="3865.65"><span class="transcript-timestamp">1:04:25</span><span | |
| class="transcript-text">Trees are not that | |
| far from pads.</span></div> | |
| <div class="transcript-line" data-begin="3868.98"><span class="transcript-timestamp">1:04:28</span><span | |
| class="transcript-text">But DAGs are quite far | |
| from pads, unfortunately.</span></div> | |
| <div class="transcript-line" data-begin="3873.672"><span class="transcript-timestamp">1:04:33</span><span | |
| class="transcript-text">But that's not all | |
| that goes wrong.</span></div> | |
| <div class="transcript-line" data-begin="3884.66"><span class="transcript-timestamp">1:04:44</span><span | |
| class="transcript-text">Let me first tell you the | |
| kind of end effect as a user.</span></div> | |
| <div class="transcript-line" data-begin="3890.06"><span class="transcript-timestamp">1:04:50</span><span | |
| class="transcript-text">Imagine you have | |
| a data structure.</span></div> | |
| <div class="transcript-line" data-begin="3894.83"><span class="transcript-timestamp">1:04:54</span><span | |
| class="transcript-text">Think of it as a | |
| list, I guess, which</span></div> | |
| <div class="transcript-line" data-begin="3897.5"><span class="transcript-timestamp">1:04:57</span><span | |
| class="transcript-text">is a list of characters | |
| in your document.</span></div> | |
| <div class="transcript-line" data-begin="3899.33"><span class="transcript-timestamp">1:04:59</span><span | |
| class="transcript-text">You're using vi or Word, | |
| your favorite, whatever.</span></div> | |
| <div class="transcript-line" data-begin="3903.41"><span class="transcript-timestamp">1:05:03</span><span | |
| class="transcript-text">It's a text editor.</span></div> | |
| <div class="transcript-line" data-begin="3905.06"><span class="transcript-timestamp">1:05:05</span><span | |
| class="transcript-text">You've got a string of words.</span></div> | |
| <div class="transcript-line" data-begin="3906.68"><span class="transcript-timestamp">1:05:06</span><span | |
| class="transcript-text">And now you like to do | |
| things like copy and paste.</span></div> | |
| <div class="transcript-line" data-begin="3909.785"><span class="transcript-timestamp">1:05:09</span><span | |
| class="transcript-text">It's a nice operation.</span></div> | |
| <div class="transcript-line" data-begin="3911.27"><span class="transcript-timestamp">1:05:11</span><span | |
| class="transcript-text">So you select an interval of | |
| the string and you copy it.</span></div> | |
| <div class="transcript-line" data-begin="3916.34"><span class="transcript-timestamp">1:05:16</span><span | |
| class="transcript-text">And then you paste | |
| it somewhere else.</span></div> | |
| <div class="transcript-line" data-begin="3918.34"><span class="transcript-timestamp">1:05:18</span><span | |
| class="transcript-text">So now you've got two | |
| copies of that string.</span></div> | |
| <div class="transcript-line" data-begin="3921.95"><span class="transcript-timestamp">1:05:21</span><span | |
| class="transcript-text">This is, in some | |
| sense, what you might</span></div> | |
| <div class="transcript-line" data-begin="3924.05"><span class="transcript-timestamp">1:05:24</span><span | |
| class="transcript-text">call a confluent | |
| operation, because--</span></div> | |
| <div class="transcript-line" data-begin="3927.96"><span class="transcript-timestamp">1:05:27</span><span | |
| class="transcript-text">yeah, maybe a cleaner way to | |
| think of it is the following.</span></div> | |
| <div class="transcript-line" data-begin="3930.47"><span class="transcript-timestamp">1:05:30</span><span | |
| class="transcript-text">You have your string.</span></div> | |
| <div class="transcript-line" data-begin="3931.91"><span class="transcript-timestamp">1:05:31</span><span | |
| class="transcript-text">Now I have an operation, | |
| which is split it.</span></div> | |
| <div class="transcript-line" data-begin="3933.95"><span class="transcript-timestamp">1:05:33</span><span | |
| class="transcript-text">So now I have two strings.</span></div> | |
| <div class="transcript-line" data-begin="3935.84"><span class="transcript-timestamp">1:05:35</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="3936.34"><span class="transcript-timestamp">1:05:36</span><span | |
| class="transcript-text">And now I have an operation, | |
| which is split it.</span></div> | |
| <div class="transcript-line" data-begin="3938.298"><span class="transcript-timestamp">1:05:38</span><span | |
| class="transcript-text">Now I have three strings.</span></div> | |
| <div class="transcript-line" data-begin="3940.77"><span class="transcript-timestamp">1:05:40</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="3941.27"><span class="transcript-timestamp">1:05:41</span><span | |
| class="transcript-text">Now I have an operation | |
| which is concatenate.</span></div> | |
| <div class="transcript-line" data-begin="3944.28"><span class="transcript-timestamp">1:05:44</span><span | |
| class="transcript-text">So I can, for | |
| example, reconstruct</span></div> | |
| <div class="transcript-line" data-begin="3947.33"><span class="transcript-timestamp">1:05:47</span><span | |
| class="transcript-text">the original string-- actually, | |
| I have the original string.</span></div> | |
| <div class="transcript-line" data-begin="3949.85"><span class="transcript-timestamp">1:05:49</span><span | |
| class="transcript-text">No biggie.</span></div> | |
| <div class="transcript-line" data-begin="3951.94"><span class="transcript-timestamp">1:05:51</span><span | |
| class="transcript-text">Let's say-- because | |
| I have all versions.</span></div> | |
| <div class="transcript-line" data-begin="3954.47"><span class="transcript-timestamp">1:05:54</span><span | |
| class="transcript-text">I never lose them.</span></div> | |
| <div class="transcript-line" data-begin="3955.52"><span class="transcript-timestamp">1:05:55</span><span | |
| class="transcript-text">So now instead, I'm going to | |
| cut the string here, let's say.</span></div> | |
| <div class="transcript-line" data-begin="3959.09"><span class="transcript-timestamp">1:05:59</span><span | |
| class="transcript-text">So now I have this and this.</span></div> | |
| <div class="transcript-line" data-begin="3963.71"><span class="transcript-timestamp">1:06:03</span><span | |
| class="transcript-text">And now I can do | |
| things like concatenate</span></div> | |
| <div class="transcript-line" data-begin="3966.62"><span class="transcript-timestamp">1:06:06</span><span | |
| class="transcript-text">from here to here to here.</span></div> | |
| <div class="transcript-line" data-begin="3970.01"><span class="transcript-timestamp">1:06:10</span><span | |
| class="transcript-text">And I will get this | |
| plus this plus this.</span></div> | |
| <div class="transcript-line" data-begin="3976.801"><span class="transcript-timestamp">1:06:16</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="3977.3"><span class="transcript-timestamp">1:06:17</span><span | |
| class="transcript-text">This guy moved here.</span></div> | |
| <div class="transcript-line" data-begin="3978.579"><span class="transcript-timestamp">1:06:18</span><span | |
| class="transcript-text">So that's a copy/paste | |
| operation with a constant number</span></div> | |
| <div class="transcript-line" data-begin="3980.87"><span class="transcript-timestamp">1:06:20</span><span | |
| class="transcript-text">of splits and concatenates.</span></div> | |
| <div class="transcript-line" data-begin="3982.1"><span class="transcript-timestamp">1:06:22</span><span | |
| class="transcript-text">I could also do cut and paste.</span></div> | |
| <div class="transcript-line" data-begin="3983.81"><span class="transcript-timestamp">1:06:23</span><span | |
| class="transcript-text">With confluence, I can | |
| do crazy cuts and pastes</span></div> | |
| <div class="transcript-line" data-begin="3986.72"><span class="transcript-timestamp">1:06:26</span><span | |
| class="transcript-text">in all sorts of ways.</span></div> | |
| <div class="transcript-line" data-begin="3988.95"><span class="transcript-timestamp">1:06:28</span><span | |
| class="transcript-text">So what?</span></div> | |
| <div class="transcript-line" data-begin="3989.91"><span class="transcript-timestamp">1:06:29</span><span | |
| class="transcript-text">Well, the so what | |
| is I can actually</span></div> | |
| <div class="transcript-line" data-begin="3992.12"><span class="transcript-timestamp">1:06:32</span><span | |
| class="transcript-text">double the size of | |
| my data structure</span></div> | |
| <div class="transcript-line" data-begin="3993.99"><span class="transcript-timestamp">1:06:33</span><span | |
| class="transcript-text">in a constant number | |
| of operations.</span></div> | |
| <div class="transcript-line" data-begin="3996.05"><span class="transcript-timestamp">1:06:36</span><span | |
| class="transcript-text">I can take, for example, | |
| the entire string</span></div> | |
| <div class="transcript-line" data-begin="3998.27"><span class="transcript-timestamp">1:06:38</span><span | |
| class="transcript-text">and concatenate it to itself.</span></div> | |
| <div class="transcript-line" data-begin="4000.031"><span class="transcript-timestamp">1:06:40</span><span | |
| class="transcript-text">That will double the | |
| number of characters,</span></div> | |
| <div class="transcript-line" data-begin="4001.78"><span class="transcript-timestamp">1:06:41</span><span | |
| class="transcript-text">number of elements in there.</span></div> | |
| <div class="transcript-line" data-begin="4003.74"><span class="transcript-timestamp">1:06:43</span><span | |
| class="transcript-text">I can do that again | |
| and again and again.</span></div> | |
| <div class="transcript-line" data-begin="4005.9"><span class="transcript-timestamp">1:06:45</span><span | |
| class="transcript-text">So in u updates, | |
| I can potentially</span></div> | |
| <div class="transcript-line" data-begin="4011.38"><span class="transcript-timestamp">1:06:51</span><span | |
| class="transcript-text">get a data structure | |
| size 2 to the u.</span></div> | |
| <div class="transcript-line" data-begin="4017.77"><span class="transcript-timestamp">1:06:57</span><span | |
| class="transcript-text">Kind of nifty.</span></div> | |
| <div class="transcript-line" data-begin="4018.61"><span class="transcript-timestamp">1:06:58</span><span | |
| class="transcript-text">I think this is why | |
| confluence is cool.</span></div> | |
| <div class="transcript-line" data-begin="4020.35"><span class="transcript-timestamp">1:07:00</span><span | |
| class="transcript-text">It's also why it's hard.</span></div> | |
| <div class="transcript-line" data-begin="4022.7"><span class="transcript-timestamp">1:07:02</span><span | |
| class="transcript-text">So not a big surprise.</span></div> | |
| <div class="transcript-line" data-begin="4023.9"><span class="transcript-timestamp">1:07:03</span><span | |
| class="transcript-text">But, here we go.</span></div> | |
| <div class="transcript-line" data-begin="4028.13"><span class="transcript-timestamp">1:07:08</span><span | |
| class="transcript-text">In that case, the version DAG, | |
| for reference, looks like this.</span></div> | |
| <div class="transcript-line" data-begin="4033.49"><span class="transcript-timestamp">1:07:13</span><span | |
| class="transcript-text">You're taking the same | |
| version, combining it.</span></div> | |
| <div class="transcript-line" data-begin="4036.18"><span class="transcript-timestamp">1:07:16</span><span | |
| class="transcript-text">So here I'm assuming I have | |
| a concatenate operation.</span></div> | |
| <div class="transcript-line" data-begin="4040.46"><span class="transcript-timestamp">1:07:20</span><span | |
| class="transcript-text">And so the effect here, | |
| every time I do this,</span></div> | |
| <div class="transcript-line" data-begin="4044.24"><span class="transcript-timestamp">1:07:24</span><span | |
| class="transcript-text">I double the size.</span></div> | |
| <div class="transcript-line" data-begin="4064.21"><span class="transcript-timestamp">1:07:44</span><span | |
| class="transcript-text">All right.</span></div> | |
| <div class="transcript-line" data-begin="4064.817"><span class="transcript-timestamp">1:07:44</span><span | |
| class="transcript-text">What do I want to say about | |
| confluent persistence?</span></div> | |
| <div class="transcript-line" data-begin="4066.9"><span class="transcript-timestamp">1:07:46</span><span | |
| class="transcript-text">All right.</span></div> | |
| <div class="transcript-line" data-begin="4067.399"><span class="transcript-timestamp">1:07:47</span><span | |
| class="transcript-text">Let me start with the | |
| most general result, which</span></div> | |
| <div class="transcript-line" data-begin="4073.2"><span class="transcript-timestamp">1:07:53</span><span | |
| class="transcript-text">is by Fiat and Kaplan in 2003.</span></div> | |
| <div class="transcript-line" data-begin="4084.34"><span class="transcript-timestamp">1:08:04</span><span | |
| class="transcript-text">They define a notion called | |
| effective depth of a version.</span></div> | |
| <div class="transcript-line" data-begin="4088.817"><span class="transcript-timestamp">1:08:08</span><span | |
| class="transcript-text">Let me just write it down.</span></div> | |
| <div class="transcript-line" data-begin="4101.18"><span class="transcript-timestamp">1:08:21</span><span | |
| class="transcript-text">It's kind of like | |
| if you took this DAG</span></div> | |
| <div class="transcript-line" data-begin="4104.87"><span class="transcript-timestamp">1:08:24</span><span | |
| class="transcript-text">and expanded it out to be a | |
| tree of all possible paths.</span></div> | |
| <div class="transcript-line" data-begin="4110.113"><span class="transcript-timestamp">1:08:30</span><span | |
| class="transcript-text">Instead of point | |
| to the same node,</span></div> | |
| <div class="transcript-line" data-begin="4111.529"><span class="transcript-timestamp">1:08:31</span><span | |
| class="transcript-text">you could just | |
| duplicate that node</span></div> | |
| <div class="transcript-line" data-begin="4113.33"><span class="transcript-timestamp">1:08:33</span><span | |
| class="transcript-text">and then have pointers | |
| left and right.</span></div> | |
| <div class="transcript-line" data-begin="4115.26"><span class="transcript-timestamp">1:08:35</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="4115.76"><span class="transcript-timestamp">1:08:35</span><span | |
| class="transcript-text">So if I did that, of course, | |
| this size grows exponentially.</span></div> | |
| <div class="transcript-line" data-begin="4118.218"><span class="transcript-timestamp">1:08:38</span><span | |
| class="transcript-text">It explicitly represents the | |
| size of my data structure.</span></div> | |
| <div class="transcript-line" data-begin="4121.31"><span class="transcript-timestamp">1:08:41</span><span | |
| class="transcript-text">At the bottom, if | |
| I have u things,</span></div> | |
| <div class="transcript-line" data-begin="4122.81"><span class="transcript-timestamp">1:08:42</span><span | |
| class="transcript-text">I'm going to have 2 to the | |
| u leaves at the bottom.</span></div> | |
| <div class="transcript-line" data-begin="4125.96"><span class="transcript-timestamp">1:08:45</span><span | |
| class="transcript-text">But then I can easily | |
| measure the number of paths</span></div> | |
| <div class="transcript-line" data-begin="4129.08"><span class="transcript-timestamp">1:08:49</span><span | |
| class="transcript-text">from the root to | |
| the same version.</span></div> | |
| <div class="transcript-line" data-begin="4130.5"><span class="transcript-timestamp">1:08:50</span><span | |
| class="transcript-text">At the bottom, I still | |
| label it, oh, those</span></div> | |
| <div class="transcript-line" data-begin="4132.25"><span class="transcript-timestamp">1:08:52</span><span | |
| class="transcript-text">are all v. They're all the | |
| same version down there.</span></div> | |
| <div class="transcript-line" data-begin="4134.63"><span class="transcript-timestamp">1:08:54</span><span | |
| class="transcript-text">So exponential number | |
| of paths, if I take log,</span></div> | |
| <div class="transcript-line" data-begin="4136.664"><span class="transcript-timestamp">1:08:56</span><span | |
| class="transcript-text">I get what I call | |
| effective depth.</span></div> | |
| <div class="transcript-line" data-begin="4138.08"><span class="transcript-timestamp">1:08:58</span><span | |
| class="transcript-text">It's like if you somehow | |
| could rebalance that tree,</span></div> | |
| <div class="transcript-line" data-begin="4142.25"><span class="transcript-timestamp">1:09:02</span><span | |
| class="transcript-text">this is the best you | |
| could hope to do.</span></div> | |
| <div class="transcript-line" data-begin="4145.91"><span class="transcript-timestamp">1:09:05</span><span | |
| class="transcript-text">It's not really a lower bound.</span></div> | |
| <div class="transcript-line" data-begin="4147.27"><span class="transcript-timestamp">1:09:07</span><span | |
| class="transcript-text">But it's a number.</span></div> | |
| <div class="transcript-line" data-begin="4148.04"><span class="transcript-timestamp">1:09:08</span><span | |
| class="transcript-text">It's a thing.</span></div> | |
| <div class="transcript-line" data-begin="4149"><span class="transcript-timestamp">1:09:09</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="4150.47"><span class="transcript-timestamp">1:09:10</span><span | |
| class="transcript-text">Then the result they achieve | |
| is that the overhead is</span></div> | |
| <div class="transcript-line" data-begin="4157.37"><span class="transcript-timestamp">1:09:17</span><span | |
| class="transcript-text">log the number of | |
| updates plus-- this</span></div> | |
| <div class="transcript-line" data-begin="4159.79"><span class="transcript-timestamp">1:09:19</span><span | |
| class="transcript-text">is a multiplicative overhead, | |
| so you take your running time.</span></div> | |
| <div class="transcript-line" data-begin="4162.29"><span class="transcript-timestamp">1:09:22</span><span | |
| class="transcript-text">You multiply it by this.</span></div> | |
| <div class="transcript-line" data-begin="4165.979"><span class="transcript-timestamp">1:09:25</span><span | |
| class="transcript-text">And this is a time | |
| and a space overhead.</span></div> | |
| <div class="transcript-line" data-begin="4171.529"><span class="transcript-timestamp">1:09:31</span><span | |
| class="transcript-text">So maximum effective depth | |
| of all versions, maybe even</span></div> | |
| <div class="transcript-line" data-begin="4174.26"><span class="transcript-timestamp">1:09:34</span><span | |
| class="transcript-text">sum of effective depths, but | |
| we'll just say max to be safe.</span></div> | |
| <div class="transcript-line" data-begin="4179.1"><span class="transcript-timestamp">1:09:39</span><span | |
| class="transcript-text">Sorry-- sum over | |
| all the operations.</span></div> | |
| <div class="transcript-line" data-begin="4181.8"><span class="transcript-timestamp">1:09:41</span><span | |
| class="transcript-text">This is per operation.</span></div> | |
| <div class="transcript-line" data-begin="4183.129"><span class="transcript-timestamp">1:09:43</span><span | |
| class="transcript-text">You pay basically | |
| the effective depth</span></div> | |
| <div class="transcript-line" data-begin="4184.67"><span class="transcript-timestamp">1:09:44</span><span | |
| class="transcript-text">of that operation as a factor.</span></div> | |
| <div class="transcript-line" data-begin="4188.779"><span class="transcript-timestamp">1:09:48</span><span | |
| class="transcript-text">Now, the annoying thing is if | |
| you have this kind of set up</span></div> | |
| <div class="transcript-line" data-begin="4191.33"><span class="transcript-timestamp">1:09:51</span><span | |
| class="transcript-text">where the size | |
| grew exponentially,</span></div> | |
| <div class="transcript-line" data-begin="4194.72"><span class="transcript-timestamp">1:09:54</span><span | |
| class="transcript-text">then number of paths | |
| is exponential.</span></div> | |
| <div class="transcript-line" data-begin="4196.49"><span class="transcript-timestamp">1:09:56</span><span | |
| class="transcript-text">Log of the number of | |
| paths is linear in u.</span></div> | |
| <div class="transcript-line" data-begin="4199.22"><span class="transcript-timestamp">1:09:59</span><span | |
| class="transcript-text">And so this factor could be | |
| as much as u, linear slowdown.</span></div> | |
| <div class="transcript-line" data-begin="4206.42"><span class="transcript-timestamp">1:10:06</span><span | |
| class="transcript-text">Now, Fiat and Kaplan argue | |
| linear slowdown is not</span></div> | |
| <div class="transcript-line" data-begin="4208.82"><span class="transcript-timestamp">1:10:08</span><span | |
| class="transcript-text">that bad, because if you weren't | |
| even persistent, if you did</span></div> | |
| <div class="transcript-line" data-begin="4213.44"><span class="transcript-timestamp">1:10:13</span><span | |
| class="transcript-text">this in the naive way of | |
| just recopying the data,</span></div> | |
| <div class="transcript-line" data-begin="4218.41"><span class="transcript-timestamp">1:10:18</span><span | |
| class="transcript-text">you were actually spending | |
| exponential time to build</span></div> | |
| <div class="transcript-line" data-begin="4221.579"><span class="transcript-timestamp">1:10:21</span><span | |
| class="transcript-text">the final data structure.</span></div> | |
| <div class="transcript-line" data-begin="4222.62"><span class="transcript-timestamp">1:10:22</span><span | |
| class="transcript-text">It has exponential size.</span></div> | |
| <div class="transcript-line" data-begin="4223.619"><span class="transcript-timestamp">1:10:23</span><span | |
| class="transcript-text">Just to represent it explicitly | |
| requires exponential time,</span></div> | |
| <div class="transcript-line" data-begin="4226.8"><span class="transcript-timestamp">1:10:26</span><span | |
| class="transcript-text">so losing a linear | |
| factor to do u operations</span></div> | |
| <div class="transcript-line" data-begin="4229.82"><span class="transcript-timestamp">1:10:29</span><span | |
| class="transcript-text">and now u squared time | |
| instead of 2 to the u.</span></div> | |
| <div class="transcript-line" data-begin="4231.8"><span class="transcript-timestamp">1:10:31</span><span | |
| class="transcript-text">So it's a big | |
| improvement to do this.</span></div> | |
| <div class="transcript-line" data-begin="4235.19"><span class="transcript-timestamp">1:10:35</span><span | |
| class="transcript-text">The downside of this approach is | |
| that even if you have a version</span></div> | |
| <div class="transcript-line" data-begin="4240.44"><span class="transcript-timestamp">1:10:40</span><span | |
| class="transcript-text">DAG that looks like this, | |
| even if the size of the data</span></div> | |
| <div class="transcript-line" data-begin="4243.41"><span class="transcript-timestamp">1:10:43</span><span | |
| class="transcript-text">structure is staying | |
| normal, staying linear, so</span></div> | |
| <div class="transcript-line" data-begin="4246.402"><span class="transcript-timestamp">1:10:46</span><span | |
| class="transcript-text">this potential, you could | |
| be doubling the size.</span></div> | |
| <div class="transcript-line" data-begin="4248.36"><span class="transcript-timestamp">1:10:48</span><span | |
| class="transcript-text">But we don't know what | |
| this merge operation is.</span></div> | |
| <div class="transcript-line" data-begin="4249.92"><span class="transcript-timestamp">1:10:49</span><span | |
| class="transcript-text">Maybe it just throws | |
| away one of the versions</span></div> | |
| <div class="transcript-line" data-begin="4251.794"><span class="transcript-timestamp">1:10:51</span><span | |
| class="transcript-text">or does something--</span></div> | |
| <div class="transcript-line" data-begin="4253.22"><span class="transcript-timestamp">1:10:53</span><span | |
| class="transcript-text">somehow takes half | |
| the nodes from one</span></div> | |
| <div class="transcript-line" data-begin="4255.23"><span class="transcript-timestamp">1:10:55</span><span | |
| class="transcript-text">side, half the nodes from | |
| the other side maybe.</span></div> | |
| <div class="transcript-line" data-begin="4257.188"><span class="transcript-timestamp">1:10:57</span><span | |
| class="transcript-text">These operations | |
| do preserve size.</span></div> | |
| <div class="transcript-line" data-begin="4258.83"><span class="transcript-timestamp">1:10:58</span><span | |
| class="transcript-text">Then there's no great reason why | |
| it should be a linear slowdown,</span></div> | |
| <div class="transcript-line" data-begin="4262.52"><span class="transcript-timestamp">1:11:02</span><span | |
| class="transcript-text">but it is.</span></div> | |
| <div class="transcript-line" data-begin="4263.671"><span class="transcript-timestamp">1:11:03</span><span | |
| class="transcript-text">OK?</span></div> | |
| <div class="transcript-line" data-begin="4264.17"><span class="transcript-timestamp">1:11:04</span><span | |
| class="transcript-text">So it's all right but not great.</span></div> | |
| <div class="transcript-line" data-begin="4270.83"><span class="transcript-timestamp">1:11:10</span><span | |
| class="transcript-text">And it's the best | |
| general result we know.</span></div> | |
| <div class="transcript-line" data-begin="4273.56"><span class="transcript-timestamp">1:11:13</span><span | |
| class="transcript-text">They also prove a lower bound.</span></div> | |
| <div class="transcript-line" data-begin="4281.42"><span class="transcript-timestamp">1:11:21</span><span | |
| class="transcript-text">So lower bound is some effect | |
| of depth, total bits of space.</span></div> | |
| <div class="transcript-line" data-begin="4297.23"><span class="transcript-timestamp">1:11:37</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="4297.73"><span class="transcript-timestamp">1:11:37</span><span | |
| class="transcript-text">What does this mean?</span></div> | |
| <div class="transcript-line" data-begin="4300.02"><span class="transcript-timestamp">1:11:40</span><span | |
| class="transcript-text">So even if this | |
| is not happening,</span></div> | |
| <div class="transcript-line" data-begin="4302.17"><span class="transcript-timestamp">1:11:42</span><span | |
| class="transcript-text">the number of bits | |
| of space you need</span></div> | |
| <div class="transcript-line" data-begin="4304.15"><span class="transcript-timestamp">1:11:44</span><span | |
| class="transcript-text">in the worst case-- | |
| this does not</span></div> | |
| <div class="transcript-line" data-begin="4305.8"><span class="transcript-timestamp">1:11:45</span><span | |
| class="transcript-text">apply to every data structure.</span></div> | |
| <div class="transcript-line" data-begin="4307.81"><span class="transcript-timestamp">1:11:47</span><span | |
| class="transcript-text">That's one catch.</span></div> | |
| <div class="transcript-line" data-begin="4309.79"><span class="transcript-timestamp">1:11:49</span><span | |
| class="transcript-text">They give a specific | |
| data structure</span></div> | |
| <div class="transcript-line" data-begin="4312.07"><span class="transcript-timestamp">1:11:52</span><span | |
| class="transcript-text">where you need this much space.</span></div> | |
| <div class="transcript-line" data-begin="4313.63"><span class="transcript-timestamp">1:11:53</span><span | |
| class="transcript-text">So it's similar to | |
| this kind of picture.</span></div> | |
| <div class="transcript-line" data-begin="4317.05"><span class="transcript-timestamp">1:11:57</span><span | |
| class="transcript-text">We'll go into the details.</span></div> | |
| <div class="transcript-line" data-begin="4318.94"><span class="transcript-timestamp">1:11:58</span><span | |
| class="transcript-text">And you need this much space.</span></div> | |
| <div class="transcript-line" data-begin="4320.86"><span class="transcript-timestamp">1:12:00</span><span | |
| class="transcript-text">Now, this is kind of | |
| bad, because if there's</span></div> | |
| <div class="transcript-line" data-begin="4322.72"><span class="transcript-timestamp">1:12:02</span><span | |
| class="transcript-text">u operations, and each of these | |
| is u, that's u squared space.</span></div> | |
| <div class="transcript-line" data-begin="4326.44"><span class="transcript-timestamp">1:12:06</span><span | |
| class="transcript-text">So we actually need a | |
| factor u blow up in space.</span></div> | |
| <div class="transcript-line" data-begin="4329.395"><span class="transcript-timestamp">1:12:09</span><span | |
| class="transcript-text">It looks like.</span></div> | |
| <div class="transcript-line" data-begin="4331.29"><span class="transcript-timestamp">1:12:11</span><span | |
| class="transcript-text">But to be more precise, | |
| what this means is</span></div> | |
| <div class="transcript-line" data-begin="4334.15"><span class="transcript-timestamp">1:12:14</span><span | |
| class="transcript-text">that you need omega e of | |
| v space, and therefore</span></div> | |
| <div class="transcript-line" data-begin="4337.27"><span class="transcript-timestamp">1:12:17</span><span | |
| class="transcript-text">time overhead per update, if--</span></div> | |
| <div class="transcript-line" data-begin="4347.83"><span class="transcript-timestamp">1:12:27</span><span | |
| class="transcript-text">this is not written | |
| in the paper--</span></div> | |
| <div class="transcript-line" data-begin="4349.57"><span class="transcript-timestamp">1:12:29</span><span | |
| class="transcript-text">queries are free.</span></div> | |
| <div class="transcript-line" data-begin="4355.3"><span class="transcript-timestamp">1:12:35</span><span | |
| class="transcript-text">Implicit here, they just want | |
| to slow down and increase space</span></div> | |
| <div class="transcript-line" data-begin="4360.4"><span class="transcript-timestamp">1:12:40</span><span | |
| class="transcript-text">for the updates you do, | |
| which is pretty natural.</span></div> | |
| <div class="transcript-line" data-begin="4363.31"><span class="transcript-timestamp">1:12:43</span><span | |
| class="transcript-text">Normally you think of queries | |
| as not increasing space.</span></div> | |
| <div class="transcript-line" data-begin="4366.87"><span class="transcript-timestamp">1:12:46</span><span | |
| class="transcript-text">But in order to construct | |
| this lower bound,</span></div> | |
| <div class="transcript-line" data-begin="4369.6"><span class="transcript-timestamp">1:12:49</span><span | |
| class="transcript-text">they actually do | |
| this many queries.</span></div> | |
| <div class="transcript-line" data-begin="4372.36"><span class="transcript-timestamp">1:12:52</span><span | |
| class="transcript-text">So they do e of v queries | |
| and then one update.</span></div> | |
| <div class="transcript-line" data-begin="4375.9"><span class="transcript-timestamp">1:12:55</span><span | |
| class="transcript-text">And they say, oh well, space | |
| had to go up by an extra e of v.</span></div> | |
| <div class="transcript-line" data-begin="4379.41"><span class="transcript-timestamp">1:12:59</span><span | |
| class="transcript-text">So if you only charge | |
| updates for the space,</span></div> | |
| <div class="transcript-line" data-begin="4382.47"><span class="transcript-timestamp">1:13:02</span><span | |
| class="transcript-text">then yes, you have | |
| to lose potentially</span></div> | |
| <div class="transcript-line" data-begin="4384.12"><span class="transcript-timestamp">1:13:04</span><span | |
| class="transcript-text">a linear factor, this effect | |
| of death, potentially u.</span></div> | |
| <div class="transcript-line" data-begin="4387.78"><span class="transcript-timestamp">1:13:07</span><span | |
| class="transcript-text">But if you also | |
| charge the queries,</span></div> | |
| <div class="transcript-line" data-begin="4389.55"><span class="transcript-timestamp">1:13:09</span><span | |
| class="transcript-text">it's still constant | |
| in their example.</span></div> | |
| <div class="transcript-line" data-begin="4393.27"><span class="transcript-timestamp">1:13:13</span><span | |
| class="transcript-text">So open question, for | |
| confluent persistence,</span></div> | |
| <div class="transcript-line" data-begin="4398.1"><span class="transcript-timestamp">1:13:18</span><span | |
| class="transcript-text">can you achieve | |
| constant everything?</span></div> | |
| <div class="transcript-line" data-begin="4401.13"><span class="transcript-timestamp">1:13:21</span><span | |
| class="transcript-text">Constant time and | |
| space overheads,</span></div> | |
| <div class="transcript-line" data-begin="4407.16"><span class="transcript-timestamp">1:13:27</span><span | |
| class="transcript-text">multiplicative | |
| factor per operation,</span></div> | |
| <div class="transcript-line" data-begin="4413.61"><span class="transcript-timestamp">1:13:33</span><span | |
| class="transcript-text">both updates and queries.</span></div> | |
| <div class="transcript-line" data-begin="4415.425"><span class="transcript-timestamp">1:13:35</span><span | |
| class="transcript-text">So if you charge the | |
| queries, potentially you</span></div> | |
| <div class="transcript-line" data-begin="4417.3"><span class="transcript-timestamp">1:13:37</span><span | |
| class="transcript-text">could get constant everything.</span></div> | |
| <div class="transcript-line" data-begin="4418.98"><span class="transcript-timestamp">1:13:38</span><span | |
| class="transcript-text">This is a relatively | |
| new realization.</span></div> | |
| <div class="transcript-line" data-begin="4423.89"><span class="transcript-timestamp">1:13:43</span><span | |
| class="transcript-text">And no one knows | |
| how to do this yet.</span></div> | |
| <div class="transcript-line" data-begin="4427.325"><span class="transcript-timestamp">1:13:47</span><span | |
| class="transcript-text">Nice challenge.</span></div> | |
| <div class="transcript-line" data-begin="4427.95"><span class="transcript-timestamp">1:13:47</span><span | |
| class="transcript-text">I think maybe we'll work on that | |
| in our first problem session.</span></div> | |
| <div class="transcript-line" data-begin="4430.53"><span class="transcript-timestamp">1:13:50</span><span | |
| class="transcript-text">I would like to.</span></div> | |
| <div class="transcript-line" data-begin="4433.6"><span class="transcript-timestamp">1:13:53</span><span | |
| class="transcript-text">Questions about that result?</span></div> | |
| <div class="transcript-line" data-begin="4434.77"><span class="transcript-timestamp">1:13:54</span><span | |
| class="transcript-text">I'm not going to | |
| prove the result.</span></div> | |
| <div class="transcript-line" data-begin="4436.45"><span class="transcript-timestamp">1:13:56</span><span | |
| class="transcript-text">But it is a fancy | |
| rebalancing of those kinds</span></div> | |
| <div class="transcript-line" data-begin="4439.54"><span class="transcript-timestamp">1:13:59</span><span | |
| class="transcript-text">of pictures to get this log.</span></div> | |
| <div class="transcript-line" data-begin="4450.266"><span class="transcript-timestamp">1:14:10</span><span | |
| class="transcript-text">There are other results | |
| I'd like to tell you about.</span></div> | |
| <div class="transcript-line" data-begin="4472.63"><span class="transcript-timestamp">1:14:32</span><span | |
| class="transcript-text">So brand new result--</span></div> | |
| <div class="transcript-line" data-begin="4474.71"><span class="transcript-timestamp">1:14:34</span><span | |
| class="transcript-text">that was from 2003.</span></div> | |
| <div class="transcript-line" data-begin="4475.98"><span class="transcript-timestamp">1:14:35</span><span | |
| class="transcript-text">This is from 2012--</span></div> | |
| <div class="transcript-line" data-begin="4478.3"><span class="transcript-timestamp">1:14:38</span><span | |
| class="transcript-text">no, '11, '11, sorry.</span></div> | |
| <div class="transcript-line" data-begin="4482.59"><span class="transcript-timestamp">1:14:42</span><span | |
| class="transcript-text">It's SOTO, which is in January, | |
| so it's a little confusing.</span></div> | |
| <div class="transcript-line" data-begin="4487.48"><span class="transcript-timestamp">1:14:47</span><span | |
| class="transcript-text">Is it '11?</span></div> | |
| <div class="transcript-line" data-begin="4489.25"><span class="transcript-timestamp">1:14:49</span><span | |
| class="transcript-text">Maybe '12.</span></div> | |
| <div class="transcript-line" data-begin="4490.267"><span class="transcript-timestamp">1:14:50</span><span | |
| class="transcript-text">Actually now I'm not sure.</span></div> | |
| <div class="transcript-line" data-begin="4491.35"><span class="transcript-timestamp">1:14:51</span><span | |
| class="transcript-text">It's February already, right?</span></div> | |
| <div class="transcript-line" data-begin="4494.75"><span class="transcript-timestamp">1:14:54</span><span | |
| class="transcript-text">A January, either this | |
| year or last year.</span></div> | |
| <div class="transcript-line" data-begin="4500.31"><span class="transcript-timestamp">1:15:00</span><span | |
| class="transcript-text">It's not as general | |
| a transformation.</span></div> | |
| <div class="transcript-line" data-begin="4502.84"><span class="transcript-timestamp">1:15:02</span><span | |
| class="transcript-text">It's only going to hold in | |
| what's called a disjoint case.</span></div> | |
| <div class="transcript-line" data-begin="4505.33"><span class="transcript-timestamp">1:15:05</span><span | |
| class="transcript-text">But it gets a very good bound--</span></div> | |
| <div class="transcript-line" data-begin="4507.82"><span class="transcript-timestamp">1:15:07</span><span | |
| class="transcript-text">not quite constant, | |
| but logarithmic.</span></div> | |
| <div class="transcript-line" data-begin="4509.85"><span class="transcript-timestamp">1:15:09</span><span | |
| class="transcript-text">OK, logarithmic | |
| would also be nice.</span></div> | |
| <div class="transcript-line" data-begin="4512.42"><span class="transcript-timestamp">1:15:12</span><span | |
| class="transcript-text">Or log, log n, whatever n is.</span></div> | |
| <div class="transcript-line" data-begin="4517.075"><span class="transcript-timestamp">1:15:17</span><span | |
| class="transcript-text">Pick your favorite n, | |
| number of operations, say.</span></div> | |
| <div class="transcript-line" data-begin="4522.45"><span class="transcript-timestamp">1:15:22</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="4525.7"><span class="transcript-timestamp">1:15:25</span><span | |
| class="transcript-text">If you assume that confluent | |
| operations are performed only</span></div> | |
| <div class="transcript-line" data-begin="4539.83"><span class="transcript-timestamp">1:15:39</span><span | |
| class="transcript-text">on two versions with | |
| no shared nodes--</span></div> | |
| <div class="transcript-line" data-begin="4550.36"><span class="transcript-timestamp">1:15:50</span><span | |
| class="transcript-text">OK, this would be a way to | |
| forbid this kind of behavior</span></div> | |
| <div class="transcript-line" data-begin="4553.87"><span class="transcript-timestamp">1:15:53</span><span | |
| class="transcript-text">where I concatenate the | |
| data structure with itself.</span></div> | |
| <div class="transcript-line" data-begin="4556.66"><span class="transcript-timestamp">1:15:56</span><span | |
| class="transcript-text">All the nodes are common.</span></div> | |
| <div class="transcript-line" data-begin="4558.52"><span class="transcript-timestamp">1:15:58</span><span | |
| class="transcript-text">If I guarantee that maybe I, you | |
| know, slice this up, slice it,</span></div> | |
| <div class="transcript-line" data-begin="4561.84"><span class="transcript-timestamp">1:16:01</span><span | |
| class="transcript-text">dice it, wherever, and | |
| then re-emerge them</span></div> | |
| <div class="transcript-line" data-begin="4563.59"><span class="transcript-timestamp">1:16:03</span><span | |
| class="transcript-text">in some other order, but | |
| I never use two copies</span></div> | |
| <div class="transcript-line" data-begin="4566.23"><span class="transcript-timestamp">1:16:06</span><span | |
| class="transcript-text">of the same piece, that | |
| would be a valid confluent</span></div> | |
| <div class="transcript-line" data-begin="4570.13"><span class="transcript-timestamp">1:16:10</span><span | |
| class="transcript-text">operation over here.</span></div> | |
| <div class="transcript-line" data-begin="4572.26"><span class="transcript-timestamp">1:16:12</span><span | |
| class="transcript-text">This is quite a | |
| strong restriction</span></div> | |
| <div class="transcript-line" data-begin="4573.88"><span class="transcript-timestamp">1:16:13</span><span | |
| class="transcript-text">that you're not allowed.</span></div> | |
| <div class="transcript-line" data-begin="4576.58"><span class="transcript-timestamp">1:16:16</span><span | |
| class="transcript-text">If you try to, who | |
| knows what happens.</span></div> | |
| <div class="transcript-line" data-begin="4579.03"><span class="transcript-timestamp">1:16:19</span><span | |
| class="transcript-text">Behavior's undefined.</span></div> | |
| <div class="transcript-line" data-begin="4579.98"><span class="transcript-timestamp">1:16:19</span><span | |
| class="transcript-text">So won't tell you, | |
| oh, those two versions</span></div> | |
| <div class="transcript-line" data-begin="4581.83"><span class="transcript-timestamp">1:16:21</span><span | |
| class="transcript-text">have this node in common.</span></div> | |
| <div class="transcript-line" data-begin="4582.871"><span class="transcript-timestamp">1:16:22</span><span | |
| class="transcript-text">You've got to make | |
| a second copy of it.</span></div> | |
| <div class="transcript-line" data-begin="4584.6"><span class="transcript-timestamp">1:16:24</span><span | |
| class="transcript-text">So somehow you have to guarantee | |
| that control and operations</span></div> | |
| <div class="transcript-line" data-begin="4587.099"><span class="transcript-timestamp">1:16:27</span><span | |
| class="transcript-text">never overlap.</span></div> | |
| <div class="transcript-line" data-begin="4589.27"><span class="transcript-timestamp">1:16:29</span><span | |
| class="transcript-text">But they can be reordered.</span></div> | |
| <div class="transcript-line" data-begin="4593.74"><span class="transcript-timestamp">1:16:33</span><span | |
| class="transcript-text">Then you can get | |
| order log n overhead.</span></div> | |
| <div class="transcript-line" data-begin="4599.5"><span class="transcript-timestamp">1:16:39</span><span | |
| class="transcript-text">n is the number of operations.</span></div> | |
| <div class="transcript-line" data-begin="4605.39"><span class="transcript-timestamp">1:16:45</span><span | |
| class="transcript-text">I have a sketch | |
| of a proof of this</span></div> | |
| <div class="transcript-line" data-begin="4606.97"><span class="transcript-timestamp">1:16:46</span><span | |
| class="transcript-text">but not very much | |
| time to talk about it.</span></div> | |
| <div class="transcript-line" data-begin="4608.87"><span class="transcript-timestamp">1:16:48</span><span | |
| class="transcript-text">All right.</span></div> | |
| <div class="transcript-line" data-begin="4609.37"><span class="transcript-timestamp">1:16:49</span><span | |
| class="transcript-text">Let me give you a quick picture.</span></div> | |
| <div class="transcript-line" data-begin="4611.57"><span class="transcript-timestamp">1:16:51</span><span | |
| class="transcript-text">In general, the | |
| versions form a DAG.</span></div> | |
| <div class="transcript-line" data-begin="4615.79"><span class="transcript-timestamp">1:16:55</span><span | |
| class="transcript-text">But if you make this assumption, | |
| and you look at a single node,</span></div> | |
| <div class="transcript-line" data-begin="4620.95"><span class="transcript-timestamp">1:17:00</span><span | |
| class="transcript-text">and look at all the versions | |
| where that node appears,</span></div> | |
| <div class="transcript-line" data-begin="4623.62"><span class="transcript-timestamp">1:17:03</span><span | |
| class="transcript-text">that is a tree.</span></div> | |
| <div class="transcript-line" data-begin="4625.21"><span class="transcript-timestamp">1:17:05</span><span | |
| class="transcript-text">Because you're not allowed | |
| to remerge versions</span></div> | |
| <div class="transcript-line" data-begin="4627.37"><span class="transcript-timestamp">1:17:07</span><span | |
| class="transcript-text">that have the same node.</span></div> | |
| <div class="transcript-line" data-begin="4628.72"><span class="transcript-timestamp">1:17:08</span><span | |
| class="transcript-text">So while the big | |
| picture is a DAG,</span></div> | |
| <div class="transcript-line" data-begin="4631.48"><span class="transcript-timestamp">1:17:11</span><span | |
| class="transcript-text">the small picture of a | |
| single guy is some tree.</span></div> | |
| <div class="transcript-line" data-begin="4637.504"><span class="transcript-timestamp">1:17:17</span><span | |
| class="transcript-text">I'm drawing all | |
| these wiggly lines</span></div> | |
| <div class="transcript-line" data-begin="4638.92"><span class="transcript-timestamp">1:17:18</span><span | |
| class="transcript-text">because there are all | |
| these versions where</span></div> | |
| <div class="transcript-line" data-begin="4640"><span class="transcript-timestamp">1:17:20</span><span | |
| class="transcript-text">the node isn't changing.</span></div> | |
| <div class="transcript-line" data-begin="4641.56"><span class="transcript-timestamp">1:17:21</span><span | |
| class="transcript-text">This is the entire version DAG.</span></div> | |
| <div class="transcript-line" data-begin="4643.3"><span class="transcript-timestamp">1:17:23</span><span | |
| class="transcript-text">And then some of these nodes--</span></div> | |
| <div class="transcript-line" data-begin="4646.54"><span class="transcript-timestamp">1:17:26</span><span | |
| class="transcript-text">some of these versions, | |
| I should say--</span></div> | |
| <div class="transcript-line" data-begin="4649"><span class="transcript-timestamp">1:17:29</span><span | |
| class="transcript-text">that node that we're | |
| thinking about changes.</span></div> | |
| <div class="transcript-line" data-begin="4651.925"><span class="transcript-timestamp">1:17:31</span><span | |
| class="transcript-text">OK, whenever it | |
| branches, it's probably</span></div> | |
| <div class="transcript-line" data-begin="4653.86"><span class="transcript-timestamp">1:17:33</span><span | |
| class="transcript-text">because the actual | |
| node changed, maybe.</span></div> | |
| <div class="transcript-line" data-begin="4656.41"><span class="transcript-timestamp">1:17:36</span><span | |
| class="transcript-text">I don't know.</span></div> | |
| <div class="transcript-line" data-begin="4657.47"><span class="transcript-timestamp">1:17:37</span><span | |
| class="transcript-text">Anyway there are some dots | |
| here where the version changed,</span></div> | |
| <div class="transcript-line" data-begin="4660.17"><span class="transcript-timestamp">1:17:40</span><span | |
| class="transcript-text">some of the leaves, | |
| maybe, that changed.</span></div> | |
| <div class="transcript-line" data-begin="4661.96"><span class="transcript-timestamp">1:17:41</span><span | |
| class="transcript-text">Maybe some of them haven't yet.</span></div> | |
| <div class="transcript-line" data-begin="4664.42"><span class="transcript-timestamp">1:17:44</span><span | |
| class="transcript-text">In fact, let's see.</span></div> | |
| <div class="transcript-line" data-begin="4668.35"><span class="transcript-timestamp">1:17:48</span><span | |
| class="transcript-text">Here where it's change, it could | |
| be that we destroyed the node.</span></div> | |
| <div class="transcript-line" data-begin="4671.17"><span class="transcript-timestamp">1:17:51</span><span | |
| class="transcript-text">Maybe it's gone from the | |
| actual data structure.</span></div> | |
| <div class="transcript-line" data-begin="4674.56"><span class="transcript-timestamp">1:17:54</span><span | |
| class="transcript-text">But there still may | |
| be versions down here.</span></div> | |
| <div class="transcript-line" data-begin="4676.542"><span class="transcript-timestamp">1:17:56</span><span | |
| class="transcript-text">It's not really a tree.</span></div> | |
| <div class="transcript-line" data-begin="4677.5"><span class="transcript-timestamp">1:17:57</span><span | |
| class="transcript-text">It's a whole DAG of | |
| stuff down there.</span></div> | |
| <div class="transcript-line" data-begin="4679.48"><span class="transcript-timestamp">1:17:59</span><span | |
| class="transcript-text">So that's kind of ugly.</span></div> | |
| <div class="transcript-line" data-begin="4681.4"><span class="transcript-timestamp">1:18:01</span><span | |
| class="transcript-text">Where never the | |
| node still exists,</span></div> | |
| <div class="transcript-line" data-begin="4683.08"><span class="transcript-timestamp">1:18:03</span><span | |
| class="transcript-text">I guess that is an | |
| actual leaf of the DAG.</span></div> | |
| <div class="transcript-line" data-begin="4685.3"><span class="transcript-timestamp">1:18:05</span><span | |
| class="transcript-text">So those are OK.</span></div> | |
| <div class="transcript-line" data-begin="4686.65"><span class="transcript-timestamp">1:18:06</span><span | |
| class="transcript-text">But as soon as I maybe | |
| delete that node,</span></div> | |
| <div class="transcript-line" data-begin="4688.87"><span class="transcript-timestamp">1:18:08</span><span | |
| class="transcript-text">then there can be a | |
| whole subtree down there.</span></div> | |
| <div class="transcript-line" data-begin="4691.61"><span class="transcript-timestamp">1:18:11</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="4692.11"><span class="transcript-timestamp">1:18:12</span><span | |
| class="transcript-text">So now if you look at | |
| an arbitrary version,</span></div> | |
| <div class="transcript-line" data-begin="4695.12"><span class="transcript-timestamp">1:18:15</span><span | |
| class="transcript-text">so what we're thinking about | |
| is how to implement reading,</span></div> | |
| <div class="transcript-line" data-begin="4697.58"><span class="transcript-timestamp">1:18:17</span><span | |
| class="transcript-text">let's say.</span></div> | |
| <div class="transcript-line" data-begin="4698.08"><span class="transcript-timestamp">1:18:18</span><span | |
| class="transcript-text">Reading and writing are | |
| more or less the same.</span></div> | |
| <div class="transcript-line" data-begin="4701.11"><span class="transcript-timestamp">1:18:21</span><span | |
| class="transcript-text">I give you a version.</span></div> | |
| <div class="transcript-line" data-begin="4702.28"><span class="transcript-timestamp">1:18:22</span><span | |
| class="transcript-text">I give you a node, and | |
| I give you a field.</span></div> | |
| <div class="transcript-line" data-begin="4703.72"><span class="transcript-timestamp">1:18:23</span><span | |
| class="transcript-text">I want to know, what is the | |
| value of that field, that node,</span></div> | |
| <div class="transcript-line" data-begin="4706.18"><span class="transcript-timestamp">1:18:26</span><span | |
| class="transcript-text">that version?</span></div> | |
| <div class="transcript-line" data-begin="4707.81"><span class="transcript-timestamp">1:18:27</span><span | |
| class="transcript-text">So now where could | |
| a version fall?</span></div> | |
| <div class="transcript-line" data-begin="4710.014"><span class="transcript-timestamp">1:18:30</span><span | |
| class="transcript-text">Well it has to be | |
| in this subtree.</span></div> | |
| <div class="transcript-line" data-begin="4711.43"><span class="transcript-timestamp">1:18:31</span><span | |
| class="transcript-text">Because the node has to exist.</span></div> | |
| <div class="transcript-line" data-begin="4716.95"><span class="transcript-timestamp">1:18:36</span><span | |
| class="transcript-text">And then it's maybe a pointer.</span></div> | |
| <div class="transcript-line" data-begin="4718.39"><span class="transcript-timestamp">1:18:38</span><span | |
| class="transcript-text">A pointer could be to | |
| another node, which</span></div> | |
| <div class="transcript-line" data-begin="4722.83"><span class="transcript-timestamp">1:18:42</span><span | |
| class="transcript-text">also has this kind of picture.</span></div> | |
| <div class="transcript-line" data-begin="4724.54"><span class="transcript-timestamp">1:18:44</span><span | |
| class="transcript-text">They could be overlapping trees.</span></div> | |
| <div class="transcript-line" data-begin="4726.46"><span class="transcript-timestamp">1:18:46</span><span | |
| class="transcript-text">In general, there | |
| are three cases.</span></div> | |
| <div class="transcript-line" data-begin="4728.14"><span class="transcript-timestamp">1:18:48</span><span | |
| class="transcript-text">Either you're lucky, and the | |
| version you're talking about</span></div> | |
| <div class="transcript-line" data-begin="4731.11"><span class="transcript-timestamp">1:18:51</span><span | |
| class="transcript-text">is a version where | |
| the node was changed.</span></div> | |
| <div class="transcript-line" data-begin="4733.96"><span class="transcript-timestamp">1:18:53</span><span | |
| class="transcript-text">In that case, the data is | |
| just stored right there.</span></div> | |
| <div class="transcript-line" data-begin="4738.47"><span class="transcript-timestamp">1:18:58</span><span | |
| class="transcript-text">That's easy.</span></div> | |
| <div class="transcript-line" data-begin="4739.125"><span class="transcript-timestamp">1:18:59</span><span | |
| class="transcript-text">So you could just say, oh, | |
| how did the node change?</span></div> | |
| <div class="transcript-line" data-begin="4741.25"><span class="transcript-timestamp">1:19:01</span><span | |
| class="transcript-text">Oh, that's what the field is.</span></div> | |
| <div class="transcript-line" data-begin="4742.63"><span class="transcript-timestamp">1:19:02</span><span | |
| class="transcript-text">OK, follow the pointer.</span></div> | |
| <div class="transcript-line" data-begin="4745.19"><span class="transcript-timestamp">1:19:05</span><span | |
| class="transcript-text">A slightly harder | |
| case it's a version</span></div> | |
| <div class="transcript-line" data-begin="4748.21"><span class="transcript-timestamp">1:19:08</span><span | |
| class="transcript-text">in between two such changes.</span></div> | |
| <div class="transcript-line" data-begin="4749.59"><span class="transcript-timestamp">1:19:09</span><span | |
| class="transcript-text">And maybe these are not updates.</span></div> | |
| <div class="transcript-line" data-begin="4751.66"><span class="transcript-timestamp">1:19:11</span><span | |
| class="transcript-text">So I sort of want to know, what | |
| was the previous version where</span></div> | |
| <div class="transcript-line" data-begin="4757.33"><span class="transcript-timestamp">1:19:17</span><span | |
| class="transcript-text">this node changed | |
| in constant time?</span></div> | |
| <div class="transcript-line" data-begin="4761.65"><span class="transcript-timestamp">1:19:21</span><span | |
| class="transcript-text">It can be done.</span></div> | |
| <div class="transcript-line" data-begin="4762.62"><span class="transcript-timestamp">1:19:22</span><span | |
| class="transcript-text">Not constant time, | |
| actually, logarithmic time,</span></div> | |
| <div class="transcript-line" data-begin="4765.16"><span class="transcript-timestamp">1:19:25</span><span | |
| class="transcript-text">using a data structure | |
| called link-cut trees,</span></div> | |
| <div class="transcript-line" data-begin="4768.12"><span class="transcript-timestamp">1:19:28</span><span | |
| class="transcript-text">another fun black | |
| box for now, which</span></div> | |
| <div class="transcript-line" data-begin="4771.01"><span class="transcript-timestamp">1:19:31</span><span | |
| class="transcript-text">we will cover in lecture | |
| 19, far in the future.</span></div> | |
| <div class="transcript-line" data-begin="4776.171"><span class="transcript-timestamp">1:19:36</span><span | |
| class="transcript-text">OK.</span></div> | |
| <div class="transcript-line" data-begin="4779.884"><span class="transcript-timestamp">1:19:39</span><span | |
| class="transcript-text">Well, that's one case.</span></div> | |
| <div class="transcript-line" data-begin="4780.8"><span class="transcript-timestamp">1:19:40</span><span | |
| class="transcript-text">There's also the version | |
| where maybe a version</span></div> | |
| <div class="transcript-line" data-begin="4783.19"><span class="transcript-timestamp">1:19:43</span><span | |
| class="transcript-text">is down here in a subtree.</span></div> | |
| <div class="transcript-line" data-begin="4785.11"><span class="transcript-timestamp">1:19:45</span><span | |
| class="transcript-text">I guess then the | |
| node didn't exist.</span></div> | |
| <div class="transcript-line" data-begin="4788.34"><span class="transcript-timestamp">1:19:48</span><span | |
| class="transcript-text">Well, all these | |
| things can happen.</span></div> | |
| <div class="transcript-line" data-begin="4790.49"><span class="transcript-timestamp">1:19:50</span><span | |
| class="transcript-text">And that's even harder.</span></div> | |
| <div class="transcript-line" data-begin="4791.8"><span class="transcript-timestamp">1:19:51</span><span | |
| class="transcript-text">It's messy.</span></div> | |
| <div class="transcript-line" data-begin="4793.36"><span class="transcript-timestamp">1:19:53</span><span | |
| class="transcript-text">They use another trick, which | |
| is called fractional cascading,</span></div> | |
| <div class="transcript-line" data-begin="4799.72"><span class="transcript-timestamp">1:19:59</span><span | |
| class="transcript-text">which I'm not even going to | |
| try to describe what it means.</span></div> | |
| <div class="transcript-line" data-begin="4802.24"><span class="transcript-timestamp">1:20:02</span><span | |
| class="transcript-text">But it's got a very cool name.</span></div> | |
| <div class="transcript-line" data-begin="4804.19"><span class="transcript-timestamp">1:20:04</span><span | |
| class="transcript-text">Because we'll be | |
| covering it in lecture 3.</span></div> | |
| <div class="transcript-line" data-begin="4806.08"><span class="transcript-timestamp">1:20:06</span><span | |
| class="transcript-text">So stay tuned for that.</span></div> | |
| <div class="transcript-line" data-begin="4807.284"><span class="transcript-timestamp">1:20:07</span><span | |
| class="transcript-text">I'm not going to say how | |
| it applies to this setting,</span></div> | |
| <div class="transcript-line" data-begin="4809.45"><span class="transcript-timestamp">1:20:09</span><span | |
| class="transcript-text">but it's a necessary | |
| step in here.</span></div> | |
| <div class="transcript-line" data-begin="4813.33"><span class="transcript-timestamp">1:20:13</span><span | |
| class="transcript-text">In the remaining | |
| zero minutes, let</span></div> | |
| <div class="transcript-line" data-begin="4815.364"><span class="transcript-timestamp">1:20:15</span><span | |
| class="transcript-text">me tell you a little bit about | |
| functional data structures.</span></div> | |
| <div class="transcript-line" data-begin="4817.78"><span class="transcript-timestamp">1:20:17</span><span | |
| class="transcript-text">[LAUGHTER]</span></div> | |
| <div class="transcript-line" data-begin="4820.9"><span class="transcript-timestamp">1:20:20</span><span | |
| class="transcript-text">Beauty of time travel.</span></div> | |
| <div class="transcript-line" data-begin="4824.83"><span class="transcript-timestamp">1:20:24</span><span | |
| class="transcript-text">Functional-- I just | |
| want to give you</span></div> | |
| <div class="transcript-line" data-begin="4831.13"><span class="transcript-timestamp">1:20:31</span><span | |
| class="transcript-text">some examples of things that | |
| can be done functionally.</span></div> | |
| <div class="transcript-line" data-begin="4833.59"><span class="transcript-timestamp">1:20:33</span><span | |
| class="transcript-text">There's a whole book about | |
| functional data structures</span></div> | |
| <div class="transcript-line" data-begin="4835.798"><span class="transcript-timestamp">1:20:35</span><span | |
| class="transcript-text">by Okasaki.</span></div> | |
| <div class="transcript-line" data-begin="4836.7"><span class="transcript-timestamp">1:20:36</span><span | |
| class="transcript-text">It's pretty cool.</span></div> | |
| <div class="transcript-line" data-begin="4838.18"><span class="transcript-timestamp">1:20:38</span><span | |
| class="transcript-text">A simple example | |
| is balanced BSTs.</span></div> | |
| <div class="transcript-line" data-begin="4842.32"><span class="transcript-timestamp">1:20:42</span><span | |
| class="transcript-text">So if you just want to get | |
| log n time for everything,</span></div> | |
| <div class="transcript-line" data-begin="4844.6"><span class="transcript-timestamp">1:20:44</span><span | |
| class="transcript-text">you can do that functionally.</span></div> | |
| <div class="transcript-line" data-begin="4845.89"><span class="transcript-timestamp">1:20:45</span><span | |
| class="transcript-text">It's actually really easy.</span></div> | |
| <div class="transcript-line" data-begin="4846.89"><span class="transcript-timestamp">1:20:46</span><span | |
| class="transcript-text">You pick your favorite balance | |
| BST, like red black trees.</span></div> | |
| <div class="transcript-line" data-begin="4848.92"><span class="transcript-timestamp">1:20:48</span><span | |
| class="transcript-text">You implement it top down so you | |
| never follow parent pointers.</span></div> | |
| <div class="transcript-line" data-begin="4851.26"><span class="transcript-timestamp">1:20:51</span><span | |
| class="transcript-text">So you don't need | |
| parent pointers.</span></div> | |
| <div class="transcript-line" data-begin="4852.71"><span class="transcript-timestamp">1:20:52</span><span | |
| class="transcript-text">So then as you make changes | |
| down the tree, you just copy.</span></div> | |
| <div class="transcript-line" data-begin="4857.71"><span class="transcript-timestamp">1:20:57</span><span | |
| class="transcript-text">It's called path copying.</span></div> | |
| <div class="transcript-line" data-begin="4858.995"><span class="transcript-timestamp">1:20:58</span><span | |
| class="transcript-text">Whenever you're about | |
| to make a change,</span></div> | |
| <div class="transcript-line" data-begin="4860.62"><span class="transcript-timestamp">1:21:00</span><span | |
| class="transcript-text">make a copy of that node.</span></div> | |
| <div class="transcript-line" data-begin="4862.07"><span class="transcript-timestamp">1:21:02</span><span | |
| class="transcript-text">So you end up copying all | |
| the change nodes and all</span></div> | |
| <div class="transcript-line" data-begin="4865.45"><span class="transcript-timestamp">1:21:05</span><span | |
| class="transcript-text">their ancestors.</span></div> | |
| <div class="transcript-line" data-begin="4866.2"><span class="transcript-timestamp">1:21:06</span><span | |
| class="transcript-text">There's only log n of them, | |
| so it takes log n time.</span></div> | |
| <div class="transcript-line" data-begin="4869.65"><span class="transcript-timestamp">1:21:09</span><span | |
| class="transcript-text">Clear?</span></div> | |
| <div class="transcript-line" data-begin="4870.5"><span class="transcript-timestamp">1:21:10</span><span | |
| class="transcript-text">Easy.</span></div> | |
| <div class="transcript-line" data-begin="4871.5"><span class="transcript-timestamp">1:21:11</span><span | |
| class="transcript-text">It's a nice technique.</span></div> | |
| <div class="transcript-line" data-begin="4872.62"><span class="transcript-timestamp">1:21:12</span><span | |
| class="transcript-text">Sometimes path copying | |
| is very useful.</span></div> | |
| <div class="transcript-line" data-begin="4874.6"><span class="transcript-timestamp">1:21:14</span><span | |
| class="transcript-text">Like link-cut | |
| trees, for example,</span></div> | |
| <div class="transcript-line" data-begin="4876.17"><span class="transcript-timestamp">1:21:16</span><span | |
| class="transcript-text">can be made functional.</span></div> | |
| <div class="transcript-line" data-begin="4877.45"><span class="transcript-timestamp">1:21:17</span><span | |
| class="transcript-text">We don't know what they are, | |
| but they're basically a BST.</span></div> | |
| <div class="transcript-line" data-begin="4879.905"><span class="transcript-timestamp">1:21:19</span><span | |
| class="transcript-text">And you can make | |
| them functional.</span></div> | |
| <div class="transcript-line" data-begin="4881.28"><span class="transcript-timestamp">1:21:21</span><span | |
| class="transcript-text">We use that in a paper.</span></div> | |
| <div class="transcript-line" data-begin="4883.291"><span class="transcript-timestamp">1:21:23</span><span | |
| class="transcript-text">All right.</span></div> | |
| <div class="transcript-line" data-begin="4883.79"><span class="transcript-timestamp">1:21:23</span><span | |
| class="transcript-text">Deques.</span></div> | |
| <div class="transcript-line" data-begin="4885.97"><span class="transcript-timestamp">1:21:25</span><span | |
| class="transcript-text">These are doubly ended queues.</span></div> | |
| <div class="transcript-line" data-begin="4887.8"><span class="transcript-timestamp">1:21:27</span><span | |
| class="transcript-text">So it's like a stack and | |
| a queue and everything.</span></div> | |
| <div class="transcript-line" data-begin="4889.99"><span class="transcript-timestamp">1:21:29</span><span | |
| class="transcript-text">You can insert and delete from | |
| the beginning and the end.</span></div> | |
| <div class="transcript-line" data-begin="4892.9"><span class="transcript-timestamp">1:21:32</span><span | |
| class="transcript-text">People start to know | |
| what these are now,</span></div> | |
| <div class="transcript-line" data-begin="4894.73"><span class="transcript-timestamp">1:21:34</span><span | |
| class="transcript-text">because Python calls him that.</span></div> | |
| <div class="transcript-line" data-begin="4895.98"><span class="transcript-timestamp">1:21:35</span><span | |
| class="transcript-text">But you can also | |
| do concatenation</span></div> | |
| <div class="transcript-line" data-begin="4901.09"><span class="transcript-timestamp">1:21:41</span><span | |
| class="transcript-text">with deques in constant | |
| time per operation.</span></div> | |
| <div class="transcript-line" data-begin="4903.31"><span class="transcript-timestamp">1:21:43</span><span | |
| class="transcript-text">This is cool.</span></div> | |
| <div class="transcript-line" data-begin="4904.15"><span class="transcript-timestamp">1:21:44</span><span | |
| class="transcript-text">Deques are not very | |
| hard to make functional.</span></div> | |
| <div class="transcript-line" data-begin="4906.22"><span class="transcript-timestamp">1:21:46</span><span | |
| class="transcript-text">But you can do deques and | |
| you can concatenate them</span></div> | |
| <div class="transcript-line" data-begin="4908.5"><span class="transcript-timestamp">1:21:48</span><span | |
| class="transcript-text">like we were doing in the figure | |
| that's right behind this board.</span></div> | |
| <div class="transcript-line" data-begin="4911.98"><span class="transcript-timestamp">1:21:51</span><span | |
| class="transcript-text">Constant time split | |
| is a little harder.</span></div> | |
| <div class="transcript-line" data-begin="4913.69"><span class="transcript-timestamp">1:21:53</span><span | |
| class="transcript-text">That's actually one | |
| of my open problems.</span></div> | |
| <div class="transcript-line" data-begin="4916.87"><span class="transcript-timestamp">1:21:56</span><span | |
| class="transcript-text">Can you do lists with split and | |
| concatenate in constant time--</span></div> | |
| <div class="transcript-line" data-begin="4921.58"><span class="transcript-timestamp">1:22:01</span><span | |
| class="transcript-text">functionally or confluently, | |
| persistently, or whatever?</span></div> | |
| <div class="transcript-line" data-begin="4925.84"><span class="transcript-timestamp">1:22:05</span><span | |
| class="transcript-text">Another example-- oh, you | |
| can do a mix of the two.</span></div> | |
| <div class="transcript-line" data-begin="4928.58"><span class="transcript-timestamp">1:22:08</span><span | |
| class="transcript-text">You can get log n search in | |
| constant time deque operations,</span></div> | |
| <div class="transcript-line" data-begin="4932.39"><span class="transcript-timestamp">1:22:12</span><span | |
| class="transcript-text">is you can do tries.</span></div> | |
| <div class="transcript-line" data-begin="4934.87"><span class="transcript-timestamp">1:22:14</span><span | |
| class="transcript-text">So a try is a tree | |
| with a fixed topology.</span></div> | |
| <div class="transcript-line" data-begin="4937.9"><span class="transcript-timestamp">1:22:17</span><span | |
| class="transcript-text">Think of it as a directory tree.</span></div> | |
| <div class="transcript-line" data-begin="4940.01"><span class="transcript-timestamp">1:22:20</span><span | |
| class="transcript-text">So maybe you're | |
| using Subversion.</span></div> | |
| <div class="transcript-line" data-begin="4941.53"><span class="transcript-timestamp">1:22:21</span><span | |
| class="transcript-text">Subversion has time | |
| travel operations.</span></div> | |
| <div class="transcript-line" data-begin="4943.12"><span class="transcript-timestamp">1:22:23</span><span | |
| class="transcript-text">You can copy an entire | |
| subtree from one version</span></div> | |
| <div class="transcript-line" data-begin="4946.24"><span class="transcript-timestamp">1:22:26</span><span | |
| class="transcript-text">and stick it into a new | |
| version, another version.</span></div> | |
| <div class="transcript-line" data-begin="4950.62"><span class="transcript-timestamp">1:22:30</span><span | |
| class="transcript-text">So you get a version DAG.</span></div> | |
| <div class="transcript-line" data-begin="4952.685"><span class="transcript-timestamp">1:22:32</span><span | |
| class="transcript-text">It's a confluently | |
| persistent data structure--</span></div> | |
| <div class="transcript-line" data-begin="4954.85"><span class="transcript-timestamp">1:22:34</span><span | |
| class="transcript-text">not implemented optimally, | |
| because we don't necessarily</span></div> | |
| <div class="transcript-line" data-begin="4957.61"><span class="transcript-timestamp">1:22:37</span><span | |
| class="transcript-text">know how.</span></div> | |
| <div class="transcript-line" data-begin="4958.24"><span class="transcript-timestamp">1:22:38</span><span | |
| class="transcript-text">But there is one paper.</span></div> | |
| <div class="transcript-line" data-begin="4960.2"><span class="transcript-timestamp">1:22:40</span><span | |
| class="transcript-text">This actually came from the open | |
| problem section of this class</span></div> | |
| <div class="transcript-line" data-begin="4963.91"><span class="transcript-timestamp">1:22:43</span><span | |
| class="transcript-text">four years ago, I think.</span></div> | |
| <div class="transcript-line" data-begin="4965.59"><span class="transcript-timestamp">1:22:45</span><span | |
| class="transcript-text">It's with Eric Price | |
| and Stefan Langerman.</span></div> | |
| <div class="transcript-line" data-begin="4969.52"><span class="transcript-timestamp">1:22:49</span><span | |
| class="transcript-text">You can get very good results.</span></div> | |
| <div class="transcript-line" data-begin="4970.929"><span class="transcript-timestamp">1:22:50</span><span | |
| class="transcript-text">I won't write them down | |
| because it takes a while.</span></div> | |
| <div class="transcript-line" data-begin="4972.97"><span class="transcript-timestamp">1:22:52</span><span | |
| class="transcript-text">Basically log the degree | |
| of the nodes factor</span></div> | |
| <div class="transcript-line" data-begin="4976.45"><span class="transcript-timestamp">1:22:56</span><span | |
| class="transcript-text">and get functional, and | |
| you can be even fancier</span></div> | |
| <div class="transcript-line" data-begin="4979.69"><span class="transcript-timestamp">1:22:59</span><span | |
| class="transcript-text">and get slightly better | |
| bounds like log log the degree</span></div> | |
| <div class="transcript-line" data-begin="4982.48"><span class="transcript-timestamp">1:23:02</span><span | |
| class="transcript-text">and get confluently persistent | |
| with various tricks,</span></div> | |
| <div class="transcript-line" data-begin="4985.37"><span class="transcript-timestamp">1:23:05</span><span | |
| class="transcript-text">including using all of | |
| these data structures.</span></div> | |
| <div class="transcript-line" data-begin="4987.53"><span class="transcript-timestamp">1:23:07</span><span | |
| class="transcript-text">So if you want to implement | |
| subversion optimally,</span></div> | |
| <div class="transcript-line" data-begin="4989.8"><span class="transcript-timestamp">1:23:09</span><span | |
| class="transcript-text">that is known how to be done but | |
| hasn't actually been done yet.</span></div> | |
| <div class="transcript-line" data-begin="4994.39"><span class="transcript-timestamp">1:23:14</span><span | |
| class="transcript-text">Because there are those | |
| pesky constant factors.</span></div> | |
| <div class="transcript-line" data-begin="4998.11"><span class="transcript-timestamp">1:23:18</span><span | |
| class="transcript-text">I think that's all.</span></div> | |
| <div class="transcript-line" data-begin="4999.67"><span class="transcript-timestamp">1:23:19</span><span | |
| class="transcript-text">What is known about functional | |
| is there's a log n separation.</span></div> | |
| <div class="transcript-line" data-begin="5003.03"><span class="transcript-timestamp">1:23:23</span><span | |
| class="transcript-text">You can be log n | |
| away from the best.</span></div> | |
| <div class="transcript-line" data-begin="5006.89"><span class="transcript-timestamp">1:23:26</span><span | |
| class="transcript-text">That's the worst | |
| separation known,</span></div> | |
| <div class="transcript-line" data-begin="5010.23"><span class="transcript-timestamp">1:23:30</span><span | |
| class="transcript-text">between functional and just | |
| a regular old data structure.</span></div> | |
| <div class="transcript-line" data-begin="5013.012"><span class="transcript-timestamp">1:23:33</span><span | |
| class="transcript-text">It'd be nice to improve that.</span></div> | |
| <div class="transcript-line" data-begin="5014.22"><span class="transcript-timestamp">1:23:34</span><span | |
| class="transcript-text">Lots of open problems here.</span></div> | |
| <div class="transcript-line" data-begin="5015.345"><span class="transcript-timestamp">1:23:35</span><span | |
| class="transcript-text">Maybe we'll work | |
| on them next time.</span></div> | |
| </div> |