Queue mit einem Array implemetieren

Mariexshhx

Bekanntes Mitglied
Hey ich soll eine Queue mit einem Array implemtieren mit der Methode pop(), die die Laufzeit O(1) haben soll. Ich frage mich wie das möglich sein soll in dieser Worst Case Laufzeit

Meine pop Methode sieht im Pseudocode so aus ...
Java:
function pop()
    if empty()
        return // wenn A leer ist soll nix passieren
        
x=top()
    for(j=1 .... n-1)
        A[j-1]=A[j] // das wäre aber doch Laufzeit O(n-1)?
Hat jemand eine andere Idee für mich, um das erste Element zu löschen?
 

KonradN

Super-Moderator
Mitarbeiter
Stell Dir sowas bildlich vor! Zeichne es Dir auf. Oder bau Dir visuelle Beispiele!

Du kannst Dir das Array als eine Art Regal vorstellen. Und das steht in einem Raum. Der Raum hat einen Eingang und einen Ausgang.

Immer wenn Dir jemand eine Kiste beim Eingang geben will, musst Du diese entgegen nehmen und im Regal unter stellen.
Immer wenn jemand am Ausgang eine Kiste haben will, dann musst Du eine Kiste aus dem Regal nehmen und ihm geben.

Nun müssen die Kisten aber in genau der Reihenfolge ausgegeben werden, wie Du diese bekommen hast. Und Du hast für irgend welches umsortieren keine Zeit.

Überlege Dir einmal, ob Du das irgendwie hin bekommen kannst.

Wenn Du Probleme hast, da eine Lösung zu finden: Stell Dir vor, du hast nicht ein Regal sondern Du hast mehrere Stellplätze auf dem Boden im Kreis angeordnet sind. Vielleicht gelingt es Dir ja da?
 

Mariexshhx

Bekanntes Mitglied
Stell Dir sowas bildlich vor! Zeichne es Dir auf. Oder bau Dir visuelle Beispiele!

Du kannst Dir das Array als eine Art Regal vorstellen. Und das steht in einem Raum. Der Raum hat einen Eingang und einen Ausgang.

Immer wenn Dir jemand eine Kiste beim Eingang geben will, musst Du diese entgegen nehmen und im Regal unter stellen.
Immer wenn jemand am Ausgang eine Kiste haben will, dann musst Du eine Kiste aus dem Regal nehmen und ihm geben.

Nun müssen die Kisten aber in genau der Reihenfolge ausgegeben werden, wie Du diese bekommen hast. Und Du hast für irgend welches umsortieren keine Zeit.

Überlege Dir einmal, ob Du das irgendwie hin bekommen kannst.

Wenn Du Probleme hast, da eine Lösung zu finden: Stell Dir vor, du hast nicht ein Regal sondern Du hast mehrere Stellplätze auf dem Boden im Kreis angeordnet sind. Vielleicht gelingt es Dir ja da?

Stell Dir sowas bildlich vor! Zeichne es Dir auf. Oder bau Dir visuelle Beispiele!

Du kannst Dir das Array als eine Art Regal vorstellen. Und das steht in einem Raum. Der Raum hat einen Eingang und einen Ausgang.

Immer wenn Dir jemand eine Kiste beim Eingang geben will, musst Du diese entgegen nehmen und im Regal unter stellen.
Immer wenn jemand am Ausgang eine Kiste haben will, dann musst Du eine Kiste aus dem Regal nehmen und ihm geben.

Nun müssen die Kisten aber in genau der Reihenfolge ausgegeben werden, wie Du diese bekommen hast. Und Du hast für irgend welches umsortieren keine Zeit.

Überlege Dir einmal, ob Du das irgendwie hin bekommen kannst.

Wenn Du Probleme hast, da eine Lösung zu finden: Stell Dir vor, du hast nicht ein Regal sondern Du hast mehrere Stellplätze auf dem Boden im Kreis angeordnet sind. Vielleicht gelingt es Dir ja da?
Bei dem Kisten im Regal könnte ich wenn ich die vordeste Kiste wegnehme den Anfang also top einfach um eins nach rechts verschieben ? Aber beim Array geht das ja nicht oder ? Muss ich die Positionen nicht überschreiben ?
 

KonradN

Super-Moderator
Mitarbeiter
Stell es Dir vor. Ich sehe Kisten, ich sehe das Regal. Ich sehe keine "Positionen" oder "top" oder so. Wenn Du bei der bildlichen Vorstellung irgend etwas zusätzlich brauchst, dann beschreibe es!

Vergiss irgendwelche Programmier Dinge. Du musst die Problematik verstehen und eine Lösung finden. Denn es scheint ganz offensichtlich noch Probleme beim Verständnis zu geben. Ansonsten wäre mit der Antwort von @LimDul der Thread beendet gewesen.
 

Mariexshhx

Bekanntes Mitglied
Stell es Dir vor. Ich sehe Kisten, ich sehe das Regal. Ich sehe keine "Positionen" oder "top" oder so. Wenn Du bei der bildlichen Vorstellung irgend etwas zusätzlich brauchst, dann beschreibe es!

Vergiss irgendwelche Programmier Dinge. Du musst die Problematik verstehen und eine Lösung finden. Denn es scheint ganz offensichtlich noch Probleme beim Verständnis zu geben. Ansonsten wäre mit der Antwort von @LimDul der Thread beendet gewesen.
wenn ich die vorderste Kisten wegnehme ist die Kiste danach dann mein Anfang
 

Neumi5694

Top Contributor
Krümme dein Regal mal nach hinten, bis es "fast" einen Kreis ergibt. Dann stell außen einen Stuhl (mit Rollen) hin, der deine aktuelle Position beziechnet. Wenn du die nächste Position willst, bewegt der sich einen Platz nach rechts. Sobald er das offene Ende deines Fast-Kreises erreicht, springt er im nächsten Schritt an den Anfang des Kreises.
Ein zweiter Stuhl bezeichnet die Stelle, an der du eine neue Kiste lagerst, verhält sich genauso.

Das Problem bei dem Arraymodell (egal ob mir verschieben oder Index weiterdrehen) ist, dass es irgendwann auch mal voll sein kann, wenn du nicht ein sehr langes verwendest. Mit der Indexverschiebung würde das passieren, wenn der Auffüllindex den Abarbeitungsindex überholt.
 
Zuletzt bearbeitet:

Mariexshhx

Bekanntes Mitglied
Krümme dein Regal mal nach hinten, bis es "fast" einen Kreis ergibt. Dann stell außen einen Stuhl (mit Rollen) hin, der deine aktuelle Position beziechnet. Wenn du die nächste Position willst, bewegt der sich einen Platz nach rechts. Sobald er das offene Ende deines Fast-Kreises erreicht, springt er im nächsten Schritt an den Anfang des Kreises.
Ein zweiter Stuhl bezeichnet die Stelle, an der du eine neue Kiste lagerst, verhält sich genauso.

Das Problem bei dem Arraymodell (egal ob mir verschieben oder Index weiterdrehen) ist, dass es irgendwann auch mal voll sein kann, wenn du nicht ein sehr langes verwendest.
ich hatte überlegt einen Zeiger top zu verwenden, der auf auf den Anfang der Queue zeigt. Also ist am Anfanf =0, wenn wir nun das vorderste Element löschen wir top=1 und A[top] wird bei top zurückgegeben... nur wirklich gelöscht wird ja jetzt das Element bei A[0] nicht. Es wird halt nicht mehr beachtet..Quasi so

Java:
function pop()
    if empty()
        return // wenn A leer ist soll nix passieren
       
x=top()
t++ //Variable die den Anfang der Queue anzeigt 
return x
 

KonradN

Super-Moderator
Mitarbeiter
ich hatte überlegt einen Zeiger top zu verwenden, der auf auf den Anfang der Queue zeigt. Also ist am Anfanf =0, wenn wir nun das vorderste Element löschen wir top=1 und A[top] wird bei top zurückgegeben... nur wirklich gelöscht wird ja jetzt das Element bei A[0] nicht. Es wird halt nicht mehr beachtet..Quasi so
Ja, das entspricht genau der Idee von @LimDul. Ggf. musst Du noch überlegen, dass Du Dir auch das tail merken musst, damit Du die Situationen erkennen kannst:
  • Regal voll -> dann kannst Du keine Kiste einstellen
  • Regal leer -> dann kannst Du keine Kiste mehr entnehmen
 

Neumi5694

Top Contributor
Eine Versschiebeoperation klappt natürlich auch, Java bietet dafür ja eine recht praktische Methode an.
Insgesamt könnte das aber die einfachere Methode sein, als einen Ringpuffer zu verwenden, hier musst du nur die Länge des Arrays im Auge behalten, um zu wissen, ob noch weitere Elemente hinzugefügt werden können.

Dann könnte das so oder so ähnlich funktionieren (Ich nehme nicht für mich in Anspruch, keinen Fehler bei den Indizes gemacht zu haben, hab's nicht getestet).
Methodennamen hab ich mal frei gewählt, nicht geschaut, ob da ein Interface was vorschreibt.

Java:
public final synchronized Optional<Thing> fetch() {
    if (hasElements()) {
        Collections.rotate(Arrays.asList(values).subList(0, nElements), 1);
        return Optional.of(values[--nElements]);
    } else {
        return Optional.empty();
    }
}

public final synchronized boolean add(Thing t) {
  if (hasCapacity()) {
    values[nElements++] = t;
    return true;
  } else {
    return false;
  }
public final synchronized boolean hasElements() {
  return nElements > 0;
}
public final synchronized boolean hasCapacity() {
  return nElements < values.length();
}
private Thing[] values = new Things[maxcapacity];
private int nElements = 0;
}
 

Mariexshhx

Bekanntes Mitglied
Ja, das entspricht genau der Idee von @LimDul. Ggf. musst Du noch überlegen, dass Du Dir auch das tail merken musst, damit Du die Situationen erkennen kannst:
  • Regal voll -> dann kannst Du keine Kiste einstellen
  • Regal leer -> dann kannst Du keine Kiste mehr entnehmen
ich hatte mir überlegt eine Variable anzulegen, die die Elemente in dem Array zählt also immer wenn, ich Element eingefügt wird wird die Zählvariale erhöht und wenn die = A.length ist, ist das Array ja voll, wenn ich hier richtig überlege und wenn eins entfernt wird, wird die Varibale um 1verringert
 

KonradN

Super-Moderator
Mitarbeiter
ich hatte mir überlegt eine Variable anzulegen, die die Elemente in dem Array zählt also immer wenn, ich Element eingefügt wird wird die Zählvariale erhöht und wenn die = A.length ist, ist das Array ja voll, wenn ich hier richtig überlege und wenn eins entfernt wird, wird die Varibale um 1verringert
Das wäre auch eine Möglichkeit - dann bräuchtest Du nur das top.
 

temi

Top Contributor
ich hatte mir überlegt eine Variable anzulegen, die die Elemente in dem Array zählt also immer wenn, ich Element eingefügt wird wird die Zählvariale erhöht und wenn die = A.length ist, ist das Array ja voll, wenn ich hier richtig überlege und wenn eins entfernt wird, wird die Varibale um 1verringert
Aber ist eine Queue nicht FIFO? Was du beschreibst, klingt nach LIFO
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Queue.remove() -> no such element exception Allgemeine Java-Themen 17
mrStudent The method append is not applicable for the arguments (Queue<Integer>, Queue<Integer>) Allgemeine Java-Themen 4
Kirby.exe Nullpointer Exception bei Queue Allgemeine Java-Themen 5
P Durchlaufen einer Queue Allgemeine Java-Themen 9
W Queue Implementierung Allgemeine Java-Themen 6
S Queue Allgemeine Java-Themen 2
M Queues und Queue Interface Allgemeine Java-Themen 3
F Message Queue Tipps Allgemeine Java-Themen 3
E Queue: Wie kann hier ein null-Pointer Exception auftreten?! Allgemeine Java-Themen 11
M FIFO Queue: bytes in, float/double/etc out Allgemeine Java-Themen 5
D priority queue sortieren Allgemeine Java-Themen 10
F Threads, Queue, Gemeinsame Daten Allgemeine Java-Themen 6
G QUEUE und Threads Allgemeine Java-Themen 5
H Queue ausgeben Allgemeine Java-Themen 5
M Queue für spider/crawler? Allgemeine Java-Themen 2
M Reflection Queue auslesen Allgemeine Java-Themen 6
E Executors - wie kann ich die Queue leeren? Allgemeine Java-Themen 2
A Queue, beim dem das letzte Element herausfällt Allgemeine Java-Themen 4
C Untidy Priority Queue Allgemeine Java-Themen 2
S Suche schnellen Container Typ Queue Allgemeine Java-Themen 7
P Queue, Mausevents Allgemeine Java-Themen 4
G Queue erzeugen Allgemeine Java-Themen 2
T Queue-Hilfe benötigt Allgemeine Java-Themen 4
G Parameteriesierung von Queue funktioniert nicht Allgemeine Java-Themen 2
M Queue Allgemeine Java-Themen 11
G Klasse Queue Implementierung in Java Allgemeine Java-Themen 4
Ernesto95 HTTP Mit JavaScript erzeugte dynamische Webseite auslesen und nach einem Schlüsselwort durchsuchen Allgemeine Java-Themen 6
P Feststellen, Welche Classes ich aus einem JAR nutze? Allgemeine Java-Themen 6
Jose05 mit 2 - 3 Personen an einem Projekt coden Allgemeine Java-Themen 2
8u3631984 Prüfen ob min. ein Element eines Sets in einem anderen Set enh Allgemeine Java-Themen 4
L 2 Dimensionale ListArray Abfrage nach einem Wert suchen Allgemeine Java-Themen 5
melaniemueller Einzelne Zeile aus einer txt Datei in einem String speichern Allgemeine Java-Themen 12
N einem Array Objekte hinzufügen die ihr Array position gespeichert haben Allgemeine Java-Themen 34
Jose05 Speicherung auf einem Server Allgemeine Java-Themen 1
S Folgendes Problem bei einem Programm Allgemeine Java-Themen 1
M Mehrere Ressourcen in einem package ablegen Allgemeine Java-Themen 1
Tobero .jar Dateine aus einem Ordner laden (Java 16) Allgemeine Java-Themen 5
alinakeineAhnungv Hilfe bei einem Straßenbahn-Projekt von mir Allgemeine Java-Themen 18
SaftigMelo In einem Winkel Objekt bewegen Allgemeine Java-Themen 2
Thallius Zeitzone zu einem LocalDate hinzufügen aber ohne es zu ändern... Allgemeine Java-Themen 2
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
Tobero Wie bekomme ich in welchem Quadrat sich eine Position in einem Grid befindet Allgemeine Java-Themen 11
Noahscript Aus einem byte Array Steuerungszeichen und Code bekommen und ersetzen Allgemeine Java-Themen 3
Kingamadeus2000 Alle mehrfach vorkommenden Buchstaben rekursiv aus einem String entfernen. Allgemeine Java-Themen 6
F Junit Test + Cucumber - JSON auslesen und in einem weiteren Schritt nutzen Allgemeine Java-Themen 0
Zrebna DeleteNode-Funktionalität in einem AVL-Tree Allgemeine Java-Themen 5
pkm Warnungen in einem Drools-Projekt unterdrücken? Allgemeine Java-Themen 1
D Arbeiten mit einem Bitarray Allgemeine Java-Themen 13
D Union in einem Struct in JNA Allgemeine Java-Themen 5
N Apache POI/ neue Reihe in Excel mit einem Button Allgemeine Java-Themen 2
E Datentypen Wie kann ich die Längen der unterschiedlichen Ebenen aus einem Objekt lesen von dem ich weiß, dass es ein mehrdimensionaler Array ist? Allgemeine Java-Themen 3
R Zoom In einem grid Allgemeine Java-Themen 0
M java.io.EOFException bei einem DataoutputStream ?! Allgemeine Java-Themen 2
D Kgv aller Paare aus einem Array mit n integer berechnen Allgemeine Java-Themen 5
D Verkauf von einem Programm welches ich in Java geschrieben habe Allgemeine Java-Themen 4
M Fahrtsimulation von einem Zug Allgemeine Java-Themen 0
A 2D-Grafik Einfachster Ansatz, um sich wiederholende Figur in einem 2D-Image zu erkennen Allgemeine Java-Themen 1
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
Drachenbauer Wie kann ich das Wort "concrete" in einem String durch ein anderes Wort ersetzen lassen? Allgemeine Java-Themen 5
J Suchen von einer Scannereingabe in einem HashSet Allgemeine Java-Themen 1
L Input/Output Kassenzettel lesen aus einem Bild Allgemeine Java-Themen 2
G JTextField Inhalt in einem Long einfügen Allgemeine Java-Themen 2
M Bei String.format ein Komma statt einem Punkt ausgeben lassen Allgemeine Java-Themen 1
K Bild in einem anderen Bild suchen Allgemeine Java-Themen 12
B Problem zu einem Java Projekt Allgemeine Java-Themen 6
ralfb1105 Starten Java App(s) (.jar) aus einem Java Programm Allgemeine Java-Themen 18
B Suche nach einem Testprogramm für meine BA Allgemeine Java-Themen 0
B Maven Zugriff auf files aus einem kompilierten jar Allgemeine Java-Themen 15
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
R Farbe zu einem Eckpunkt generieren Allgemeine Java-Themen 0
C Logfile upload zu einem externen filezilla sftp server Allgemeine Java-Themen 6
X Punkte in einem Feld bestimmen Allgemeine Java-Themen 22
H Laden einer (Resourcendatei) aus einem Jar-File Allgemeine Java-Themen 17
J In einem Set doppelte Elemente erzeugen Allgemeine Java-Themen 4
D HTTP Aufruf einer Methode aus einem Servlet heraus Allgemeine Java-Themen 0
S Kann man mit Java auf einem lokalen PC/Mac Benutzergruppen auslesen und Rechte ändern? Allgemeine Java-Themen 11
S Algorithmus welcher True-Werte in einem Array findet und auswertet. Allgemeine Java-Themen 5
R Index in einem Array löschen Allgemeine Java-Themen 10
R Index in einem Array löschen Allgemeine Java-Themen 2
4 Swing Durch klicken auf Button Labels einem Panel hinzufügen Allgemeine Java-Themen 4
The Pi Wie oft wird ein Buchstabe in einem Wort wiederholt? Allgemeine Java-Themen 16
D Kopieren von Dateien aus einem Ordner in einen anderen Allgemeine Java-Themen 6
K Classpath Alle Classen aus einem Package lesen Allgemeine Java-Themen 7
K Auf einer Website nach einem String suchen Allgemeine Java-Themen 5
P Zwei Applikationen mit einem Job Allgemeine Java-Themen 0
Sin137 OOP Auf JPanel zugreifen, das einem JTabbePane hinzugefügt worden ist Allgemeine Java-Themen 10
E Die if-Anweisung in einer Java Bean bzw. in einem Servlet? Allgemeine Java-Themen 8
G Methoden Aus einem Event, wo ich weiß, dass es ausgeführt werden wird, eine Get-Methode basteln Allgemeine Java-Themen 8
F Wie kann ich auf einem System prüfen, ob eine lib verfügbar ist? Allgemeine Java-Themen 2
M Ein Programm das nur von einem bestimmten Programm geöffnet werden kann Allgemeine Java-Themen 7
H Klammerberechnungen bei einem Taschenrechner Allgemeine Java-Themen 2
S Kann man mit einem GeneralPath.curveTo ein GeneralPath.quadTo ersetzen..? Allgemeine Java-Themen 2
Seikuassi Alle Escape-Sequenzen in einem String ersetzen Allgemeine Java-Themen 4
S Rekursive Suche in einem Netz Allgemeine Java-Themen 5
A Input/Output Liste der Dateien in einem Ordner in einer Jar Datei erhalten Allgemeine Java-Themen 11
T Schlüsselworte mehrere public-Klassen in einem Paket Allgemeine Java-Themen 7
M Zeilen zu einem DefaultTableModel hinzufügen Allgemeine Java-Themen 1
M Dateien aus einem Verzeichnis auf einem Server auflisten Allgemeine Java-Themen 5
Thallius PDF von einem BufferedImage erstellen Allgemeine Java-Themen 1
M Abonnentenzahl, Aufrufe, etc. von einem YouTube-Kanal anzeigen Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben