Text omissions/background assumptions: Base of log's--always 2. Definitions of big-O, big-Omega, big-Theta. Definition of ``bidirectional''. (But always assuming it, anyway.) (So *ask* when puzzled by such omissions!) Definition and notation mysteries: Are the input and output ``buffers'' actually *queues*? If not, then why not? Is msg. complexity really the number of msgs. *sent*? Should we add the ones that are initially buffered? Why do we allow for initially buffered msgs.? In Algorithm 2.2, ``'' seems to be a fixed msg. (like ``''). (Else, why send to p_j?) In Algorithm 2.4, ``'' includes the *value* of the vble. leader. So what does ``'' mean in Algorithm 2.4?? (Is enough info being considered in line 17?) Typo, p. 11, line 16: p_i should be p_1 . ?------------------------ Summary of Chapter 2 *results*: 1. ``Given'' a rooted spanning tree, can broadcast in time O(depth), msgs. O(n)--even asynchronously. 2. Similarly for ``convergecast''. 3. Given only the root, can still get by, but in time O(diameter), msgs. O(m). By-product: A spanning tree (for *future* use). 4. Synchronously: Same algorithm gives a *breadth-first* spanning tree. (Side question: Can we do this asynch.?) 5. What about *depth*-first spanning tree? Easy by emulating std. *sequential* algorithm. But conclude only time = O(m). (Already assigned: Improve to O(n).) 6. What if *not* given the root? Text's way: Dumbed-down Gallager (without the balance). Time O(m), msgs. O(mn). More straightforward: ``Elect'' a root, as follows: Independently build spanning tree rooted at *each*. Convergecast uid's on each, to find largest. Same resource bounds! (But other weaknesses?) Exercise: Improve the time to O(diameter).