18c0693f

Краткая теория


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

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

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

Различают два основных вида очередей, отличающихся по дисциплине обслуживания находящихся в них элементов :

1.   При первой из дисциплин заказ, поступивший в очередь первым, выбирается первым для обслуживания (и удаляется из очереди). Эту дисциплину обслуживания принято называть FIFO (First input-First output, т.е. первый пришел - первый ушел). Очередь открыта с обеих сторон.

2.   Вторую дисциплину принято называть LIFO (Last input - First output, т.е. последний  пришел - первый ушел), при которой на обслуживание первым выбирается тот элемент очереди, который поступил в нее последним. Очередь такого вида в программировании принято называть СТЕКОМ (магазином) - это одна из наиболее употребительных структур данных, которая оказывается весьма удобной при решении различных задач.

В силу указанной дисциплины обслуживания, в стеке доступна единственная его позиция, которая называется ВЕРШИНОЙ стека - эта позиция, в которой находится последний по времени поступления в стек элемент. Когда мы заносим новый элемент в стек, то он помещается поверх вершины и теперь уже сам находится в вершине стека. Выбрать элемент можно только из вершины стека; при этом выбранный элемент исключается из стека, а в его вершине оказывается элемент, который был занесен в стек перед выбранным из него элементом (структура с ограниченным доступом к данным).


 

До сих пор мы рассматривали только статические программные объекты. Этим термином обозначаются объекты, которые порождаются непосредственно перед выполнением программы, существуют в течение всего времени ее выполнения и размер значений которых не изменяется по ходу выполнения программы.

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

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

В языке ПАСКАЛЬ для работы с динамическими объектами предусматривается специальный тип данных - так называемый ссылочный тип. Значением этого типа является ссылка на какой - либо программный объект, по которой осуществляется непосредственный доступ к этому объекту. На машинном языке такая ссылка как раз и представляется указанием места в памяти соответствующего объекта.

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

Итак, динамические структуры данных имеют две особенности :

 1. Заранее не определимо количество элементов в структуре;

 2. Элементы динамической структуры не имеют жесткой линейной упорядоченности. Они могут быть разбросаны по памяти.

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

p1, p2 - указатели, содержащие адреса элементов, с которыми данный элемент связан.

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

К линейным спискам относятся односвязные и двусвязные списки.

К нелинейным - многосвязные списки.

Элемент списка в общем случае представляет собой комбинацию поля записи (информационного поля) и одного или нескольких указателей.




О том, что из себя представляют списки говорилось в предыдущей работе. Мы рассматривали однонаправленные списки, теперь мы рассмотрим кольцевые списки.

Как видно на рисунке, список замыкается в своеобразное "кольцо": двигаясь по ссылкам, можно от последнего элемента списка переходить к заглавному элементу. В связи с этим списки подобного рода называют кольцевыми списками.

Чтобы закольцевать список необходимо присвоить указателю последнего элемента указатель начала списка (Ptr(p)=lst).

Ptr(p) - указатель последнего элемента;

Lst - указатель начала списка.




Формулировка задачи.

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

F(t)=1-e-nt

Поток поступающих требований ограничен, то есть одновременно в системе обслуживания не может находиться больше  m требований,  где m -  конечное число. Это дает право считать, что требования на  обслуживание поступают от m обслуживаемых объектов, которые время от времени нуждаются в  обслуживании.    Пусть вероятность того, что поступит заявка на обслуживания  на данном такте  равна  Р(А)  и  вероятность   того, что  требование  из  очереди поступит  на обслуживание равно Р(В) ( на каждом такте может поступить не  более   одной заявки  на обслуживание). Число обслуживающих аппаратов равно N.  Допустим,  требование дождалось своей очереди и оно начало обслуживаться. Обслуживание может длиться в течении не более 3-х тактов.  Заявки могут быть двух приоритетов:

Заявка первого приоритета:

     Это обычная заявка, она не обладает ни какими  привилегиями. Она  может покинуть систему через определенное число тактов Т. При приходе  в обслуживающую систему заявка первого  приоритета  становится в   конец очереди.

Заявка второго приоритета:

     Эта заявка отличается только тем, что она при поступлении в  обслуживающую систему   становится в начало очереди, то есть как только освобождается аппарат, то она поступает на обслуживание  с  вероятностью Р(В).

Заявка второго  приоритета , как и заявка первого  приоритета, покидает систему через Т тактов. Естественно, что появление заявок второго приоритета достаточно мало ( хотя эта вероятность задается пользователем и может быть любой ).  Теперь об обслуживании:    Количество тактов, в течение которых будет обслуживаться  та или иная заявка выбирается случайно (эта величина в  данной  задаче не должна быть больше 3).   Если заявка  обслужилась  положенное ей число тактов, то  она покидает систему. Если заявка находится в очереди больше Т тактов, то она с некоторой  вероятностью покидает систему. 




 

Общие сведения о структуре данных – дерево.

Дерево - это нелинейная связанная структура данных, характеризуемая следующими признаками :