|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
17.10.2015, 14:25 | #11 | |||
Пользователь
Регистрация: 05.09.2015
Сообщений: 28
|
Цитата:
Цитата:
Цитата:
Идею я не уловил, т.к. 32 бита - это прямоугольник 8x4, но никак не квадрат. Скинь свой вариант, только для 64-х бит или для 36-и или для 25. Последний раз редактировалось Stilet; 17.10.2015 в 15:12. |
|||
17.10.2015, 15:12 | #12 | |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
Цитата:
|
|
17.10.2015, 15:15 | #13 | ||
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
Поэтому с высказыванием: Цитата:
I'm learning to live...
|
||
17.10.2015, 20:02 | #14 | |
Пользователь
Регистрация: 05.09.2015
Сообщений: 28
|
Цитата:
Первый: создаётся массив-словарь. Каждый раз при генерации какой-то пачки (размером от 0 до 320) состояний проверяется эта пачка. Не генерировалось ли каждое из её составляющих раньше. Если да, то такое состояние удаляется из пачки. Затем пачка уникальных для этого шага состояний добавляется к "рабочему набору". Получается лишний расход памяти, но этот "рабочий набор" нужен на случай, если в будущем с одним словарём будут работать несколько потоков программы. Каждый со своим "рабочим набором". Этот способ на данном этапе разработки работает примерно на 50% быстрее второго, на одном конкретном начальном состоянии и на небольшой глубине Второй: на каждой глубине генерируются все возможные состояния. Они по очереди добавляются в "рабочий массив", и после каждого добавления из этого "рабочего массива" удаляются дубликаты. Функция удаления дубликатов учитывает, что в начале массива элементы уже проверены на уникальность. Способ хорош тем, что не требует держать словарь, но не позволяет распараллелить процесс, т.к. большую часть времени работает функция удаления дубликатов. Этот способ догоняет по времени работы первый способ на большой глубине и на конкретном начальном состоянии. Код:
- конечная глубина не может быть больше начального количества включенных битов; - количество возможных "ходов" на каждой глубине сначала может возрастать (Но не может превысить 320. Почему - отдельная тема на другом форуме математиков), а потом обязательно уменьшается. Исключение симметричных состояний очень поможет второму варианту, т.к. размер массива, из которого придётся удалять дубликаты должен сократится. Но надо всё проверять. Этот раздел форума посвящён ассемблеру и я предлагаю тут обсуждать только сам ассемблер, то есть конкретную задачу из моих первых постов. С работой всей программы как-нибудь разберусь. Есть ещё и другие полностью рабочие способы решения, которые требуют минимум памяти но по времени проигрывают Суть задачи: как так не накладно избавится от лишних Код:
Последний раз редактировалось alcaedo; 17.10.2015 в 20:26. |
|
18.10.2015, 11:54 | #15 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
ОК.
основной принцип поднятия производительности - развертка циклов. поэтому есть предложение развернуть Код:
Код:
Последний раз редактировалось f.hump; 18.10.2015 в 12:22. |
18.10.2015, 21:51 | #16 |
Пользователь
Регистрация: 05.09.2015
Сообщений: 28
|
а можно пояснить смысл вот этого:
Код:
Дальше устанавливаются (в любом случае (всегда (при всяком раскладе))) биты во всех приёмниках. Какие именно - определяется начальным номером и тем, был установлен или сброшен бит с этим номере в источнике. Или тут не всё и надо додумать самому? |
18.10.2015, 22:02 | #17 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
это были мои мысли про
Код:
|
19.10.2015, 00:26 | #18 | |
Пользователь
Регистрация: 05.09.2015
Сообщений: 28
|
Тут подумал, учитывая вот это:
Цитата:
dv-dh-11.png или выключены dv-dh-00.png то есть, ведут себя как один бит. Тогда общее количество вариантов уменьшается до 128. Дальше: бит VH. Если DV и DH выключены, то VH может быть 0 или 1. Но если DV и DH включены, то VH только 1 dv-dh-vh-111.png Можно сократить количество вариантов ещё на четверть: 96. Ну и нулевой бит можно проверять только в начале функции (как и сделано в моей заготовке в первых постах). Остаётся 48 вариантов. Можно просто выставить вначале 47 проверок, ведущих на 47 меток. Вроде не такой уж большой текст по объёму. Отсюда вопрос к знатокам, является ли это: Код:
Можно ещё на некорректный aType проверить, но тогда будет 48 меток Ещё вроде бы симметрии V,H и VH могут существовать либо по одиночке, либо все вместе. Мне это не кажется таким-же очевидным, как с поворотными симметриями, но не удаётся раскрасить квадрат 16х16 в клеточку, чтобы он был симметричен только по двум из них, но не по третьей. Если всё так, то можно будет сократить количество вариантов ещё на 3/8, до 30 (29 меток, если без проверки на некорректность aType). Последний раз редактировалось alcaedo; 19.10.2015 в 01:29. |
|
20.10.2015, 01:14 | #19 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
вообще-то, если все так плохо, делается массив jump_targets/handlers индексированный aType
Код:
Код:
|
20.10.2015, 14:21 | #20 |
Пользователь
Регистрация: 05.09.2015
Сообщений: 28
|
Тут мне математики подсказали, что в моём случае будет всего 8 вариантов. То есть, достаточно семи CMP и семи JE. А про ваш вариант с jump_targets/handlers я подозревал, что что-то такое есть, но сам не в курсе. Можно подробнее или ссылку?
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Помогите с оптимизацией!!!((( | X@NDER | Фриланс | 2 | 30.10.2013 21:28 |
Проблема с оптимизацией | julia9311 | Microsoft Office Excel | 3 | 31.05.2013 02:36 |
Проблема с оптимизацией скрипта | Andrey[SF] | PHP | 1 | 19.05.2009 19:20 |
Нужна помощь с оптимизацией | t3ns0r | Общие вопросы C/C++ | 1 | 07.03.2009 14:58 |