Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет qwerty ([info]qwerty)
@ 2010-01-24 17:11:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Задачка

Есть одномерный массив целых. В начале его расположен массив A длиной a, в конце B длиной b, а посредине не интересующий нас мусор длиной c. Требуется красивым образом переместить B в начало, за ним расположить A, причем сделав при этом не более a+b чтений и записей в массив. Судьба мусора не интересует. Файлы, посторонняя память и рекурсия категорически отсутствуют.


(Читать комментарии) - (Добавить комментарий)

Re: ХЗ как тут форматировать
[info]qwerty
2010-01-26 20:35 (ссылка)
Что - "это"? Если б не требовалось произвести не более a+b чтений и записей, именно так бы оно красиво в три свопа и делалось, плюс пересылка в конце. В общем-то, никакой новости в том нет. В обсуждении оно тут не раз уже упоминалось.

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: ХЗ как тут форматировать
[info]faceted-jacinth.livejournal.com
2010-01-26 23:59 (ссылка)
Там три с половиной алгоритма. Третий оптимален по свопам для c == 0, для других c его кажется несложно допилить, но мне влом. Третий-с-половиной ещё и кэш не так убивает.

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: ХЗ как тут форматировать
[info]blue_slonopotam
2010-01-27 00:15 (ссылка)
не готов долго думать, но

моя запись иллюстрирует не доказательство, но некоторый ход мысли - НОД может быть 1 и a+c может быть больше размера линии кэша, из чего следует, что кэшу несдобровать в любом случае.

Я сомневаюсь в существовании "Третий-с-половиной ещё и сына кэш не так убивает".

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: ХЗ как тут форматировать
[info]faceted-jacinth.livejournal.com
2010-01-27 01:06 (ссылка)
А, я не прав был. То есть он говорит, что в 60% случаев там вообще получится один цикл (прыгающий как безумный по всему массиву), и в остальных случаях локальность будет только на первой итерации обычно, но "It [loop fusion] is, nevertheless, an important technique that is worth demonstrating" =) Типа, его прёт, что её можно сделать достаточно генерик и без залезания в нутро компилятора, и она будет работать быстро!

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: ХЗ как тут форматировать
[info]blue_slonopotam
2010-01-27 01:37 (ссылка)
Изучение алгебры полезно для душевного здоровья, видимо, и автору этой книжки тоже.

(Ответить) (Уровень выше)

Re: ХЗ как тут форматировать
[info]qwerty
2010-01-27 00:17 (ссылка)
В каком смысле оптимален? Там N+gcd. При a==b получаем 2(a+b).

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: ХЗ как тут форматировать
[info]faceted-jacinth.livejournal.com
2010-01-27 00:59 (ссылка)
Это потому что он считает в том числе и moves to/from the temporary variable.

Посмотри внимательно на первые шесть строк кода на 194 странице. Это весь алгортм, в оставшихся строках он вычисляет новое положение границы между a и b. Ну, плюс do_cycle имплементирован ранее - он тупо сдвигает циклически фигню используя особый итератор. Ну, берём первый элемент, он должен попасть куда-то там, но там уже есть элемент, он тоже в результате должен попасть куда-нибудь, и так далее, формулка и имплементация этого итератора -- на 163 странице. Ну и вот, вся магия (которую я не до конца понимаю) состоит в утверждении, что первые GCD(m - f, l - m) элементов обязательно принадлежат разным циклам и больше циклов у нас нет, то есть если мы вызовем do_cycle для них по очереди, то всё окажется на своих местах и каждый элемент будет считан/записан ровно один раз.

У него в оценке времени появляется GCD потому что do_cycle для цикла длины n производит дополнительно n-1 чтений-записей во временную переменную, ну и вот он утверждает, что если циклов -- GCD(a, b), то этих дополнительных moves будет как раз a + b - GCD(a, b) если я ничего не путаю, но вообще нам это совершенно неважно.

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: ХЗ как тут форматировать
[info]qwerty
2010-01-27 01:10 (ссылка)
А слабо обобщить на случай с != 0?

(Ответить) (Уровень выше)


(Читать комментарии) -