Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Реализация неупорядоченной очереди

66K
04 июня 2011 года
Salein
9 / / 12.03.2011
В книге "Фундаментальные алгоритмы на С++" Седжвика описывается абстрактная неупорядоченная очередь и говорится, что можно реализовать ее на базе массива с постоянными по времени выполнения операциями занесения в нее и удаления из нее элементов. Подскажите, как это сделать?
Также интересует наиболее хороший вариант реализации неуп. очереди на базе связного списка.
14
04 июня 2011 года
Phodopus
3.3K / / 19.06.2008
Там, выше, и написан общий принцип как это делается. Задание задали?
66K
05 июня 2011 года
Salein
9 / / 12.03.2011
Там выше описан принцип построения очереди FIFO на базе массива, а мне непонятно как организовать неупорядоченную очередь на его основе (ведь если удалять элементы массива случайным образом, нам понадобится либо хранить несколько указателей начала/конца связных отрезков, либо массив булевых переменных, определяющий наличие/отсутствие элемента в очереди, оба варианта приведут к увеличению времени на удаление элемента с уменьшением количества элементов, оставшихся в очереди). Читаю я для собственного развития, поэтому мне даже кода не надо, объясните сам алгоритм, если возможно.
316
05 июня 2011 года
Alm3n
889 / / 29.05.2009
Цитата:
ведь если удалять элементы массива случайным образом


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

66K
05 июня 2011 года
Salein
9 / / 12.03.2011
Цитата:
Простым, но тем не менее, мощным вариантом является неупорядоченная очередь (random queue) с правилом "удалить случайный элемент"


Это цитата из книги, о которой я говорю. Концепция очередей FIFO мне ясна, меня интересует реализация неупорядоченной очереди.

316
05 июня 2011 года
Alm3n
889 / / 29.05.2009
чем, в таком случае, эта очередь отличается от списка? как вариант, можно использовать два массива, в одном из которых все-таки будет указано какой элемент за каким следует, либо массив структур.
66K
05 июня 2011 года
Salein
9 / / 12.03.2011
Неупорядоченная очередь на базе массива отличается от списка тем, что ее элементы расположены (кто бы мог подумать?) в массиве (т.е. мы имеем быстрый доступ по индексу к любому), в первом предложенном вами варианте реализации операции занесения/удаления элемента будут выполняться не за постоянное время: для удаления элемента нам может понадобиться пройти несколько элементов, прежде чем мы найдем удаляемый (насколько я понял ваш вариант реализации, поясните его, пожалуйста). Второй вариант также требует пояснений, что содержат структуры, о которых вы говорите и как вы планируете их занесение/удаление?
316
05 июня 2011 года
Alm3n
889 / / 29.05.2009
Цитата:
Неупорядоченная очередь на базе массива отличается от списка тем, что ее элементы расположены (кто бы мог подумать?) в массиве


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

Цитата:
в первом предложенном вами варианте реализации операции занесения/удаления элемента будут выполняться не за постоянное время


отчего? в первый массив пишем где реально находится элемент. индекс массива - номер элемента по счету. ну а во втором массиве записываем элементы. как раз постоянное время удаления тут гарантировать можно. вот с добавлением - да, загвоздка. но я не увидел ту часть, где говорилось о постоянном времени операций.
5 |0| |4|
4 |0| |0|
3 |5| |0|
2 |2| |3|
1 |1| |2|
другой вариант мне неизвестен.
со структурами - практически то же самое. поля структуры включают индекс след. элемента в массиве, индекс пред. элемента в массиве, ну и само значение. еще нужены переменные под последний свободный элемент массива и под последний добавленный. при удалении какого-то элемента, обращаемя к последнему свободному, переписываем его "указатель на следующий" номером только что удаленного, переписываем значение переменой, которая хранит номер последнего свободного элемента. добавление: берем номер последнего добавленного, смотрим в поле структуры "следующий элемент", добавляем туда новый, переписываем переменную, которая хранит индекс последнего добавленного. тут можно гарантировать постоянное время, как мне кажется. хотя такой же алгоритм можно организовать без структур, но добавив третий массив к моему предыдущему алгоритму.

277
06 июня 2011 года
arrjj
1.7K / / 26.01.2011
Цитата: Salein

...
Также интересует наиболее хороший вариант реализации неуп. очереди на базе связного списка.



В этой теме есть
Но в std::queue реализация получше :)

66K
06 июня 2011 года
Salein
9 / / 12.03.2011
2 arrjj
Цитата:
вариант реализации неуп. очереди


Меня интересует вариант реализации непорядоченной очредеи, а не FIFO

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

Удаление/добавление элементов идут рука об руку и вариант реализации с чем-то одним не подходит.

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

277
06 июня 2011 года
arrjj
1.7K / / 26.01.2011
Очередь - структура данных с дисциплиной доступа к элементам «первый пришёл — первый вышел» (FIFO, First In — First Out)
316
06 июня 2011 года
Alm3n
889 / / 29.05.2009
Salein, arrjj тоже говорит, что у очереди такой метод доступа. почему ты вообще думаешь, что это не больная фантазия автора? я так и не понял по твоим словам, чем отличается неупорядоченная очередь от списка.
14
07 июня 2011 года
Phodopus
3.3K / / 19.06.2008
Советую ТС несколько раз внимательно перечитать что подразумевает Седжвик под неупорядоченной очередью :)
316
07 июня 2011 года
Alm3n
889 / / 29.05.2009
Цитата:
что подразумевает Седжвик под неупорядоченной очередью


он вроде бы не конкретизировал. там всего два предложения о ней. или все же конкретизировал?

277
07 июня 2011 года
arrjj
1.7K / / 26.01.2011
Скачал ради интереса Седжвика, вобщем он только один имеет такое понятие как "неупорядоченная очередь" ( "random queue" ) Во всяком случае официально такого стандарта нет.
Ну а то что хотел афтор можно реализовать и так например(говнокодец :)):
Код:
#include <iostream>
#include <stdlib.h>
#include <cstring>
#include <time.h>
using namespace std;
template <class T> class myqueue
{
private:
    T ** mqueue;
    int length;
public:
    myqueue()
    {
        mqueue=NULL;
        length=0;
        srand ( time(NULL) );
    };
    bool isEmpty()//проверка на пустоту
    {
        return !length;
    };
    void push(T element)//добавление в конец списка
    {
        T * newelement=new T(element);
        T ** newqueue=new T*[length+1];
        if(length)
        {
            memcpy(newqueue,mqueue,sizeof(T*)*length);
            delete [] mqueue;
        }
        mqueue=newqueue;
        mqueue[length]=newelement;
        length++;
    };
    T pop()//выборка случайного значения
    {
        T ret=T();
        if(length)
        {
            int rnd=rand()%length;
            ret=*mqueue[rnd];
            delete mqueue[rnd];
            T ** newqueue=new T*[length-1];
            memcpy(newqueue,mqueue,sizeof(T*)*rnd);
            memcpy(newqueue+rnd,mqueue+rnd+1,sizeof(T*)*(length-rnd-1));
            delete [] mqueue;
            mqueue=newqueue;
            length--;
        }
        return ret;
    };
};
   
int main()
{
    myqueue<int> a;
    int b=5;
    a.push(b);
    a.push(24);
    a.push(36);
    a.push(48);
    a.push(60);
    cout<<a.pop()<<endl;
    cout<<a.pop()<<endl;
    cout<<a.pop()<<endl;
    cout<<a.pop()<<endl;
    cout<<a.pop()<<endl;
    cout<<a.pop()<<endl;//0 (елементы закончились, выводим новый елемент с конструктором по умолчанию)
    cout<<a.isEmpty()<<endl;//1 (1-пустой, 0-непустой)
    myqueue<char> c;
    char d='A';
    c.push(d);
    c.push('B');
    c.push('C');
    cout<<c.pop()<<endl;
    cout<<c.pop()<<endl;
    cout<<c.pop()<<endl;
    cout<<c.pop()<<endl;// (елементы закончились, выводим новый елемент с конструктором по умолчанию)
    cout<<c.isEmpty()<<endl;//1 (1-пустой, 0-непустой)
    return 0;
}

В книге же предложено реализовать на массиве с конечным количеством элементов (какойто прям random bounded queue получается :))
80K
18 января 2012 года
korvin123
1 / / 18.01.2012
если отвечать на самый первый вопрос, то удаление осуществляется следующим образом: выбираете случайный элемент в очереди, на его место ставите первый элемент очереди, смещаете указатель на начало очереди вправо, а затем возвращаете ранее выбранный случайный элемент; аналогичным образом осуществляется вставка: выбираете случайный элемент в очереди, на его место ставите новый элемент очереди, ранее выбранный случайный элемент ставите в конец, смещаете указатель на конец очереди вправо
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог