Member-2338430 Ответов: 8

что такое алгоритм?


банк очередей систем и работы по методу FIFO первым пришел, первым ушел Райт?

но есть особые клиенты, они не стоят в очереди, они выходят, но идут первыми.


каков алгоритм такого рода очередей?

мы будем использовать только одну очередь, там нет большого количества очередей.

8 Ответов

Рейтинг:
8

JackDingler

Отличные ответы выше...

Если бы я писал эту очередь, она могла бы выглядеть примерно так...

#pragma once

#include <map>
#include <deque>

template<class T>
class CPriorityQueueT
{
protected:
    std::map<int, std::deque<T>>	PriorityMap;

public:
    bool	PushMessage(const T & Message, int Priority = 5);

public:
    bool	PopMessage(T & Message, int * pPriority = NULL);
};

template<class T>
bool CPriorityQueueT<T>::PushMessage(const T & Message, int Priority)
{
    // Find the deqeue that has the same priority
    std::map<int, std::deque<T>>::iterator Iter = PriorityMap.find(Priority);
    if (Iter == PriorityMap.end())
    {
        // The deque doesn't exist. Create it.
        PriorityMap.insert(std::pair<int, std::deque<T>>(Priority, std::deque<T>()));
        Iter = PriorityMap.find(Priority);
    }
    
    // Add the message to the deque
    std::deque<T> & Deque = (*Iter).second;
    Deque.push_back(Message);
    
    return true;
}

template<class T>
bool CPriorityQueueT<T>::PopMessage(T & Message, int * pPriority)
{
    std::map<int, std::deque<T>>::iterator Iter = PriorityMap.begin();
    std::map<int, std::deque<T>>::iterator End  = PriorityMap.end();
    
    // Loop through the map and see if any of the priority deques have data.
    for (; Iter != End; Iter++)
    {
        if ((*Iter).second.size())
            break;
    }
    
    if (Iter == PriorityMap.end())
    {
        // All deques are empty. Exit.
            return false;
    }

    if (pPriority)
        *pPriority = (*Iter).first;
    
    std::deque<T> & Deque = (*Iter).second;
    Message = Deque.front();
    Deque.pop_front();
    
    return true;
}


JackDingler

извините за отсутствие отступов, но я не мог заставить эту систему показывать LTs, GTs и отступы одновременно.

В этой системе редактирования все еще есть некоторые ошибки, которые нужно устранить.

JackDingler

спасибо за уборку. :)

JackDingler

Кстати, если это домашнее задание, убедитесь, что вы можете объяснить, как оно работает. :)

Рейтинг:
68

Andreas Gieriet

Возможно, вы ищете приоритетную очередь. Видеть http://en.wikipedia.org/wiki/Priority_queue[^].


Manfred Rudolf Bihy

Хороший ответ! 5+

Andreas Gieriet

Спасибо :-)

Espen Harlinn

5 ЕД!

RaviRanjanKr

Мои 5+

Sergey Alexandrovich Kryukov

Правильно, хорошая рекомендация.
--СА

Рейтинг:
58

Mehdi Gholam

Это называется приоритетной очередью, элементы в очереди обрабатываются сначала по их приоритетному номеру, а затем по порядку FIFO.


Manfred Rudolf Bihy

Правильный ответ! 5+

Mehdi Gholam

Спасибо, парень.

Espen Harlinn

5 ЕД!

Mehdi Gholam

Спасибо, Эспен, с Новым годом!

Sergey Alexandrovich Kryukov

Коротко,но по существу, 5.
--СА

Mehdi Gholam

Спасибо, Сергей!

Рейтинг:
48

Espen Harlinn

В то время как ответы Андреаса и Мехди хороши, вы можете захотеть исследовать служба MSMQ[^] или что-то подобное тоже.

MSMQ позволяет установить приоритет сообщений, а также позволяет безопасно сохранять элементы в очереди. Это часто важно, когда вы работаете с деньгами. Вы действительно не хотите терять деньги-поэтому каждый шаг вашего конвейера обработки должен быть как транзакционным, так и постоянным.

С уважением
Эспен Харлинн


Mehdi Gholam

Система очередей тоже хорошая идея,хотя я нахожу MSMQ кошмаром развертывания.

5 ЕД

Espen Harlinn

Если вы не работаете внутри домена, есть некоторые ограничения. Настройка его на 2008 r2 стала довольно прямолинейной. Когда я работаю за пределами домена, я обычно придерживаюсь частных очередей.

Mehdi Gholam

Теперь, когда вы упомянули об этом, я помню, что у меня были проблемы с ним вне доменов, это доставляло мне столько хлопот, что я бросил его и переключился на то, что написал сам (над чем у меня был полный контроль).

Espen Harlinn

Я знаю, я читал ваши статьи-Аккуратные :)
Я тоже шел по этому пути, но это было в C++ и почти 10 лет назад.

Wendelius

Определенно хороший вариант. Немного крутая кривая обучения, но действительно полезная. +5

Espen Harlinn

Спасибо, Мика!
Я привел здесь простой пример: http://www.codeproject.com/KB/cs/Harlinn_Messaging.aspx

Sergey Alexandrovich Kryukov

Правильно, один из вариантов, мой 5.
--СА

Espen Harlinn

Спасибо, Сергей

Рейтинг:
2

Chuck O'Toole

Все мои коллеги правы в том, что касается информатики. Приоритетные очереди позволяют вводить элементы в нужном порядке для удаления. Очереди с несколькими очередями / несколькими серверами позволяют отслеживать совершенно разные приоритеты для важных транзакций / элементов.

Приоритетные очереди хорошо работают в компьютерных приложениях, но ужасно терпят неудачу, когда применяются к реальным людям. Вы когда-нибудь пытались воспользоваться своей "картой приоритетного клиента" в банке или, что еще хуже, в очереди за билетами на концерт? Это называется "прыжки в линию", и вы навлечете на себя гнев всех остальных в очереди. Вы будете вынуждены объяснять свой" приоритет "всем остальным в очереди, и именно они решат, действителен ли ваш" приоритет " или вас вышвырнут из очереди.

Мульти-очередь (будь то один или несколько серверов) лучше всего работает в приложениях "люди". Рассмотрим билетную кассу MGM Grand в Фоксвудсе, где есть линия" general ticket pick-up", змеящаяся через вестибюль, и линия "Platinum and Diamond Elite", которая очень короткая и имеет своего собственного билетного агента. Никто не спорит с вами, когда вы попадаете в эту очередь, билетный агент проверяет ваш статус на стойке регистрации и вежливо просит вас перейти в другую линию, если вы находитесь в неправильной очереди. Все течет гладко и приятно.

Итак, если вы работаете с холодными, бесчувственными приложениями, которым все равно, если перед ними прыгает другое приложение / задача / транзакция / поток, приоритетные очереди-это правильный путь. Если вы работаете с людьми, отделяйте элиту от большой немытой публики всякий раз, когда это возможно (мульти-очередь).

Только мои 2 цента стоят :)


Andreas Gieriet

Привет Чак,

уходя от эмоций мир людей стоя в очереди; -), я считаю мульти-очереди деталь реализации приоритетной очереди концепция.

С другой стороны, я также испытал в "реальной жизни", что приоритетная очередь с одной очередью работала хорошо: "более приоритетные" люди выбирались из очереди "диспетчером"-это в основном зависит от уровня принятия приоритетов для отдельных лиц или органа, осуществляющего диспетчеризацию (например, см. сортировку в отделении неотложной помощи).

Овации

Энди

Member-2338430

есть код этого алгоритма на C++?

Andreas Gieriet

А как насчет google?.. приоритетная очередь "c++"

Напр. очередь с приоритетами

Рейтинг:
1

ErnestoNet

В STL есть реализация алгоритма очередей приоритетов: "priority_queue"
Заголовок - " очередь"

Он включает в себя новый метод "фронт" для добавления приоритетных элементов.

http://www.cplusplus.com/reference/stl/priority_queue/[^]

http://www.cplusplus.com/reference/stl/priority_queue/priority_queue/[^]


RaviRanjanKr

5+

JackDingler

Это интересное дополнение, учитывая, что std::deque уже может это сделать.

Рейтинг:
0

Satheesh1546

Привет,

Это именно приоритетная очередь. Каждому элементу в очереди присваивается определенный приоритет на основе некоторых критериев.Обработка осуществляется на основе этого критерия. Элемент с наибольшим приоритетом обрабатывается первым и так далее.


Овации


fjdiewornncalwe

Пожалуйста,не публикуйте ответы, которые являются дубликатами других. Вместо этого поднимите эти ответы.

Рейтинг:
0

patup9

Все эти ответы хороши. Лучше использовать приоритетную очередь или связанный список в качестве очереди. Связанный список должен содержать структуру с элементом, обозначающим, имеет ли конкретный элемент приоритет или нет.

Поэтому каждый раз, когда вы берете данные из связанного списка, просматривайте весь список, чтобы проверить, присутствует ли какой-либо приоритетный элемент или нет.

Если есть, возьмите этот предмет.

В противном случае возьмите первый элемент в списке, который будет первым элементом, который вы ввели. Таким образом, он будет работать на основе FIFO с приоритетным планированием.


fjdiewornncalwe

Пожалуйста,не публикуйте ответы, которые являются дубликатами других. Вместо этого поднимите эти ответы.