2014-10-10 4 views
0

모두 알고 있듯이 표준 큐는 insertpopout의 두 가지 기본 작업을 지원합니다. 그리고 insert은 큐의 끝에서 발생합니다. popout은 큐의 헤드에서 발생합니다. 여기서는이 대기열을이 두 작업에 기반하여 비 감소, 또는 그 목표를 달성하기위한 몇 가지 추가 도움말 기능과 함께 정렬 할 수 있는지 여부를 알지 못합니다.비 계속 감소하는 큐 구현

+2

내가 생각하는 개념은 "우선 순위 대기열"입니다. – Matthias

+0

우선 순위 큐는 하나의 요소 최대 또는 최소 만 유지한다고 생각하지 않습니까? 전체 큐가 특정 순서를 유지하지는 않습니까? –

+0

먼저, 대부분의 (아마 모든) 구현은 새로운 요소를 올바른 위치에 삽입하여 순서를 유지하므로'insert'는 O (ln (n))이고'popout'은 O (1)입니다. 둘째로, 대기열을 "관찰"하는 유일한 작업이'popout'이라면 문제가되지 않습니다. – Matthias

답변

0

insert 기능을 약간 변경하면됩니다. 때마다 insert 대기열에 당신은 다음과 같은 알고리즘을 달성 할 수있는 대기열에 새로운 요소 장소를 찾아야 만합니다 :

새로운 기능을 사용하고 매번 새로운 요소가 중간에있는 요소보다 큰지 확인하십시오 리스트의 왼쪽에 새로운 원소를 삽입하려고 시도한다. 그렇지 않으면 원소의 적절한 위치를 찾을 때까지 반복적으로 대기열의 오른쪽에 삽입을 시도한다.

삽입을위한가는 알고리즘은 O(lg(n))입니다.

popout의 경우 지금 수행 한 작업 만 수행하면됩니다. 마지막 요소가 나타납니다.

+0

제안 해 주셔서 감사합니다. 여기 어쩌면 조금 완고 해 보입니다. 큐를 유지하기 위해 캐시와 같은 것을 사용하는 방법이 있나요? 그래서 큐의 꼬리 부분에만'insert'를 만들 수 있을까요? –

+0

@ Allen_3 대기열의 끝에 넣으면 대기열이 정렬되지 않습니다! 먼저 원하는 것을 선택해야합니다. 먼저 새 요소를 삽입 한 다음 위의 알고리즘을 수행하는 함수를 호출 할 수 있지만 이것이 더 적합하다고 생각합니다. – Lrrr

+0

예. 그래서 아마도 꼬리 부분에'insert' 만 할 수 있고, 기본적으로 큐의 연산 (in과 out)에 속하지 않는 정렬이나 무언가가 없으면 불가능할 것입니다. –