2013-02-28 17 views
14

Ich bin eine lange Zeit Lurker und hatte gerade ein Interview mit Google, wo sie mir diese Frage gestellt:Algorithmus Interview von Google

Verschiedene Künstler wollen in der Royal Albert Hall führen und Sie sind verantwortlich für die Planung ihrer Konzerte. Anfragen für die Auftritte in der Halle sind nach dem Grundsatz "Wer zuerst kommt, mahlt zuerst" . Nur eine Leistung ist möglich, pro Tag und darüber hinaus gibt es keine Konzerte sein kann stattfindet innerhalb von 5 Tagen voneinander

einen gewünschten Zeitraum d gegeben, die nicht möglich ist (dh innerhalb von 5 Tagen nach einem bereits sched- Uled Leistung), geben Sie einen O (log n) -Zeitalgorithmus, um den nächsten verfügbaren Tag d2 (d2> d) zu finden.

Ich hatte keine Ahnung, wie ich es lösen soll, und jetzt, da das Interview vorbei ist, möchte ich herausfinden, wie ich es lösen kann. Ich weiß, wie schlau die meisten von euch sind, ich habe mich gefragt, ob Sie mir hier helfen können. Dies ist NICHT für Hausaufgaben oder etwas in dieser Art. Ich möchte nur lernen, wie ich es für zukünftige Interviews lösen kann. Ich habe versucht, Nachfragen zu stellen, aber er sagte, das ist alles, was ich Ihnen sagen kann.

+0

Suche auf Google: http://stackoverflow.com/questions/2307283/what-does-olog-n-mean-exactly kann Ihnen eine Richtung zu lernen, was es bedeutet. –

+0

Ich weiß, was O (logn) bedeutet, ich habe gerade ein Problem mit diesem speziellen Problem – NoNameY0

+0

Was ist 'n' in' O (log n) ''? Bereits geplante Konzerte? – phs

Antwort

4

Speichern Sie die geplanten Konzerte in einem binary search tree und finden Sie eine praktikable Lösung, indem Sie eine binäre Suche durchführen.

Etwas wie folgt aus:

FindDateAfter(tree, x): 
    n = tree.root 
    if n.date < x 
    n = FindDateAfter(n.right, x) 
    else if n.date > x and n.left.date < x 
    return n 
    return FindDateAfter(n.left, x) 

FindGoodDay(tree, x): 
    n = FindDateAfter(tree, x) 
    while (n.date + 10 < n.right.date) 
    n = FindDateAfter(n, n.date + 5) 
    return n.date + 5 
+0

können Sie mir eine ausführlichere Antwort geben. Ich würde es wirklich wirklich schätzen – NoNameY0

+0

wie würden Sie binäre Suche tun, wenn es kein 10-Tage-Intervall gibt Ihre Suche wird Null es bedeutet, dass Sie kein Datum planen können sagen wir Sie diese Zahlen 1,4,6,9,14 haben , 16,18,20,21,23,26, – NoNameY0

+0

aktualisiert die Antwort – perreal

0

denke ich, alles, was er gefragt wird, ist eine binäre Suche Implementierung. Finde das Element, das das nächsthöhere ist. Dies kann dem gleichen Mechanismus folgen wie die Standard-Binärsuche, aber wenn Sie ein sortiertes Array verwalten müssen, dann können Sie einen Baum verwenden, wie gesagt. Für die aktuelle Frage im Interview hätte eine B-Recherche genügt.

9

Sie benötigen einen normalen binären Suchbaum mit Intervallen verfügbarer Daten. Suchen Sie einfach nach dem Intervall mit d. Wenn es nicht existiert, nehmen Sie das Intervall als nächstes (in der richtigen Reihenfolge) bis zu dem Punkt, an dem die Suche gestoppt wurde.

Hinweis: zusammenhängende Intervalle müssen in einem einzigen Knoten zusammengeführt werden. Beispiel: Die Intervalle für verfügbare Daten {2 - 15} und {16 - 23} sollten zu {2 - 23} werden. Dies kann passieren, wenn eine Konzertbuchung abgebrochen wurde.

Alternativ kann stattdessen eine Baumstruktur mit nicht verfügbaren Daten verwendet werden, vorausgesetzt, zusammenhängende nicht verfügbare Intervalle werden miteinander verbunden.

+0

Worst Case, wenn das Intervall mit 'd' bereits gebucht ist O (n) mit In-Order-Traversal, nicht wahr? – SparKot

+0

@DoSparKot, nein, es ist O (log N). Der Knoten, den wir brauchen, ist nahe dem Punkt, an dem wir angehalten haben. Im schlimmsten Fall müssen wir bis zur Wurzel an der Seite eines Teilbaums gehen und unten an der Seite des anderen Teilbaums – comocomocomocomo

+0

OK, in Anbetracht des heutigen '28-Feb-2013' und alle Intervalle sind für den Rest der Zeit reserviert Jahr von '02-Mar-2013'. Wie komplex ist die Buchung für "01-März-2013"? – SparKot

0

Speichern Sie die Anzahl der genutzten Nächte pro Jahr, Quartal und Monat. Um eine freie Nacht zu finden, finden Sie das erste Jahr, das nicht ausgebucht ist, dann das Quartal innerhalb dieses Jahres, dann den Monat. Dann überprüfen Sie jede der Nächte in diesem Monat.

Unregelmäßigkeiten im Kalendersystem machen dies ein wenig schwierig, anstatt die Jahre und Monate zu verwenden, können Sie die Idee für Einheiten von 4 Nächten als "Monat", 16 Nächte als "Viertel" und so weiter anwenden.

0

Warum nicht versuchen, Union-Find zu verwenden? Sie können jeden Konzerttag + die nächsten 5 Tage als Teil eines Sets gruppieren und dann am angegebenen Tag eine SUCHE durchführen, die die nächste Set-ID zurückgibt, die Ihr nächstes Konzertdatum wäre.

Bei Implementierung mit einem Baum ergibt sich eine O (log n) -Zeitkomplexität.

0

Angenommen, auf Stufe 1 sind alle Zeitplandetails verfügbar. Gruppenzeitplan von 16 Tagen auf Ebene 2. Gruppe 16 Stufe 2 Status auf Stufe 3. Gruppe 16 Stufe 3 Status auf Stufe 4. Abhängig von der Anzahl der Tage, die Sie erweitern möchten, erhöhen Sie das Niveau.

Jetzt von höherer Ebene suchen und binäre Suche am Ende durchführen.

0

Asymtotische Komplexität: - Es bedeutet, dass sich die Laufzeit ändert, wenn die Eingabe zunimmt. Angenommen, wir haben eine Eingabezeichenfolge "abcd". Hier durchqueren wir jedes Zeichen, um seine Länge zu finden, also ist die Zeit proportional zur Anzahl der Zeichen in der Zeichenkette wie n no of char. Also O (n). aber wenn wir die Länge der Zeichenkette "abcd" in eine Variable eingeben, dann können wir immer noch die Länge der Zeichenkette finden, indem wir die Variable len betrachten. (len = 4). ex: zurück 23. egal, was Sie eingeben, haben wir immer noch die Ausgabe als 23. so ist die Komplexität O (1). Somit wird das Programm in einer konstanten Zeit bezüglich der Eingangsgröße laufen. für O (log n) - die Operationen erfolgen in logarithmischen Schritten.

https://drive.google.com/file/d/0B7eUOnXKVyeERzdPUE8wYWFQZlk/view?usp=sharing

das Bild in dem obigen Link beachten. Hier sehen wir die gebogene Linie (logarithmische Linie). Hier können wir sagen, dass für kleinere Eingaben die O (log n) -Notation gut funktioniert, da die benötigte Zeit geringer ist, als in der gebogenen Linie zu sehen ist, aber wenn die Eingabe wächst, wird die lineare Notation, d. H. O (n), als besser angesehen. Es gibt auch die besten und schlimmsten Szenarien zu sehen. Wie im obigen Beispiel.

Sie können auch für die Algorithmen auf diesen Cheat verweisen: http://bigocheatsheet.com/

0

Es wurde bereits oben erwähnt, aber es ist im Grunde einfach halten mit einem binären Baum. Sie wissen, dass ein Binärbaum log N Komplexität hat. Sie wissen also bereits, welchen Algorithmus Sie verwenden müssen. Alles, was Sie tun müssen, ist, eine Baumknotenstruktur zu erstellen und den Binärbaumeinfügungsalgorithmus zu verwenden, um das nächste verfügbare Datum zu finden: Eine mögliche: Der Baumknoten hat zwei Attribute: d (Datum des Konzerts) und d + 5 (Enddatum für die Sperrfrist von 5 Tagen). Verwenden Sie erneut einen Zeitstempel für die zwei Datumsattribute, um es einfach zu halten. Nun ist es trivial, das nächste verfügbare Datum zu finden, indem der Binary-Tree-Inorder-Einfügealgorithmus mit der Anfangsbedingung root = null verwendet wird.

1

Ich habe einen binären Suchbaum (BST) verwendet, der die Bereiche für gültige freie Tage enthält, die für Leistungen eingeplant werden können. Einer der Bereiche muss mit int.MaxValue enden, da wir unendlich viele Tage haben, sodass er nicht gebunden werden kann.

Der folgende Code sucht nach dem nächsten Tag zum angeforderten Tag und gibt ihn zurück.

Die Kompliziertzeit O (H) wenn H die Baumhöhe (normalerweise H = log (N), aber H = N in einigen Fällen werden kann.). Die Raumkomplexität ist die gleiche wie die Zeitkomplexität.

public static int FindConcertTime(TreeNode<Tuple<int, int>> node, int reqDay) 
{ 
    // Not found! 
    if (node == null) 
    { 
     return -1; 
    } 
    Tuple<int, int> currRange = node.Value; 
    // Found range. 
    if (currRange.Item1 <= reqDay && 
     currRange.Item2 >= reqDay) 
    { 
     // Return requested day. 
     return reqDay; 
    } 
    // Go left. 
    else if (currRange.Item1 > reqDay) 
    { 
     int suggestedDay = FindConcertTime(node.Left, reqDay); 
     // Didn't find appropriate range in left nodes, or found day 
     // is further than current option. 
     if (suggestedDay == -1 || suggestedDay > currRange.Item1) 
     { 
      // Return current option. 
      return currRange.Item1; 
     } 
     else 
     { 
      // Return suggested day. 
      return suggestedDay; 
     } 
    } 
    // Go right. 
    // Will always find because the right-most node has "int.MaxValue" as Item2. 
    else //if (currRange.Item2 < reqDay) 
    { 
     return FindConcertTime(node.Right, reqDay); 
    } 
}