1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
| passat |
Сообщение
#1
|
|
Новичок ![]() Группа: Пользователи Сообщений: 32 Пол: Мужской Репутация: 0 |
Помогите еще с одной задачкой.
Имеется последовательность натуральных чисел. Необходимо выполнить N перестановок участков последовательности, где участок задается его началом и концом. Перестановка выполняется в начало последовательности. Т.е. для последовательности из 6 чисел ип трех перестановках 2 4 2 4 4 4 результат должен быть 2 3 4 1 5 6 . Количество чисел и перестановок может быть несколько сот тысяч. Первая идея: список. В связи с чем вопрос: можно ли как-то оптимизировать порядок выполнения перестановок? Либо хотя бы порядок переброски итераторов? Или же существует еще какое-то более интересное решение? |
![]() ![]() |
| volvo |
Сообщение
#2
|
|
Гость |
passat, а тебе что, обязательно какая-то
Цитата хитрая структура нужна? У тебя ограничения на используемую память есть? Компилятор какой? Вот тебе простейшее решение (тестировалось на FPC), 2 массива (обычных, статических массива, тест гонялся на размерах 100-200 тысяч + несколько сот тысяч перестановок) нужного размера + встроенный Move... Выигрыш относительно списков - более 2.5 раз (точнее - 2.62 .. 2.68, на разных значениях transform_count)for i := 1 to arrsize do begin |
| passat |
Сообщение
#3
|
|
Новичок ![]() Группа: Пользователи Сообщений: 32 Пол: Мужской Репутация: 0 |
Компилятор Delphi 7 или Free Pascal. Либо на C++ MS VisualStudio до 2005 включительно. Язык, вообще говоря, не принципиален.
Ограничений по памяти вроде нет. А за счет чего получается выигрыш в сравнении со списком? Тут же мы имеем время n^2, правильно? Оптимизированное даже по трем итераторам на линейном списке решение не проходит проверку на время. Вложенные списки дают выигрыш кое-где, но все тесты все равно не проходит Данные по времени выполнения сервер печатает странные: тесты с большим временем принимает, а с меньшим - нет. То ли сервер слишком умный, то ли я отсталый. За подсказку спасибо. Реализацию уже почти добил, надо попробовать сдать. Но к сожалению что-то подсказывает, что этого может быть недостаточно. А есть ли структура, которая работает за логарифмическое время? Хотя б ссылку на это чудо... А то горю Заранее спасибо. ПС. А не получится ли в случае, если решение все же пройдет, зависимое от языка решение? Сообщение отредактировано: passat - |
passat Перестановка участков последовательности 1.04.2009 20:02
volvo Чтоб можно было оптимизировать, надо знать, что дл… 1.04.2009 22:11
passat
НЕ оптимизированный вариант очевиден - перестанов… 3.04.2009 21:51
passat Как и опасался, по состоянию на данный момент для … 6.04.2009 17:03
volvo За счет чего? 6.04.2009 19:07
passat Положим, что количество элементов 10000 и каждый в… 6.04.2009 20:41
passat На линейном списке превышен предел времени исполне… 25.04.2009 18:56
passat Не прошла задачка по времени. А жаль. :(
Видимо, … 29.04.2009 17:25![]() ![]() |
|
Текстовая версия | 6.11.2025 23:24 |