double-ended queue

Üdvözlöm, Ön a double-ended queue szó jelentését keresi. A DICTIOUS-ban nem csak a double-ended queue szó összes szótári jelentését megtalálod, hanem megismerheted az etimológiáját, a jellemzőit és azt is, hogyan kell a double-ended queue szót egyes és többes számban mondani. Minden, amit a double-ended queue szóról tudni kell, itt található. A double-ended queue szó meghatározása segít abban, hogy pontosabban és helyesebben fogalmazz, amikor beszélsz vagy írsz. Adouble-ended queue és más szavak definíciójának ismerete gazdagítja a szókincsedet, és több és jobb nyelvi forráshoz juttat.

Főnév

double-ended queue (tsz. double-ended queues)

  1. (informatika) A deque, teljes nevén double-ended queue (kétvégű sor), egy olyan adatstruktúra, amely lehetővé teszi az elemek beszúrását és eltávolítását mindkét végén – vagyis elöl és hátul is. Nevének jelentése: kétvégű sor, vagy kétoldali sor.

Ez egy általánosítása a sima sornak (queue), ahol csak az egyik végére szúrhatunk be (hátul), és a másik végéről vehetünk ki (elöl).



2. Főbb műveletek (ADT leírás)

A deque absztrakt adattípus az alábbi fő műveleteket támogatja:

  • insertFront(x): elem beszúrása az elejére
  • insertBack(x): elem beszúrása a végére
  • removeFront(): elem eltávolítása az elejéről
  • removeBack(): elem eltávolítása a végéről
  • front(): az első elem lekérdezése (nem törli)
  • back(): az utolsó elem lekérdezése (nem törli)
  • isEmpty(): üres-e a sor?
  • size(): hány elem van benne?

Megjegyzés: Ezek a műveletek (ideális implementációban) mind O(1) időben végrehajthatók.



3. Motiváció, felhasználási példa

A deque nagyon hasznos, amikor mindkét irányból rugalmasan kell tudni kezelni az adatokat. Néhány tipikus alkalmazás:

  • Visszalépés-előrelépés (undo/redo) algoritmusok
  • Palindrom-ellenőrzés (karakterek összehasonlítása két végéről)
  • Szintaxis-ellenőrzés (zárójelek, matematikai kifejezések)
  • Interaktív programok input bufferelése
  • Optimalizálás algoritmusok (pl. sliding window maximum/minimum)
  • BFS (Breadth-First Search) algoritmusok bizonyos optimalizált változatai
  • LRU cache (Least Recently Used cache algoritmus)



4. Implementációk

A deque implementálható többféleképpen:

a) Dinamikus tömb

  • Körkörös tömbbel (circular array): előre/hátra léptetve, wraparound kezeléssel.
  • Előnye: gyors, fix méretnél nagyon hatékony.
  • Hátránya: méretezhetőség; ha kinőjük, újra kell allokálni.

b) Láncolt lista

  • Kétirányú (doubly linked list): minden elem mutat az előző és a következő elemre.
  • Előnye: bármilyen méret, gyors beszúrás/törlés két végén.
  • Hátránya: minden elem többlet memóriát igényel (mutatók), lassabb random elérés.

c) STL és magas szintű nyelvek

  • C++: std::deque
  • Python: collections.deque
  • Java: ArrayDeque, LinkedList (Deque interface)



5. Példák

C++ STL

#include <deque>
#include <iostream>
int main() {
    std::deque<int> dq;
    dq.push_back(1);  // 
    dq.push_front(2); // 
    dq.push_back(3);  // 
    dq.push_front(4); // 

    dq.pop_back();    // 
    dq.pop_front();   // 

    std::cout << "Front: " << dq.front() << ", Back: " << dq.back() << "\n";
    return 0;
}

Python

from collections import deque

dq = deque()
dq.append(1)        # back
dq.appendleft(2)    # front
dq.append(3)
dq.appendleft(4)

print(dq)           # deque()

dq.pop()            # removes 3
dq.popleft()        # removes 4

print(dq)           # deque()
print("Front:", dq, "Back:", dq)

6. Fontosabb tulajdonságok

  • Nem azonos a sima queue-val vagy stack-kel!
  • A deque egyszerre működhet stack-ként is (csak egyik vég) és queue-ként is.
  • Bármely végén beszúrhatunk vagy törölhetünk.



7. Specializált változatok

  • Input-restricted deque: csak hátul lehet beszúrni, de elöl/hátul törölni.
  • Output-restricted deque: csak elöl lehet törölni, de elöl/hátul beszúrni.



8. Elméleti háttér

ADT szinten a deque műveletekhez nincs szükség a belső működés ismeretére. Mindegy, hogy tömb, lista vagy bármi más, a lényeg a műveletek garantált (gyors) végrehajtása.

Matematikai szempontból a deque egy sorozat, melynek mindkét végéhez hozzáférünk.



9. További megjegyzések

  • A deque (különösen tömb alapú) lehetőséget ad arra is, hogy gyorsan elérjük bármelyik végét, de középre lassabb a beszúrás.
  • Sokszor használják cache-ekben (pl. LRU implementáció), ahol a legutoljára használt elem előre kerül, a legrégebbi hátra, és onnan törlődik.
  • Python deque például thread-safe (bizonyos műveletei), emiatt gyakran használják producer-consumer modellekben.



10. Példa alkalmazás: Palindrom ellenőrzés

from collections import deque

def is_palindrome(s):
    d = deque(s)
    while len(d) > 1:
        if d.popleft() != d.pop():
            return False
    return True

print(is_palindrome("racecar"))  # True
print(is_palindrome("hello"))    # False

11. Miért jobb néha, mint csak a queue vagy a stack?

  • Rugalmas: amikor nem tudod előre, hogy melyik végén lesz szükség a műveletekre.
  • Optimalizált algoritmusok: sliding window, BFS optimalizációk, backtracking.



12. Összegzés

A deque egy nagyon erős, rugalmas, gyors adatszerkezet, amely lehetővé teszi az elemek kezelését mindkét végén – szemben a szokásos stack vagy queue adattípusokkal. A programozásban a deque univerzális megoldás, ha mindkét végre gyors elérés kell.