IPB
ЛогинПароль:

> Обсуждение темы "Как правильно перемешивать массивы", в FAQ
сообщение
Сообщение #1


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Разработчик
Free Pascal: Разработчик

Репутация: -  627  +


М
Обсуждение темы в FAQ, Как правильно перемешивать массивы

Тема в FAQ разделена. Предлагаю обсуждать здесь, после обсуждения дополнить или исправить тему в FAQ.



Не надо уводить от одной задачи, и приводить к другой...

Вот так, как ты написал в самом верхнем примере, не делается перемешивание. Так генерируются данные уже в перемешанном виде, правда? А то как ты показывешь ниже - это как раз перемешивание (т.е., ранее сгенерировал в прямой последовательности, а потом - перетусовал)... Есть 2 большие разницы между этими вещами. Не надо их сливать в одно, и уж тем более - нельзя сравнивать их быстродействие. Потому что я могу с легкостью сделать так:

for i := 1 to n do begin
repeat
candidat := random(n) + 1; // от 1 до n
can := container.exists(candidat);
until can;
container.push_back(candidat);
end;
, и все будет по-прежнему работать; независимо от того, насколько сложный объект содержится в контейнере, он будет инициализироваться целочисленным значением ОДИН раз, и не будет никаких копирований с места на место, которые могут запросто убить весь тот прирост производительности (если он даже и есть): тебе для того, чтобы поменять местами 2 элемента массива надо инициализировать временный элемент, потом произвести 3 операции копирования, потом временный элемент деинициализировать. Это может быть дольше, чем мой цикл
Кстати, (Показать/Скрыть)


Особенно актуально все вышесказанное становится в свете того, что ты сам заговорил о "сапёре" - ну вот решил я написать "сапёра" с использованием ООП (и не надо мне говорить что это неправильно - как хочу, так и пишу), а твой способ, как оказывается, просто не подходит для этого (если работать сразу с массивом объектов).

В крайнем случае - можно воспользоваться советом, и перемешать указанным образом вспомогательный индексный массив, а потом уже пройти по нему и в нужном порядке проинициализировать элементы рабочего массива объектов:
Вот так (Показать/Скрыть)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 23.09.2019 20:35
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name