나는 incomming 쿼리를 받아들이고 실행하는 서버 응용 프로그램이 있습니다. 쿼리가 너무 많으면 대기열에 있어야하며 다른 쿼리가 실행되면 대기중인 쿼리도 실행해야합니다. 우선 순위가 다른 쿼리를 전달하고자하므로 priority_queue를 사용하는 것이 최선의 선택이라고 생각합니다.동적 우선 순위가있는 priority_queue
axcepting 질의 (a)는 사기를 치고 새로운 질의는 큐에 저장 될 것이다. (a)의 쿼리가 실행되면 programm가 큐에서 가장 높은 우선 순위를 가진 쿼리를 선택하여 실행하는 경우 모든 쿼리의 우선 순위는 1 (최하위)입니다. 여전히 문제 없습니다. 이제 다른 사용자가 대기열에 추가되는 우선 순위가 5 인 쿼리를 보냅니다. 이것은 가장 높은 우선 순위를 갖는 쿼리이므로 실행중인 쿼리가 더 이상 한계에 도달하지 않으면 응용 프로그램은이 쿼리를 실행합니다. 최악의 경우 우선 순위가 1 인 500 개의 쿼리가 대기열에 있지만 실행되지 않을 수 있습니다. 누군가 우선 순위가 5 인 쿼리를 보내므로이 500 개의 쿼리는 대기 시간 동안 대기합니다. 우선 순위가 5보다 낮은 우선 순위가있는 쿼리보다 우선 순위가 낮은 모든 쿼리의 우선 순위를 높이고 싶습니다. 따라서 우선 순위가 5 인 쿼리가 꺼내지면 큐의 우선 순위가 < 인 다른 모든 쿼리는 0.2 씩 증가해야합니다. 이 방법은 높은 우선 순위를 가진 100 개의 쿼리가있을지라도 낮은 우선 순위를 가진 쿼리는 영원히 대기하지 않습니다. 이런 식으로 뭔가가 작동하지 않을 수 있습니다 내 쿼리 이후
내가 생각 객체로 구성 :
class Query {
public:
Query(std::string p_stQuery) : stQuery(p_stQuery) {};
std::string getQuery() const {return stQuery;};
void increasePriority(const float fIncrease) {fPriority += fIncrease;};
friend bool operator < (const Query& PriorityFirst, const Query& PriorityNext) {
if(PriorityFirst.fPriority < PriorityNext.fPriority) {
if(PriorityFirst.fStartPriority < PriorityNext.fStartPriority) {
Query qTemp = PriorityFirst;
qTemp.increasePriority(INCREASE_RATE);
}
return true;
} else {
return false;
}
};
private:
static const float INCREASE_RATE = 0.2;
float fPriority; // current priority
float fStartPriority; // initialised priority
std::string stQuery;
};
매우 흥미로운 아이디어. 나는 여기서 목록을 사용하지 않을 것이고, 더 아마도'deque'의'vector'를 사용할 것입니다. 또한 대소 문자 구분을 고려하십시오 : 우선 순위 25 항목을 검색한다고해서이 대기열이 비어있는 것은 아니므로 대기열 25의 끝에있는 대기열 24를 연결해야합니다. 그런 다음 24를 지운 다음 24를 바꿉니다. <-> 23, 23 <-> 22 등. 1 <--> 0. 연결은 길어질 수 있지만 (크기에 따라 다름), 다른 모든 연산은 단순 포인터 할당이므로 빠릅니다. –
256 개의 이산 우선 순위 값이 확실히 최대 값입니다. 나는 그 아이디어가 정말 마음에 든다. 아직도 나는 움직임과 연주에 대해 조금 걱정한다 ... O (n)은 괜찮을 것이다. –
죄송합니다. O (1)이 아닌 O (n)을 쓰겠습니다. list :: splice는 일정한 시간입니다. – Cubbi