Pattern visualizer
Design Twitter
Each source already keeps its own tweets in chronological order, so building a feed is a k-way merge of sorted lists. Seed a max-heap with one entry per source — its newest unseen tweet — then repeatedly pop the global newest and, if that source has an older tweet left, push it back in. The heap never holds more than one entry per source, so it stays tiny no matter how much history each user has. Animated on: getNewsFeed(1) where user 1 posted A@t1 and follows user 2 (D@t6, B@t3) and user 3 (E@t5, F@t2). Expected feed, newest first: [D, E, B, F, A]..
k-way merge of each user's tweets via a max-heap keyed by time
Seed the heap: user 1 is a source of their own feed. Push A·t1 onto the heap. It settles at index 0 — its parent is already newer.
1FUNCTION getNewsFeed(user):2 heap <- MAX-HEAP keyed by time3 FOR each source IN {user} UNION following(user):4 PUSH source's newest tweet INTO heap5 feed <- EMPTY LIST6 WHILE heap NOT EMPTY AND LENGTH(feed) < 10:7 top <- POP MAX(heap)8 APPEND top.tweetId TO feed9 IF top.source HAS older tweet:10 PUSH that older tweet INTO heap11 RETURN feed
← / → step · space play · Home restart