![]() |
Задачка
Предлагаю, на мой взгляд, интересную задачку. Не обязательно решать на AS, хоть на чем. Поэтому и в общем.
Задача заключается в следующем: - нужно разбить содержание массива / списка / стека и т.п. на колонки. При чем, в исходной коллекции элементы упорядочены по какому угодно принципу. Для наглядности я буду использовать цифры, но это может быть что угодно. Разбить нужно таким образом, чтобы максимально заполнить все колонки. Колонки нужно заполнять вертикально последовательно элементами из коллекции. Например: [1, 2, 3, 4, 5, 6, 7] разбив на 5 колонок получим: |1| |3| |5| |6| |7| |2| |4| Естественно, количество элементов и колонок могут быть произвольными. Да, еще, конечно, важное условие: колонки должны быть максимально уравновешены, т.е. вариант когда все элементы - (количество колонок - 1) складываются в первую колонку, а оставшиеся - во все остальные не проходит. |
что-то мне тут Беллман мерещится, но сходу так не соображу. На буратину с яблоками чем-то похоже.
|
Интересно. А мне что-то из расчетов поверхностного натяжения:)
|
а вот взять по-простому и рассовать, не ?
Код AS3:
|
Есть один неприятный момент, который разрушает чувство прекрасного в этом коде :) когда количество элементов делится нацело на количество колонок - 1, получается что в предпоследней колонке на один элемент меньше чем у остальных, а в последней всего один элемент. Например, когда data = [1, 2, 3, 4, 5, 6, 7, 8, 9], w = 4. В таком случае хотелось бы одну колонку делать выше остальных, а не вразнобой :)
|
Цитата:
|
Что-то сложность не понятна: вот как silin сделал, в чем подвох?
|
Артём, там подвох в том, что колонки набираются последовательно и при некоторых случаях последняя колонка будет с одним элементом, в то время, как все остальные с 4-мя, например. Нужно, чтобы все колонки набирались равномерно ровно до тех пор, пока не останутся последние элементы.
Проще проиллюстрировать: Код:
1,4,7,9Код:
1,4,6,8Добавлено через 1 час 23 минуты У меня пока что так получилось (наверняка с ошибками): Код AS3:
|
Код AS3:
Код:
1 4 7 9Код:
1 4 6 8ПС. Алгоритм такой потому что это адаптация со списков, и не хотелось во время распечаток много памяти ис пользовать. Но разница не существенная. |
Код AS3:
|
Народ, вы чо?
Код AS3:
|
Хехе, все не так просто!
Изначальный (мой) вариант делает C + ceiling(N/C) * C итераций. Где C - количество колонок, а N - количество элементов в массиве который нужно распечатать. Кроме того, space-state complexity (тета) равна 3 * C, а в предложенных вариантах - это C + N, что практически всегда будет больше. Я привел ниже код Тигры который распечатывает результат в том же формате, что и мой, чтобы было видно где именно набиратются те самые итерации: Код AS3:
|
В каком-то методе mapconcat они набираются. Надо на выходе String сформатировать? Почему это форматирование не зашить в алгоритм, чтобы не гонять через Array?
|
Нет, mapconcat не при чем. У тебя когда ты формируешь колонки ты проходишь по всему списку / массиву оригинальных значений (т.е. продвигаешься на каждой итерации на 1 элемент вперед). Но для алгиритма это не обязательно (т.е. даже вредно) потомо что можно продвигаться по формуле:
floor(N/C) + f(mod(N,C) - i) где i - счетчик цикла, а f - функция которая возвращает 0 для негативных значений или 0 и 1 для позитивных значений. |
++ медленнее /, mod, -?
|
Цитата:
|
Ну вот я и говорю, что можно иначе. Т.е. не нужно пересчитывать все элементы, можно splice()'ить по нужному числу - т.как мы можем просчитать размер который нужно отрезать по формуле, вметсто того, чтобы считать по одному и ждать пока условие не выполнится ;)
Т.е. в цикле вместо for (i = 0; i < length; i++) можно сделать for (i = 0; i < length; i += stepSize()) где setpSize() = минимальная высота колонки + (если израсходован весь остаток от последнего ряда, то 0, иначе 1). Для списков длиной в несколько миллионов, которые нужно разбить на 5-10 колонок выигрыш будет существенный ;) |
Суть то не меняется. Вот вариант с splice'ом:
Код AS3:
|
Ну, понятно, что если результат тот же, то суть не меняется. Я же не говорил, что не правельно, просто не оптимально. Ну и для больших распечаток дублировать весь массив в памяти тоже как бы не хорошо (можно обойтись памятью 2 * количество колонок), (в первом массиве хранить отступы в исходный массив, откуда печатаем, а во втором - высоту каждой колонки).
Я почему запостил: я когда только столкнулся, то подумал, что задача вообще тривиальная, а оказалось не совсем. Вот подумал, что будет интересно решить. |
Цитата:
а распихать все равно можно по простому (вроде бы :)) Код AS3:
|
| Часовой пояс GMT +4, время: 04:47. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.