2017-10-06 1 views
1

나는 현재 모든 O (1) 작업주소 지정 가능한 FIFO 대기열을 구현하는 방법은 무엇입니까?

  • 삽입으로 데이터 구조를 찾고 있어요 (K, V) : 큐의 끝 부분에 값을 삽입합니다.
  • remove_key (K) : 제공된 키에 해당하는 대기열에서 값을 제거하십시오.
  • remove_head() : 대기열 (가장 오래된 대기열)의 앞면에서 값을 제거합니다.

내가 생각할 수있는 것은 합리적으로 쉽게 구현할 수있는 것은 이중 구조의 목록을 기본 데이터 구조로 사용하고 해시 테이블의 목록 노드에 포인터를 유지하는 것입니다. 그러면 원하는 점근 동작을 얻을 수 있습니다. 이것은 실제 런타임에서 가장 효율적인 옵션이 아닐 수도 있습니다.

"주소 지정 가능 우선 순위 대기열"은 문헌에서 발견되었지만 다소 복잡하고 (어쩌면 더 비싼) 데이터 구조이기 때문에 누군가에게 더 좋은 제안이 있는지 궁금해하고있었습니다. 지금까지 녹에 대해 이렇게 구현 한 사람이 아무도없는 것 같습니다. 그래서 나는 너무 복잡해지지 않기를 바랍니다.

+0

별도의 해시 테이블을 사용하여 당신의 생각은 표준 구현 :

는 문서를 참조하십시오. 주소 지정 가능한 우선 순위 대기열은 동일한 개념을 사용합니다. 우선 순위 큐를 바이너리 힙으로 구현하려고한다면, 복잡해진다. 하지만 페어링 힙 (pairing heap)과 같은 것을 사용한다면 더블 링크드리스트 아이디어보다 더 복잡하지 않습니다. –

답변

0

pub struct VecDeque<T>을 사용하고 remove_head() 대신 pop_front()을 사용합니다. VecDeque

+0

문제는'remove_key (K)'입니다. 'VecDeque'와 같은 (성장 가능한) 링 버퍼를 사용할 수 있지만 최악의 경우 모든 항목을 반복해야하기 때문에'remove_key (K)'는'O (n)'이됩니다. 그렇지 않으면 FIFO 큐를 사용하여 요소를 삭제 된 것으로 표시하고 remove_head()가 삭제 된 요소를 건너 뛰기 때문에 더 좋은 방법이 있는지 궁금합니다. – evotopid

관련 문제