정렬 된 대기열을 유지하려는 경우 가장 낮은 값 (비트가 std::priority_queue
인 항목)을 팝업 할 수 있기를 원합니다. 항목 값은 연속적이며 계속 증가합니다. 그러나 항목의 비교가 정의 된 것보다 작지 않으며 is-previous
및 is-next
술어 (A is-previous B
==) 만 있고 ++
또는 --
도 지원합니다.소계가 아닌 술어가없는 정렬 된 순서 유지
이러한 술어를 기반으로 (부분적으로) 값을 정렬하는 알고리즘이 있는지 궁금합니다. 또는 대기열을 추적하는 더 좋은 방법이 있습니까?
이 문제는 모듈로 산술로 작업 할 때 발생합니다. 즉, 항목이 정수로 지정되었지만 모듈로 인해 의미가 작아지고 더 이상 중요하므로 더 이상 정렬 할 수 없습니다.
선택 언어는 C++이지만 대부분의 합리적인 언어를 포팅 할 수 있습니다.
편집 예제 코드를 작성하면서 답변을 위해 노력하는 모든 사람들에게
Appologies, 나는 원래의 질문이 잘못 형성 깨달았다. 정말로 embarasing하고 있습니다 만, 나는 당신의 시간이 낭비되지 않았 음을 강조하고 싶습니다. 제가 한 시간 동안 땀을 흘렸을 때, 그리고 나서 10 분이 지나면 어떻게 잘못되었는지 깨달았습니다. 어쨌든,이 행동이 내가 원하는입니다 :
template <class T>
class OrderedQueue {
std::vector<T> storage;
T next;
public:
OrderedQueue(T lowest_value = T())
:next(lowest_value)
{}
void Push(T t)
{
storage.push_back(t);
}
T Pop()
{
std::vector<T>::iterator it = std::find(storage.begin(), storage.end(), next);
if(it == storage.end())
throw std::runtime_error("no such element");
T value = *it;
storage.erase(it);
++ next;
return value;
}
};
내 문제는 Pop()
가 O(N)
를 취한다는 것입니다. is-prev와 is-next 술어를 사용하여 더 빨리 만들 수있는 방법이 있습니까?
왜 정렬해야합니까? 중간에 아무 것도 추가 할 수 없습니다! – Basilevs
@Basilevs 정렬 된 배열을 유지하는 것이 일반적으로 정렬되지 않은 배열보다 훨씬 빠르기 때문에 정렬하고 싶습니다. 어쨌든'std :: priority_queue'를 사용할 수 없을 것입니다. 왜냐하면 그것은 술어보다 적은 수를 필요로하기 때문입니다. 값을 저장하기 위해'std :: vector'를 사용할 것이고, 거기에서'vector.insert (where, 1, what)'을 쉽게 할 수 있습니다. –
deque를 감싸고 시작과 끝을 제외한 모든 삽입을 허용하지 않습니다. – Basilevs