Поиск:

Ответ в темуСоздание новой темы Создание опроса
> списки с числовой индексацией 
V
    Опции темы
victor79
Дата 20.7.2010, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 15.5.2008

Репутация: нет
Всего: нет



существуют ли реализации списков, к которым можно обращаться по числовым порядковым индексам (0,1,2...),
применимы к ним операции удаления по произвольному индексу, и при этом и индексация и удаление выполняется за конечное количество итераций?
PM MAIL WWW   Вверх
Jimy
Дата 20.7.2010, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 4.7.2010

Репутация: 1
Всего: 3



существуют, и называются "массивы"
PM   Вверх
victor79
Дата 20.7.2010, 02:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 15.5.2008

Репутация: нет
Всего: нет



только массивы не удовлетворяют условию "удаление"&&"конечное колич итераций" - весь хвост нужно перемещать на позицию назад.
PM MAIL WWW   Вверх
W4FhLF
Дата 20.7.2010, 06:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 5
Всего: 121



Вашим условиям массивы с прямым доступом удовлетворяют. Потому что количество итераций конечно. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Earnest
Дата 20.7.2010, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



Хэш-мап, например, с целым ключом. Правда, удаленный элемент образует дырку в индексации. Но зато все операции выполняются за постоянное время.


--------------------
...
PM   Вверх
victor79
Дата 20.7.2010, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 15.5.2008

Репутация: нет
Всего: нет



>Хэш-мап, образует дырку в индексации
теряется весь смысл. Смысл выполнять такую весчъ:
 
Код

for (int i = 0; i < obj.count(); i++) DoAnything(obj[i]);

конечно можно и итераторами, но случаи бывают разные...
PM MAIL WWW   Вверх
Earnest
Дата 20.7.2010, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



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


--------------------
...
PM   Вверх
esperanto
Дата 20.7.2010, 11:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 31.5.2003

Репутация: 2
Всего: 4



Не стоит путать постоянное и конечное время исполнения
--------------------
B.Sc ->M.Sc.->Microsoft SDE-> (Ph.D. student + Intel SDE + psyсhology B.A) - > Skype SDET
PM MAIL   Вверх
victor79
Дата 20.7.2010, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 15.5.2008

Репутация: нет
Всего: нет



как раз миллионы значений и интересуют.

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

Но алгоритм с сохранением порядка если кто придумает, то будет тоже гуд.

Под своим "конечное колич итераций" я подразумеваю, что время выполнения не должно расти линейно с размером списка. Максимум логарифмически. Извеняюсь, если где напутал с понятиями.

Это сообщение отредактировал(а) victor79 - 20.7.2010, 20:52
PM MAIL WWW   Вверх
maxim1000
Дата 20.7.2010, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



возможно, что-то дерево-образное может подойти

думаю, реализацию чего-то вроде std::set можно расширить, чтобы позволить доступ по индексу за логарифмическое время

за константу - вряд ли...

но вообще, лучше бы знать всю задачу
если это только, чтобы писать for(int c=0;... вместо for(std::set<T>::iterator..., то оно того не стоит


--------------------
qqq
PM WWW   Вверх
victor79
Дата 21.7.2010, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 15.5.2008

Репутация: нет
Всего: нет



>если это только, чтобы писать for(int c=0;... вместо for(std::set<T>::iterator..., то оно того не стоит
оно того стоит, столько дополнительной писанины с объявлением этих итераторов, поиском где какой тип напутал, и вообще совместимость между разнотипными деревьями - это жуть.
Оно конечно по скорости может будет медленее (хотя вышеуказанная мной реализация вряд ли), но пока придумываешь
алгоритм, столько раз напишешь iterator, столько дополнительных мозготактов тратится, что жуть.
Плюс еще один плюсик - можно отслеживать процент выполнения без дополнительной считающей переменной.

>реализацию чего-то вроде std::set
это да, осталось только определиться, что за алгоритм.
Первые задумки были типа запоминать удаленные в отдельном множестве, но для этого нужно в дереве удаленных считать сколько там уже есть до этого элемента. Т.е. каждая ветка в удаленных должна знать, сколько в ней есть элементов. Если массивы на диске - то будет то что нужно, но для массивов в памяти пока не решился такую делать.
PM MAIL WWW   Вверх
Earnest
Дата 21.7.2010, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



Цитата(victor79 @  21.7.2010,  20:02 Найти цитируемый пост)
оно того стоит, столько дополнительной писанины с объявлением этих итераторов, поиском где какой тип напутал, и вообще совместимость между разнотипными деревьями - это жуть.

Ты просто не умеешь их готовить... дело опыта. Год-два хорошей практики, и тебя будет коробить от индексов. И путать ничего не будешь. Разыменованный итератор гораздо нагляднее, чем нагромождение скобок.


--------------------
...
PM   Вверх
victor79
Дата 22.7.2010, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 15.5.2008

Репутация: нет
Всего: нет



кто что умеет готовить, и что не умеет - это дело привычки. У меня одни блюда, у Вас другие... И мы никогда не узнаем, чье блюдо вкуснее(эффективнее), т.к. это зависит не только от повара, но и от потребителя, от времени вкушания, и от времени отведенного на вкушание, и от... да много от чего  smile 
У меня эта задача ОТЧАСТИ для реализации списков в интерпретируемом языке, в котором итераторы будут совершенно излишни. Часть вещей решается через foreach, часть через перебор по индексу.

Если дерево будет хранить сколько элементов в каждой ветке, тогда все решается. При вставке элемента, всем родителям cnt_childs++, при удалении cnt_childs--, при получении по индексу... там чуть посложнее чем ++, но время выполнения укладывается в логарифмическое. Самого родителя при этом сохранять не нужно, так же как и в RedBlack, но на размер int cnt_childs все же будет увеличен каждый элемент.
Если нужен порядок перебора в порядке добавления, то индекс для дерева будет предыдущийИдентификатор+1 (этот идентификатор не уменьшаем при удалениях).
При наличии двух деревьев возможен перебор значений и по индексам-значениям (произвольный индекс), и по числовому индексу в порядке добавления, и по числовому индексу в порядке возрастания индекса-значения.

Решение найдено!!! smile 

Это сообщение отредактировал(а) victor79 - 22.7.2010, 22:24
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0966 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.