inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

기출로 대비하는 개발자 전공면접 [CS 완전정복]

Q. Queue는 어떤 자료구조 인가요? (외 1문제)

resize 관련 질문이 있습니다.

241

wofjeiong2ewg23

작성한 질문수 15

2

Circular Queue도 마찬가지로 크기가 꽉 차면 리사이즈가 일어난다고 하셨는데 더블링 리사이즈가 일어났을 때 배열이 두배로 커지고 다시 앞부분이 1부터 들어가게 되는 건가요? 아니면 8분19초 상황에서 

11 12 13 4 5 6 7 8 9 10 14 15 16

이렇게 들어가는 건가요?

기술면접 면접 운영체제

답변 1

1

개발남노씨

사실 모든 자료구조는 구현하는 사람에 따라 달라집니다. 기준일 될만한 언어에 내장된 자료구조를 살펴보아도 언어마다 구현이 조금씩 다릅니다. 그래서 정답은 없습니다!

예를 들면 https://en.cppreference.com/w/cpp/container/queue 를 참고했을 때, C++ STL에서 Queue에 대한 내용은 자세히 살펴보기 어려웠지만 https://en.cppreference.com/w/cpp/container/deque 를 보게 되면 우리가 알던 방식과는 많이 다른 방식으로 deque이 구현된걸 알 수 있었습니다. 저장공간이 부족하면 새로운 fixed-array를 할당하여 deque의 size를 확장합니다. 따라서 기존에 있던 데이터를 복사하여 이동시킬 필요가 없어 집니다.

 

As opposed to std::vector, the elements of a deque are not stored contiguously: typical implementations use a sequence of individually allocated fixed-size arrays, with additional bookkeeping, which means indexed access to deque must perform two pointer dereferences, compared to vector's indexed access which performs only one.

The storage of a deque is automatically expanded and contracted as needed. Expansion of a deque is cheaper than the expansion of a std::vector because it does not involve copying of the existing elements to a new memory location. On the other hand, deques typically have large minimal memory cost; a deque holding just one element has to allocate its full internal array (e.g. 8 times the object size on 64-bit libstdc++; 16 times the object size or 4096 bytes, whichever is larger, on 64-bit libc++).

 

따라서 Circular Queue또한 사용자가 정의하기에 따라 다르게 구현할 수 있습니다. 대부분의 인터넷에서 볼 수 있는 구현은 isFull == true 이면 overflow 경고 메세지를 주는 방식으로 되어 있습니다. 만약에 제가 더블링 리사이즈 하여 확장하는 circular queue 자료구조를 구현한다면  직관적인 방법으로 다음과 같이 할 것 같습니다.

               (rear) (front)          

11    12    13    4    5    6    7    8    9    10    (full)

 

(front)                                                             (rear)

4    5    6    7    8    9    10     11    12    13    __    __   __    __    __    __   __    __  (doubling)

4    5    6    7    8    9    10     11    12    13    14    __   __    __    __    __   __    __  (doubling)

4    5    6    7    8    9    10     11    12    13    14    15   __    __    __    __   __    __  (doubling)

 

해당 방식이 직관적이라서 코드를 작성하기에도 수월합니다.

 

 

좋은 질문 감사드립니다. 혹시 풀리지 않은 의혹(?)이 있으시면 편하게 말씀해주세요 :)

그리고 각 언어에 내장되어있는 Queue가 어떻게 구현되어 있는지에 대해서 잘 아시는 분이 계시다면 답변해주시면 감사하겠습니다.

 

 

0

wofjeiong2ewg23

자세한 답변 감사합니다!

잘 풀어 설명해 주셔서 풀리지 않은 의혹은 없는 것 같아요.

수업 이어서 쭉 듣다가 모르는 부분이 생기면 다시 질문드리겠습니다.

감사합니다 !

 

Open addressing을 사용할 때의 worst case

1

483

1

인터넷 계층과 네트워크 엑세스 계층

1

506

1

패킷이란

1

439

1

Linked list의 장점

1

662

1

노션 자료 이메일 잘못 입력했어요..

1

562

1

동기화 문제

1

513

2

프로세스 관련 질문

1

583

1

노션 전자 책 동영상 문제

1

490

1

안녕하세요 강사님!

1

349

1

노션 공유 요청

1

370

1

Linked List 시간 복잡도

3

767

1

thread의 PC register 질문

1

729

2

hash table의 seperate chaining 질문

0

397

2

인덱스 카디널리티 부분 질문이있습니다.

2

1202

2

프론트엔드 면접준비 질문

0

556

1

시간복잡도

1

281

1

쿠키 질문

0

322

1

쓰레드의 단점 중 궁금한 것이 있습니다.

0

274

1

URL을 주소창에 쳤을 때 화면에 나오기까지의 과정에 대해 추가적으로 궁금합니다.

1

443

1

궁금한게 있습니다

0

213

0

강의자료 HTTP 부분 request 단어가 repuest로 되어있습니다

1

229

1

강의가 이해가 잘되네요

1

258

1

syn 과 fin의 데이터 단위가 다른 이유

2

296

1

Circular Queue에 대해서 질문드려요

1

298

1