Hintergrund
Zum Zeitpunkt des Schreibens dieses Dokuments ist das P vs NP-Problem noch ungelöst, aber Sie haben vielleicht von Norbert Blums neuem Aufsatz gehört , der den Beweis erbringt, dass P! = NP ist, was bereits als fehlerhaft vermutet wird (aber wir werden sehen).
Das in diesem Artikel diskutierte Problem ist das Cliquenproblem . Zumindest habe ich das in einem Zeitungsartikel gelesen, also korrigieren Sie mich, wenn ich falsch liege, aber auf jeden Fall möchten Sie, dass Sie ein Programm schreiben, das die folgende Variante löst:
Die Aufgabe
Angenommen, wir haben eine große Schule mit vielen Schülern. Jeder dieser Schüler hat einige Freunde an dieser Schule. Eine Clique von Studenten ist eine Gruppe , die nur aus Studenten besteht , die Freunde mit sind jedes andere Mitglied .
Ihr Programm erhält befreundete Schülerpaare als Input. Aus diesen Informationen muss das Programm die Größe der größten Clique ermitteln . Die Schüler werden durch ganzzahlige IDs identifiziert .
Wenn Sie mathematische Begriffe bevorzugen, bedeutet dies, dass Sie die Kanten eines ungerichteten Graphen erhalten, der durch jeweils zwei Knoten gekennzeichnet ist.
Eingang
Ihre Eingabe ist eine nicht leere Liste positiver ganzzahliger Paare, z [[1,2],[2,5],[1,5]]
. Sie können diese Eingabe in jeder sinnvollen Form vornehmen, z. B. als Array von Arrays, als Textzeilen mit jeweils zwei Zahlen usw.
Ausgabe
Die erwartete Ausgabe ist eine einzelne Zahl n >= 2
: die Größe der größten Clique. Mit dem Beispiel Eingang oben, wäre das Ergebnis 3
, da alle Schüler ( 1
, 2
und 5
) miteinander befreundet sind.
Testfälle
[[1,2]]
=> 2
[[1,2],[3,1],[3,4]]
=> 2
[[1,2],[2,5],[1,5]]
=> 3
[[2,5],[2,3],[4,17],[1,3],[7,13],[5,3],[4,3],[4,1],[1,5],[5,4]]
=> 4 (the largest clique is [1,3,4,5])
[[15,1073],[23,764],[23,1073],[12,47],[47,15],[1073,764]]
=> 3 (the largest clique is [23,764,1073])
[[1296,316],[1650,316],[1296,1650],[1296,52],[1650,711],[711,316],[1650,52],
[52,711],[1296,711],[52,316],[52,1565],[1565,1296],[1565,316],[1650,1565],
[1296,138],[1565,138],[1565,711],[138,1650],[711,138],[138,144],[144,1860],
[1296,1860],[1860,52],[711,1639]]
=> 6 (the largest clique is [52,316,711,1296,1565,1650])
Sie können diese (blöde) Referenzimplementierung verwenden (zusätzliche Ausgabe mit -d
Flag ausgeben ), um die Ergebnisse anderer Testfälle zu überprüfen.
Die Regeln
- Ihr Programm benötigt kein definiertes Ergebnis bei ungültiger Eingabe. Sie können also davon ausgehen, dass:
- Sie erhalten immer mindestens ein Paar IDs
- Jedes Paar besteht aus zwei verschiedenen IDs
- kein Paar erscheint zweimal (das Vertauschen der Stellen der IDs wäre immer noch dasselbe Paar)
- Ihr Algorithmus darf keine Obergrenze für die Eingabegröße festlegen. Rein technische Einschränkungen und Einschränkungen, die durch Ihre Sprache / Umgebung (wie Stapelgröße, Rechenzeit usw.) festgelegt werden, sind natürlich unvermeidlich.
- Standardlücken sind verboten.
- Das ist Code-Golf , also gewinnt der kürzeste Code, gemessen in Bytes.
- Wenn Ihr Algorithmus eine polynomielle Zeitkomplexität aufweist, erzielen Sie
-1
unabhängig von Ihrer Codegröße sofort eine Punktzahl. In diesem Fall möchten Sie Ihre Lösung möglicherweise an einer anderen Stelle einreichen. ;)
-1
ist das wohlverdient ;)