Ich habe vor kurzem ein Vorstellungsgespräch verpatzt, indem ich eine einfache Frage schlecht beantwortete: Wie zeigen Seiten wie LinkedIn effizient die Beziehungsdistanz (1./2./3.) Von Ihnen zu jeder auf einer Seite angezeigten Person (zB in Personensuchergebnissen, Liste von Menschen, die in einer Firma arbeiten, etc.)?Wie können Websites wie LinkedIn die Beziehung der ersten/zweiten/dritten Ebene neben dem Namen einer Person anzeigen?
<EDIT> habe ich das Wesentliche „Trick“ der Lösung: finding „von mir Abstand“ ist eine gemeinsame Operation (zB 20x + auf einer einzigen Seite 100 Pro-Login-Sitzung), so dass Sie Teil tun können die "Entfernung von mir zu X", cache sie und verwende dann das zwischengespeicherte Teilergebnis mehrmals, um andere Operationen viel billiger zu machen. Ich vermutete auch, dass das Teilergebnis wahrscheinlich meine Verbindungen auf der zweiten Ebene sein würden, weil "alle Verbindungen auf der dritten Ebene zwischenspeichern" im RAM und der CPU zu teuer wären. </EDIT >
Aber wenn diese Einsicht in eine Lösung zu konvertieren versuchen, kam ich mit einem unbeholfenen Antwort auf die Schaffung beinhaltet andauerndes Caches von 2nd-Level-Verbindungen von jeder auf der Website (die enorm epensive gewesen wäre, in perf und komplex zu halten), und ich nahm einen unerklärlichen Umweg, Bloom Filters in einer Weise zu verwenden, die wenig technischen Sinn machte. Ich hätte mich nach einer solchen Antwort nicht angestellt!
Später, als ich über das Problem ohne den Druck eines Interviews über meinen Kopf dachte, kam ich eine vernünftigere Antwort.
Erstellen Sie eine sehr schnelle Art und Weise, die First-Level-Verbindungen für jede Charge von Benutzer-IDs zu erhalten (Losgröße bis zu ~ 1000?). Dies bedeutet wahrscheinlich einen dedizierten Cluster von Lots-of-RAM-Servern, die die Verbindungen des 1. Netzwerks des gesamten Netzwerks im Speicher zwischenspeichern können. Zum Glück, 50M Mitglieder x durchschn. 100 Verbindungen pro Mitglied x 4 Bytes pro Mitglied ID = < 25 GB im RAM zwischenspeichern, was mit preiswerter Hardware machbar ist. Und die Anzahl der Änderungen pro Tag wird unter 1% liegen, also ist es nicht zu schwer, den Cache auf dem neuesten Stand zu halten. (Beachten Sie, dass eine relationale Datenbank wahrscheinlich eine schlechte Wahl ist, um diesen Cache zu implementieren, da das Zugriffsmuster "Lose zufälliger E/A" die relationale DB-Leistung zerstört.)
Wenn ein Benutzer sich anmeldet, wird seine 2. Ebene zwischengespeichert Verbindungen durch Abrufen der Verbindungen der 1. Ebene jeder Verbindung der 1. Ebene und Einstecken einer Hashtabelle (Schlüssel = ID der 2. Ebene, Wert = Array der Verbindungen der 1. Ebene, die Sie verbinden). Zwischenspeichern Sie auch die Verbindungen der ersten Ebene, so dass Sie die 1. und 2. Ebene über einen einzigen Anruf zurück auf Ihren Remote-Cacheserver ziehen können. Benutzer-IDs können leicht partitioniert werden, so dass ein verteilter Cache wie Memcached dafür gut funktionieren kann.
für jede Benutzer-ID, um herauszufinden, ob es in Ihrem „Netzwerk“ ist und welche Beziehung es zu Ihnen ist (1., 2., 3.), gehen Sie wie folgt vor:
- , wenn die ID in Ihr First-Level-Verbindungen, zu stoppen.
- versuchen Sie, die ID in Ihren zwischengespeicherten 2nd-Level-Verbindungen Hashtable nachschlagen. Falls gefunden, gebe das Array der Verbindungen zurück, die dich verbinden.
- holen Sie die Verbindungen der ersten Ebene der ID, und wiederholen Sie Schritt # 2 für jede von ihnen. Alle Ergebnisse in einem einzigen Array zusammenfassen und zurückgeben.
- <EDIT> Refactoring in eine Batch-Implementierung („von mir aufblicken Abstand zu N verschiedene Benutzer“), so können Sie alle Remote-Ergebnisse von Schritt # 3, ohne dass N Ferngespräche machen zu bekommen.</EDIT >
Aber ich bin sicher, es gibt bessere Antworten. Welches ist deines? Wenn Sie eine zusätzliche Herausforderung haben möchten, versuchen Sie es mit einer Simulation der Situation (können keine Lösungen im Internet finden).
Beachten Sie, dass die Frage war eine optimale Lösung, unabhängig von how LinkedIn actually does it today, die ich nach oben sah, nachdem ich meine eigene Antwort oben geschrieben.
Ich hoffe, Sie haben sich bei LinkedIn oder ihrem Konkurrenten (oder einem Ort, der diese Technik für etwas verwenden möchte) beworben. Wenn nicht, klingt der Interviewer nicht wirklich, was er getan hat - was schade ist. – BryanH
Ja, effiziente Analyse von sozialen Netzwerken war ein wichtiger Teil des Geschäfts dieses Unternehmens, so dass diese Frage praktische Relevanz hatte. Außerdem denke ich, dass es ein vernünftiger allgemeiner Test ist, theoretische Computer-Science-Ideen in einer realen Umgebung anzuwenden, wo Dinge wie RAM vs. I/O-Geschwindigkeit, Hardwarekosten vs. Programmiereraufwand und lokale vs. entfernte Platzierung von Code wirklich wichtig. Der Nachteil ist natürlich, dass eine gute Lösung (wenn Sie mit dem Problem nicht vertraut sind) mehr als 5 Minuten dauerte! –
"Ich hätte mich nach einer solchen Antwort nicht gemietet!" - Dort gewesen, getan, dass –