Russian Qt Forum

Qt => Общие вопросы => Тема начата: Admin от Май 29, 2009, 11:57



Название: Нужен аналог QQueue с случайными доступом к элементам
Отправлено: Admin от Май 29, 2009, 11:57
Есть очередь QQueue. Хочется функцию получения(удаления) элемента из случайного места очереди?
Есть ли какие нибудь идеи?


Название: Re: Нужен аналог QQueue с случайными доступом к элементам
Отправлено: BRE от Май 29, 2009, 12:12
Ну так QQueue наследуется от QList, а там все это есть.


Название: Re: Нужен аналог QQueue с случайными доступом к элементам
Отправлено: Admin от Май 29, 2009, 12:47
а нельзя ли поподробнее с примером
PS: пятница)


Название: Re: Нужен аналог QQueue с случайными доступом к элементам
Отправлено: nixman05 от Май 29, 2009, 12:50
Вообще то QQueue реализует динамическую структуру данных с дисциплиной LIFO

т.е. добавляются элементы с одного конца, а удаляются с другого. Известны указатели на начало и конец очереди.


Название: Re: Нужен аналог QQueue с случайными доступом к элементам
Отправлено: lit-uriy от Май 29, 2009, 13:43
2 Admin, дык может Список и пользовать (QList)?


Название: Re: Нужен аналог QQueue с случайными доступом к элементам
Отправлено: BRE от Май 29, 2009, 13:43
а нельзя ли поподробнее с примером
PS: пятница)
Код
C++ (Qt)
QQueue<int> q;
 
// Добавили в очередь три числа 1, 2, 3
q.enqueue( 1 );
q.enqueue( 2 );
q.append( 3 );
 
// Получить элемент с нужным индексом
int val3 = q.value( 2 );
int val1 = q[ 0 ];
 
// Удалить элемент с нужным индексом
q.removeAt( 1 );
 


Название: Re: Нужен аналог QQueue с случайными доступом к элементам
Отправлено: nixman05 от Май 29, 2009, 22:43
а нельзя ли поподробнее с примером
PS: пятница)
Код
C++ (Qt)
QQueue<int> q;
 
// Добавили в очередь три числа 1, 2, 3
q.enqueue( 1 );
q.enqueue( 2 );
q.append( 3 );
 
// Получить элемент с нужным индексом
int val3 = q.value( 2 );
int val1 = q[ 0 ];
 
// Удалить элемент с нужным индексом
q.removeAt( 1 );
 


Это все конечно хорошо но не корректно.  Очередь это очередь, Стек это стек.  Список это список. С очереди нельзя получить доступ к произвольному элементу. Список позволяет это сделать. Для того чтобы получить доступ к произвольному элементу очереди, удаляя их из очереди и сохраняя в вспомогательную очередь, затем изменить элемент и после этого восстановить  удаленные элементы очереди.


Название: Re: Нужен аналог QQueue с случайными доступом к элементам
Отправлено: Rcus от Май 30, 2009, 05:41
Продолжая цепочку утверждений: std это std, Qt это Qt. Спасибо, капитан, вы просто открыли нам глаза, что бы мы без вас делали.


Название: Re: Нужен аналог QQueue с случайными доступом к элементам
Отправлено: spectre71 от Май 30, 2009, 08:39
Есть очередь QQueue. Хочется функцию получения(удаления) элемента из случайного места очереди?
Есть ли какие нибудь идеи?
Хотелось бы узнать подробнее о параметрах задачи.
1) Какой длины очередь:
    - всегда короткая
    - всегда длинная
    - любая или неизвестно
2) Как часто происходит выбока елемента из очереди
3) Как часто происходит доступ к произвольному елементу очереди
4) Как часто происходит удаление произвольного елемента очереди
Понятия "часто" и "длина" зависят друг от друга и влияют на производительность только для конкретной задачи.

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



   


Название: Re: Нужен аналог QQueue с случайными доступом к элементам
Отправлено: spectre71 от Май 30, 2009, 08:56
Пример для очереди.
1) Какой длины очередь: ограниченная не больше N элементов, не жалко памяти на постоянное содержания N элементов
2) Как часто происходит выбока елемента из очереди - очень часто
3) Как часто происходит доступ к произвольному елементу очереди  - очень часто
4) Как часто происходит удаление произвольного елемента очереди - очень редко

Берем обычный список и "ЗАКОЛЬЦОВЫВАЕМ" его:
Храним два индекса на начало и конец очереди, изменяем их на операциях добавления и выборки,
Перезаписываем указатель на объект на операции добавления.


Название: Re: Нужен аналог QQueue с случайными доступом к элементам
Отправлено: spectre71 от Май 30, 2009, 11:41
В общем случае через постронение и манипуляции с бинарным деревом, можно свести стоимость операций:

вставка, удаление получение по идексу = Co*log(N)
А для сортированного(с поддержкой автосортировки) операция получение по ключу = Co*log(N)

Построение дерева = Co*N*log(N)
Стоимость сортировки зависит от текущего алгоритма сортировки и = Cost(ListSortAlg) + Построение дерева.

N   - кол-во элементов списка.
Co - констана в зависимости от операции
log - логарифм


Название: Re: Нужен аналог QQueue с случайными доступом к элементам
Отправлено: Admin от Май 31, 2009, 23:25
Я сделал уже с QList, а очередь не большая - примерно 1000 элементов всего)


Название: Re: Нужен аналог QQueue с случайными доступом к элементам
Отправлено: spectre71 от Июнь 01, 2009, 07:35
До 1000-10000 элементов лучше с деревом и не и не заморачиваться.
Констатнты стоимости опраций вставки/удаления огромны.
А кольцо попробуй - если частое случайное чтение.