[HN Gopher] Sleeping through the technical interview (2022) ___________________________________________________________________ Sleeping through the technical interview (2022) Author : xena Score : 125 points Date : 2023-07-07 17:46 UTC (5 hours ago) (HTM) web link (xeiaso.net) (TXT) w3m dump (xeiaso.net) | bmacho wrote: | Computer sorts require at least linear time, as you need to read | the input (if you don't know other things about the input, say it | has an uniform distribution). There are several linear time | sorts, sleepsort, postman sort, counting sort. (For a bounded set | of numbers or sortable keys.) | | But there is an (almost) truly constant time sort, using an | abacus instead of a computer: | https://en.wikipedia.org/wiki/Bead_sort | taeric wrote: | Sorting networks are a thing. I don't think it really changes | your point, of course. :D | enriquto wrote: | This blog has nice stories, but what really does it for me are | the cute interjections using random conlangs. Here it was a well- | known one, but I recall having seen some toki pona another day | (can't find it now). | humbleharbinger wrote: | Very cool but will the threads necessarily wake up | deterministically? One may wake up before another but not get cpu | before it correct? (forgive me if I'm misunderstanding the code) | colanderman wrote: | Yes, the algorithm suffers from a race condition. Time is not a | synchronization primitive. | greiskul wrote: | Yup. If we are being pedantic, and I am sure the author of | this loves being pedantic, any number of factors could cause | this algorithm to be incorrect. Put it in a slow enough cpu | for instance, and it will output the wrong answer. | | And correctness is the single most important part of an | algorithm. We can do any problem in constant time if we don't | mind our answers are not correct. | MPSimmons wrote: | return(4) | [deleted] | xena wrote: | Hey all! If you like this, there's a sequel of sorts in Protos: | https://xeiaso.net/blog/protos | | I'm working on more stories in this "universe" but it takes a | while for the satire juice to build up. Maybe the next one will | be on spatial computing. | fb03 wrote: | Super interesting on the sleepsort thing, amazing stuff! But for | some reason, the tone and the excessive acrobatics/"bragging" | kind of get the best of the article away for me. | | Okay, if the interviewer had properly done _5 minutes_ of | research on this candidate, they would know know that the | candidate is "way over their pay grade". I found all that dance | that the article author did a little bit... unnecessary? Kind of | how killer whales play with their prey before the kill. Overkill. | | Sorry, my answer probably isn't productive, I am merely sharing | how I felt after reading it. | | I am now off to educate myself on SleepSort :-) | wahahah wrote: | https://news.ycombinator.com/item?id=2657277 | | Archive (slightly NSFW text) | https://archive.tinychan.net/read/prog/1295544154 | Arnavion wrote: | Actually, if the thread runtime maintains its own concept of | time, the algorithm doesn't even need to sleep in real time. Once | all the threads have been created, the thread runtime can notice | that all threads are idle and that the next thread to be | scheduled is the one at time N, so it can simply update the | current time to N and start executing that thread. Repeat for | each thread and you'll have your sorted array out without any | sleeps. | | After all, all the sorting work was already done when the threads | _started sleeping_ , having registered themselves with the | orchestrator (timer wheel etc) that will eventually wake them up. | Actually performing the sleep is not necessary. | | I don't know about Haskell, but with Rust the tokio runtime lets | you do this using start_paused ( | https://docs.rs/tokio/latest/tokio/runtime/struct.Builder.ht... ) | tikhonj wrote: | My understanding is that this is basically how discrete-event | simulations work under the hood. You have a frontier of future | events in an appropriate data structure (say, a heap) and then | alternate between adding future events into the heap and | pulling the next event off the heap. | | So, modulo several layers of abstraction and a bunch of | implementation details I'm glossing over, using a scheduler | like this to sort values is just a heapsort :) | johnday wrote: | _Actually_ , if you start working out which one is the next to | run, you have reinvented selection-sort and you are no longer | linear time. (Hence why this is not a sensible sorting | algorithm in reality :) ) | Arnavion wrote: | Which is why I wrote: | | >After all, all the sorting work was already done when the | threads started sleeping, having registered themselves with | the orchestrator (timer wheel etc) that will eventually wake | them up. | hgomersall wrote: | It occurs to be that this might actually be a practical algorithm | on an FPGA. It would need a couple of refinements to handle | multiple of the same value, but for constrained length lists to | sort it could be a useful technique. | shae wrote: | I wasn't expecting lojban! "The drink of the gods" | colanderman wrote: | Esperanto, not lojban | barrenko wrote: | I used to think all this aphyr-like "jargon" about coding as | snatching stuff up from the void was a joke, nowadays I am not so | sure. | larperdoodle wrote: | I handed in an assignment in my C class in college that used this | algorithm for the sorting part of the assignment. | xena wrote: | That is incredible. What did the teacher say? | | I actually got away with using SleepSort in an interview for my | current job. It got me the job. | draw_down wrote: | [dead] | mlazos wrote: | I mean, isn't spawning 1000 threads at least linear time? You | could get it to log maybe but I'm not sure that code does that | automatically. | bmacho wrote: | I don't think that sleepsort is any more constant time, than | any other sorting algorithm. For sleepsort to be constant time, | you must - have an upper bound on the input | (largest number) - you must not count some arbitrary | things, like reading and processing the input, or spawning | threads | | But if are allowed to do these things, all the other sorts will | became constant time. (I believe only one of them is enough.) | [deleted] | AshamedCaptain wrote: | Well they were indeed sleeping through the interview. Otherwise | I don't know how could one possibly claim that a program whose | first statement is a sequential loop over all values of the | input has "constant time" asymptotic complexity. | kadoban wrote: | As with everything in algorithm analysis, it depends on your | model of computation. That is, it depends what you're | counting. | | For sorting (comparison sorts), one fairly typical model is | to just count how many comparisons you do. Which, this does | none (kind of, not really, they're really just implicit or | hidden in the OS). | | It's just playing around with computational models, not a | serious proposal. It's either just a joke, a troll, or an | parable about the need to be careful about what metric you're | measuring. Or some combination of those. | jnwatson wrote: | It isn't really linear. Sleeping is a heap insertion which | takes O(log n). | bmacho wrote: | You still have to _read_ all the inputs at least, which is at | least linear time, in the size of the input. | QuadmasterXLII wrote: | Each sleep is log n for the heap insertion, so the overall | complexity is at least n log n | xena wrote: | Depends on what you mean by "time". Going by algorithmic | complexity time it's at least linear yes. Going by wall clock | time (the more important one for interview code) it's constant | time. | upon_drumhead wrote: | I don't understand how wall clock time is constant. | | Sorting [5, 50] is faster wall time then [6, 60]. | xena wrote: | The constant is the biggest number in the array | NotYourLawyer wrote: | If runtime depends on the input, it's not constant time. | addaon wrote: | It's constant with regards to the length of the input | array, which is the usual metric for sort algorithm | performance. That is, d(runtime)/d(len(input)) can be | constant, even though d(runtime)/d(max(input)) is not, if | you assume that len(input) is independent from max(input) | (which is inconsistent with input having uniformly | distributed random members, which is probably the more | common assumption). | recursive wrote: | It's constant with respect to the number of elements, | just not the maximum magnitude of those elements. | shimmy568 wrote: | The time to spawn the threads is just inconsequential | compared to the time to wait for the threads to exit for | small sizes of N. But by doubling the number of numbers to | sort you do double the time (actual wall clock time) that it | takes to spawn those threads. O(N + 10000000) is still O(N) | | Not to mention for the OS to handle N threads would likely | take some kind of non-linear time, at least N^2 if I had to | take a shot in the dark. But I imagine it'd depend on the OS | and how the hardware handles interrupts. Even if the thread | is sleeping it still takes resources to schedule it | colanderman wrote: | Linux's CFS is O(log _N_ ) to insert; O(1) to switch tasks | ( _N_ being number of threads). [1] So O( _N_ log _N_ ) it | seems. | | [1] https://en.wikipedia.org/wiki/Completely_Fair_Scheduler | #Algo... | 29athrowaway wrote: | Sleep sort is a meme. | | If you pick a small unit of time you can make it faster but if | the values are sparsely distributed it gets slower. | [deleted] | Paul_S wrote: | Sleep sort - invented by 4chan. | | The rest of the short story also reads like it came straight from | r9k | sleep_sort_ wrote: | sleep sort originated in /prog/ [0] . There's quite a few HN | lurkers that were active in the sleep sort thread. Perhaps xena | is also one of them? :) | | [0] | https://www.cs.princeton.edu/courses/archive/fall13/cos226/l... | autumn-antlers wrote: | I keep a list of these sorts of creative-writing-programming | posts here[1] (forgive the bare and broken theme, i dont actually | post so work on the site has not been started, let alone | finished) | | please let me know if you have any suggestions thet might fit in, | and I'd be glad to even include less mystical folklore like the | story of mel but clearly have a theme goin here | | 1: https://www.illucid.net/posts/homages-to-aphyrs-technical- | in... | xena wrote: | I have another one here but it's not very good: | https://xeiaso.net/blog/voiding-the-interview-2017-04-16 | thatcherc wrote: | As the author notes, this is very much in the style of the | aphyr's Interview series of stories like "Rewriting the Technical | Interview" - [0] - which are all great reads as well. | | [0] - https://aphyr.com/posts/353-rewriting-the-technical- | intervie... | lvncelot wrote: | I never fail to re-read the entire series when it's brought up | and will do so right now. | metadaemon wrote: | I was going to link to this as it immediately rang similar in | my mind! | AceJohnny2 wrote: | In a very different writing style, but also mocking the | technical interview: "Fizzbuzz in Tensorflow" (2016) | | https://joelgrus.com/2016/05/23/fizz-buzz-in-tensorflow/ | | To whet your appetite: | | > interviewer: Um, you understand the problem is fizzbuzz, | right? | | > me: Do I ever. So, now let's talk models. I'm thinking a | simple multi-layer-perceptron with one hidden layer. ___________________________________________________________________ (page generated 2023-07-07 23:00 UTC)