Ich möchte eine Funktion zu berechnen (nicht Design) das Minimum eines gegebenen Stack. Ich dachte, dass ich das leicht im Netz finden kann, aber ich fand nichts darüber. Alles, was ich gefunden habe, ist, wie man einen Stack mit einer getMinimum-Funktion entwirft.Berechnen (nicht entwerfen!) Das Minimum eines Stapels in Java
Der Unterschied besteht darin, dass Sie beim Entwerfen eines solchen Stapels Ihren Stapel (Push und Pop) schrittweise aufbauen und den Mindestwert nach jedem Vorgang aktualisieren. Ich dachte, wie wenn Sie einen gegebenen Stapel haben und Sie wollen das Minimum dieses Stapels berechnen, wie können Sie damit umgehen? Vielleicht verstehe ich nicht sehr gut oder ich frage mich die falschen Antworten oder ich verstehe das Konzept des Stacks nicht sehr gut, aber es überrascht mich, im Netz keine Antwort darauf zu finden, auch nicht danach eine Menge Suche ...
Hier mein Versuch ist:
public static int min(Stack stack){
Stack temp = new Stack();
int result = Integer.MAX_VALUE;
while(!stack.isEmpty()) {
int value = stack.pop();
temp.push(value);
result = (result >= value)? value : result;
}
//stack is empty now, I have to recuperate it from the temp stack
while(!temp.isEmpty()) {
stack.push(temp.pop());
}
return result;
}
In diesem Code verwende ich meine eigene Implementierung für Stapel und Knoten. Aber wie Sie sehen können, ist der Code sehr einfach. Ich habe diesen Beitrag hauptsächlich geschrieben, weil ich mir viele Fragen dazu stelle.
Vor allem möchte ich Ihnen drei Fragen stellen bitte:
- Was ist die Zeit und der Raum Komplexität für diese Funktion? Ich denke, es ist O (N), ist es richtig? Ich habe immer Schwierigkeiten, das in meinem Programm zu berechnen. Es ist normalerweise O (2 * N) (was O (N) entspricht), da wir den Stack-Knoten pro Knoten durchlaufen.
- Ist mein Ansatz logisch oder nicht? Von dem, was ich verstehe, wenn Sie Zugriff auf das k-te Element in einem Stapel haben wollen, müssen Sie das k-1 vorherige Element aufklappen. Oder hier, meiner Meinung nach, ist es absolut nicht logisch, einen ganzen Stapel aufzuspielen, wenn wir nur sein Minimum berechnen wollen (wenn Sie wieder denselben Stapel manipulieren wollen). Deshalb habe ich eine zweite While-Schleife gemacht, um den Stack in seinem ursprünglichen Zustand zu halten.
- Vielleicht können wir eine Kopie des Stapels machen, aber ich habe gelesen, dass das Klonen von Objekten in Java nicht so einfach ist und ich frage mich, ob es für eine kleine Funktion wie diese nicht sehr aufwändig ist?
Dank
Auch, wenn Sie wollen nicht den „addToStack“ -Funktion ändern können Sie nicht wirklich diese min Funktion besser machen, also ja Ihre Lösung ist was ich auch versuchen würde. Ich würde auch sagen, dass die Komplexität ist O (n) – Dodekeract
Euh, das habe ich in meiner IDE versucht und es funktioniert. Aber ehrlich gesagt, es geht nicht wirklich darum, das Min zu berechnen (es kann das Maximum oder irgendetwas anderes sein). Es geht mehr darum, das Konzept und den Nutzen hinter dem Konzept eines Stacks zu verstehen :) – salamanka44
Ja, ja und ja (benutze keinen Klon, ich bezweifle, dass deine Angriffsklasse dies vernünftig implementiert). Auch das wäre bei der Code Review wirklich besser, aber die allgemeine Idee ist solide. – Voo