Ich versuche, ein Problem auf Code Kriege und die Unit-Tests zur Verfügung gestellt zu lösen machen absolut keinen Sinn ...Code-Effizienz und Genauigkeit
Das Problem ist wie folgt und klingt absolut einfach genug, um etwas in 5 Arbeits haben
MinutenConsider a sequence u where u is defined as follows:
The number u(0) = 1 is the first one in u.
For each x in u, then y = 2 * x + 1 and z = 3 * x + 1 must be in u too.
There are no other numbers in u.
Ex: u = [1, 3, 4, 7, 9, 10, 13, 15, 19, 21, 22, 27, ...]
1 gives 3 and 4, then 3 gives 7 and 10, 4 gives 9 and 13, then 7 gives 15 and 22 and so on...
Task:
Given parameter n the function dbl_linear (or dblLinear...) returns the element u(n) of the ordered (with <) sequence u.
Example:
dbl_linear(10) should return 22
zuerst habe ich eine SortedSet mit einer Linq-Abfrage verwendet, als ich über die Effizienz wirklich interessieren den Ball hielt, habe ich schnell gelernt, dass dieser Vorgang auf Bereiche berechnen haben, wobei n ~ 100000 in unter 12 Sekunden betragen könnte.
So wurde diese Abscheulichkeit geboren, dann wieder und wieder geschlachtet, da eine for-Schleife aus irgendeinem Grund Probleme erzeugen würde. Es wurde dann zu einer While-Schleife "aufgewertet", die etwas mehr bestandene Unit-Tests (4 -> 8) ergab.
public class DoubleLinear {
public static int DblLinear(int n) {
ListSet<int> table = new ListSet<int> {1};
for (int i = 0; i < n; i++) {
table.Put(Y(table[i]));
table.Put(Z(table[i]));
}
table.Sort();
return table[n];
}
private static int Y(int y) {
return 2 * y + 1;
}
private static int Z(int z) {
return 3 * z + 1;
}
}
public class ListSet<T> : List<T> {
public void Put(T item) {
if (!this.Contains(item))
this.Add(item);
}
}
Mit diesem Code schlägt es immer noch die Berechnung über n = 75000, aber besteht bis zu 8 Tests.
Ich habe überprüft, ob andere Leute diese bestanden haben, und sie haben. Allerdings kann ich nicht überprüfen, was sie geschrieben haben, um daraus zu lernen.
Kann jemand Einblick geben, was hier falsch sein könnte? Ich bin sicher, die Antwort ist offensichtlich und ich bin dumm.
Auch ist eine benutzerdefinierte Liste auf diese Weise eine schlechte Idee? Gibt es einen besseren Weg?
Ist es ein Muss für Sie, C#/Linq zu verwenden, um es zu lösen? Ich habe es einfach mit C++ mit ganz anderer Vorgehensweise – shole
übergeben. Vorzugsweise C#, aber keine Notwendigkeit für linq. An diesem Punkt interessiere ich mich mehr für die Gründe, warum es scheitert – Grey
Es ist zu langsam, da es O (N^2) ist. Es verwendet O (N), um zu prüfen, ob das Element bereits in der Liste vorhanden ist, bevor es eingefügt wird. Meine akzeptierten Lösungen sind O (N lg N) und O (N).O (N lg N) man ist nichts besonderes, aber ähnliche Idee mit Ihnen mit einer anderen Datenstruktur, die unterstützt O (lg N) finden – shole