Вопрос № 173862: Доброго времени суток, передо мной встала следущая задача: имеются большие списки в таком формате: 1 2 3 4 и тд, задача с максимальной скоростью эти списки перемешать, делаю это так: for i:=0 to RandList2.Count-1 do begin Rand...
Вопрос № 173862:
Доброго времени суток, передо мной встала следущая задача: имеются большие списки в таком формате: 1 2 3 4 и тд, задача с максимальной скоростью эти списки перемешать, делаю это так: for i:=0 to RandList2.Count-1 do begin Randomize; p3:=random(Randlist2.Count-1); outRandlist2.Add(Randlist2[p3]); Randlist2.Delete(p3); end; но это занимает ужасно много времени, есть ли способ ускорить данный процесс?
Отвечает Striker Loner, 1-й класс :
Здравствуйте, Akahaos.
Совсем необязательно создавать два списка. ведь при таком подходе на каждый новый добавленный элемент будет происходить следующее: 1. выделяется новый обем памяти (count + 1) на добавление нового элемента. 2. копируется ВЕСЬ объем данных которые уже храняться в списке 3. добавляется новый элемент
Т.о. при очень больших размерах быстродействие будет все сильнее и сильнее проседать.
Поэтому мой вариант таков: 1. заполняем один раз список (желательно
сначала задав количество элементов через outRandlist2.Count := NN) 2. Заполняем в цикле for i := 0 to outRandlist2.Count - 1 do begin outRandlist2[i] := i;// на какуюто случайную позицию ставим элемент который гарантировано будет возрастать end; 3. перемешиваем for i := 0 to outRandlist2.Count - 1 do begin j := random(outRandlist2.Count) // иначе никогда не будет переставляться самый последний элемент
t := outRandlist2[i]; // меняем элементы местами (тасуем) outRandlist2[i] := outRandlist2[j]; outRandlist2[j] := t; end;
Ответ отправил: Striker Loner, 1-й класс
Ответ отправлен: 02.11.2009, 09:27
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 256107
на номер 1151 (Россия) |
Еще номера »
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.