Meine liebste Interviewfrage für Software Engineering: Median berechnen
(krisshamloo.com)- Kleine Implementierungsaufgaben in technischen Interviews können wirkungsvoller sein als Rätsel, und die Berechnung des Medians zeigt zugleich grundlegende Coding-Fähigkeiten und Gespür für Design
- Da das Problem eine Sortierung erfordert, führt es ganz natürlich zu API-Diskussionen wie: Soll die Funktion selbst sortieren, soll der Aufrufer sortieren, und darf das Original-Array verändert werden?
- Die Verzweigung zwischen ungerader und gerader Länge, Indexberechnung und off-by-one-Fehler eignen sich gut, um den Debugging-Prozess von Kandidaten zu beobachten
- Innerhalb einer kurzen Aufgabe lassen sich der Unterschied zwischen Median und Mittelwert, die Eignung zum Schreiben von Tests und sogar Kenntnisse der Python-Standardbibliothek statistics prüfen
- Die Beispielimplementierung wirft bei einer leeren Liste einen
ValueError, sortiert mitsorted()auf einer Kopie und gibt bei gerader Länge den Mittelwert der beiden mittleren Werte, bei ungerader Länge den mittleren Wert zurück
Warum sich die Median-Aufgabe gut für Interviews eignet
- Gute Fragen für technische Interviews sollten keine verkopften Rätsel sein, sondern aus einer intuitiven Implementierung heraus tiefere Themen erschließen
- Die Frage „Schreiben Sie eine Funktion, die ein Zahlenarray entgegennimmt und den Median zurückgibt“ eignet sich gut als Signal vom Typ Fizz Buzz, um zu prüfen, ob ein Kandidat tatsächlich programmieren kann
- Die Reduktion von Array-Werten auf ein einzelnes Ergebnis gehört zu den Grundlagen, und das Problem ist klein genug, um Gespräch und Debugging gut gemeinsam zu beobachten
Entscheidungspunkte, die sich in der Implementierung zeigen
- Für die Berechnung des Medians ist zunächst eine Sortierung erforderlich
- Es muss entschieden werden, ob die Funktion selbst sortiert oder ob der Aufrufer ein sortiertes Array übergeben muss
- Wenn das Array per Referenz übergeben wird, gehört auch zur API-Vereinbarung, ob das Original verändert werden darf
- Solche Entscheidungen führen auch zu Performance-Diskussionen
- Bei der Indexberechnung gibt es off-by-one-Fallstricke
- Wichtiger als der Fehler selbst ist die Beobachtung, wie kleine Probleme debuggt werden
- Je nach Array-Länge unterscheidet sich die Rückgabe
- Bei gerader Länge wird der Mittelwert der beiden mittleren Werte zurückgegeben
- Bei ungerader Länge wird der mittlere Wert zurückgegeben
Gespräche, die sich aus einer kurzen Aufgabe entwickeln
- Daraus kann sich eine Statistik-Diskussion ergeben, etwa warum der Median im Vergleich zum Mittelwert in den meisten Fällen die bessere Wahl sein kann
- Da Eingaben und erwartete Werte einfach sind, lässt sich die Aufgabe gut testen, und Kandidaten können ein Gespür für Tests zeigen
- In Python bietet sich außerdem die Gelegenheit, Kenntnisse der Standardbibliothek
statisticszu zeigen
Entscheidungen in der Beispielimplementierung in Python
- Bei einer leeren Liste wird
ValueError("median called with empty list")ausgelöst - Mit
sorted(numbers)wird die Eingabeliste im Unterschied zunumbers.sort()nicht direkt sortiert - Die Länge wird mit
len(numbers)ermittelt, der mittlere Index mitmid = length // 2berechnet - Bei gerader Länge wird
(numbers[mid - 1] + numbers[mid]) / 2.0zurückgegeben, bei ungerader Längenumbers[mid]
1 Kommentare
Lobste.rs-Kommentare
Ich verstehe diesen Beitrag nicht so recht. Der Autor scheint nicht zu wissen, dass sich der Median in O(n) berechnen lässt. Siehe: https://rcoh.me/posts/linear-time-median-finding/
Deshalb ist die Aussage „Die Zahlen müssen von Anfang an sortiert sein“ falsch. Darum halte ich das auch nicht für eine gute Interviewfrage. Die optimale Lösung ist ein komplexer Algorithmus; wenn man ihn nicht auswendig kennt, ist es schwer, ihn spontan zu erwarten, und selbst wenn jemand ihn auswendig kennt, hilft das bei der Bewertung von Kandidaten nicht besonders.
Eher könnte man den Kandidaten bitten, die naive Lösung zu nennen: das Array mit einer Bibliotheksfunktion zu sortieren und dann den mittleren Wert zurückzugeben
n*log(n)-Lösung in einem Telefoninterview ausgesiebt worden zu seinSpäter habe ich im Algorithmik-Kurs quickselect gelernt und gedacht: „Die können doch unmöglich erwartet haben, dass man darauf spontan kommt.“ Nun ja, vielleicht passte ich einfach nicht zu der Stelle
Zu der Aussage, man könne „die naive Lösung erwarten, das Array mit einer Bibliotheksfunktion zu sortieren und den mittleren Wert zurückzugeben“: Ich würde vom Kandidaten keinen besseren Code erwarten als in der python standard library
Als Bonus sieht man sofort, ob jemand Algorithmen gelernt oder sich zumindest auf Interviews vorbereitet hat. Er wird vorschlagen, quickselect zu verwenden: https://en.wikipedia.org/wiki/Quickselect
Und wenn ich quickselect komplett selbst schreiben müsste, ginge das auch. Im Grunde ist es fast Partitionierung + binäre Suche
Der
int-Typ in Python hat keinen Overflow, aber wenn man C, C++ oder Go verwendet, müsste man sich im Zweig für Arrays gerader Länge nicht auch um Additions-Overflow sorgen?int, sondern beifloat. Trotzdem kann es durch Overflow zuinfkommen. Wenn beide Elemente im Arraysys.float_info.maxsind, sollte die Antwort ebenfallssys.float_info.maxsein, aber das Ergebnis der Addition wirdinf, und auch nach der Division durch 2 bleibt esinfMan könnte versuchen, das zu beheben, indem man die Division durch 2 auf die Addition verteilt, aber dann bekommt man bei denormalisierten Zahlen ein falsches Ergebnis. Die meisten scheinen einfach anzunehmen, dass in Programmen keine Zahlen vorkommen, die groß genug sind, um dieses Problem auszulösen. Auch numpy gibt hier mit einer Warnung
infzurück:Tatsächlich gibt es auch mehrere Möglichkeiten, den Median selbst festzulegen. Man kann sich etwa für lineare Interpolation, die obere Grenze oder die untere Grenze entscheiden
Und wenn man zu Quantilen übergeht, kann man stundenlang darüber reden. Ob man nur eines auswählt oder mehrere auf einmal, erfordert unterschiedliche Ansätze
Interviewfragen wie im Originalbeitrag verwende ich nicht. Ich verlange Sanftheit, also dass die Schwierigkeit der Aufgabe sich je nach Fähigkeit und Erfahrung des Kandidaten glatt verändert. Wenn insbesondere das Wissen um Bibliotheksfunktionen oder Algorithmen wie quickselect oder Radixsort das Ergebnis abrupt verändert, ist das keine gute Messaufgabe
Dann misst man nicht Erfahrung und Fähigkeit des Kandidaten, sondern prüft nur, ob er ein bestimmtes magisches Artefakt kennt. Man kann das mit Anschlussfragen abfedern, aber besser ist es, von Anfang an eine sanftere Aufgabe zu stellen