о разных алгоритмах
Mar. 16th, 2008 12:51 am(интересно будет только программистам)
1. Неплохое описание схемы работы с большими массивами без инициализации, при том, что в них может лежать мусор. Это красивый трюк, и изредка действительно полезный; я додумался до него сам как-то в процессе решения какой-то задачи в университете (подробностей не помню, может, задача именно так и была сформулирована), но ни разу не применял его на практике.
2. Я зашел на Project Euler впервые после долгого перерыва, и решил две последние задачки. Получил огромное удовольствие, хоть и написал решения на C не вполне понятно почему. В одной из них мне пригодился фокус из HAKMEM (перебор всех способов выбрать k элементов из n, с помощью битмаски), а в другой - disjoint-set, которым я тоже не пользовался очень давно.
Вообще disjoint-set - волшебно красивая штука. Я помню, что у меня затаило дыхание, когда я впервые увидел. Это алгоритм из Книги, поистине.
3. В связи с одной из задач наткнулся на страничку про MiniSat. Я не знал, что есть соревнования по решению SAT! Хочется найти время и почитать этот, вроде бы относительно простой и тем не менее эффективный, алгоритм. Исходники там есть.
4. Я тут узнал, что не все знают о Project Euler. Друзья, если вы получаете удовольствие от программирования, вам прямая дорога туда. Почти в каждой задаче там надо придумать способ ее решить, который даст ответ достаточно быстро - но суть не в бездумных оптимизациях, а в алгоритмах и структурах данных. Это, может, звучит сухо, но на деле невероятно увлекательно; а еще - умный ход - когда правильно решаешь задачу, получаешь доступ на тему на форуме, где уже решившие обсуждают свои решения и делятся кодом.
1. Неплохое описание схемы работы с большими массивами без инициализации, при том, что в них может лежать мусор. Это красивый трюк, и изредка действительно полезный; я додумался до него сам как-то в процессе решения какой-то задачи в университете (подробностей не помню, может, задача именно так и была сформулирована), но ни разу не применял его на практике.
2. Я зашел на Project Euler впервые после долгого перерыва, и решил две последние задачки. Получил огромное удовольствие, хоть и написал решения на C не вполне понятно почему. В одной из них мне пригодился фокус из HAKMEM (перебор всех способов выбрать k элементов из n, с помощью битмаски), а в другой - disjoint-set, которым я тоже не пользовался очень давно.
Вообще disjoint-set - волшебно красивая штука. Я помню, что у меня затаило дыхание, когда я впервые увидел. Это алгоритм из Книги, поистине.
3. В связи с одной из задач наткнулся на страничку про MiniSat. Я не знал, что есть соревнования по решению SAT! Хочется найти время и почитать этот, вроде бы относительно простой и тем не менее эффективный, алгоритм. Исходники там есть.
4. Я тут узнал, что не все знают о Project Euler. Друзья, если вы получаете удовольствие от программирования, вам прямая дорога туда. Почти в каждой задаче там надо придумать способ ее решить, который даст ответ достаточно быстро - но суть не в бездумных оптимизациях, а в алгоритмах и структурах данных. Это, может, звучит сухо, но на деле невероятно увлекательно; а еще - умный ход - когда правильно решаешь задачу, получаешь доступ на тему на форуме, где уже решившие обсуждают свои решения и делятся кодом.
no subject
Date: 2008-03-16 01:39 am (UTC)no subject
Date: 2008-03-16 03:48 am (UTC)no subject
Date: 2008-03-16 04:52 am (UTC)2. Сколько-то лет назад я был горд собой, когда существенно сократил время работы программы, реализовав компрессию при поиске в структуре, аналогичной disjoint set, но что у нее есть умное название, узнал только сегодня. :(
no subject
Date: 2008-03-16 06:17 am (UTC)Я этот алгоритм узнал из "Дисциплины программирования" Дейкстры; там он приписан Мартину Рему. Странно, что в Вики об этом не упомянуто.
no subject
Date: 2008-03-16 07:19 am (UTC)no subject
Date: 2008-03-16 07:23 am (UTC)...
for (int i = 0; i < N; i++) P[i] = i;
...
int get(int i) {
if (P[i] == i) return i;
else return get(P[i]);
}
void unite(int i, int j) {
if (rand() % 2 == 0) P[get(i)] = get(j);
else P[get(j)] = get(i);
}
Конечно, тут вместо эвристики с рангами случайная балансировка, но для целей подобных Project Euler этого более чем достаточно.
no subject
Date: 2008-03-16 07:25 am (UTC)no subject
Date: 2008-03-16 07:30 am (UTC)no subject
Date: 2008-03-16 07:55 am (UTC)no subject
Date: 2008-03-16 08:46 am (UTC)no subject
Date: 2008-03-16 10:25 am (UTC)no subject
Date: 2008-03-16 10:59 am (UTC)Может, описан слегка по-другому, но ключевые идеи все те же.
no subject
Date: 2008-03-16 11:33 am (UTC)Я бы порекомендовал spoj.pl (http://www.spoj.pl/), их там больше, они интереснее и сложнее + есть задачки challenge, в которых нужно написать самое быстрое или самое короткое решение. :)
Что до SAT -- в лаборатории в ПОМИ, где я учился рядом стояли кубки за лучшую реализацию SAT-решателя из за самую короткую SAT-задачу, которую никому не удалось решить. Собственно,
no subject
Date: 2008-03-16 11:37 am (UTC)no subject
Date: 2008-03-16 12:55 pm (UTC)no subject
Date: 2008-03-16 01:12 pm (UTC)Не очень удачный выбор термина, это пример definitio per idem (тождесловия). Выше дано определение как "классы эквивалентности" -- по-моему, то, что надо.
no subject
Date: 2008-03-16 02:05 pm (UTC)no subject
Date: 2008-03-16 02:13 pm (UTC)no subject
Date: 2008-03-16 04:53 pm (UTC)MiniSAT
Date: 2008-03-16 11:20 pm (UTC)iz.
no subject
Date: 2008-03-17 01:15 am (UTC)no subject
Date: 2008-03-17 12:09 pm (UTC)no subject
Date: 2008-03-17 12:10 pm (UTC)no subject
Date: 2008-03-17 12:10 pm (UTC)no subject
Date: 2008-03-17 12:10 pm (UTC)no subject
Date: 2008-03-17 12:31 pm (UTC)no subject
Date: 2008-03-17 01:01 pm (UTC)Re: MiniSAT
Date: 2008-03-17 01:57 pm (UTC)Re: MiniSAT
Date: 2008-03-17 02:17 pm (UTC)Re: MiniSAT
Date: 2008-03-17 06:47 pm (UTC)it's better to ask her, of course
webpage:
http://www.inf.unisi.ch/faculty/sharygina/
there are even some tools for such debugging on the webpage...
iz.
Re: MiniSAT
Date: 2008-03-17 07:16 pm (UTC)no subject
Date: 2008-03-17 11:07 pm (UTC)no subject
Date: 2008-03-17 11:08 pm (UTC)no subject
Date: 2008-03-27 10:28 pm (UTC)no subject
Date: 2008-03-27 10:35 pm (UTC)вновь баланс versatility vs. speed
no subject
Date: 2008-03-27 10:40 pm (UTC)там как бы и отмечено, в целях проекта, что math [should be presented] as an entertaining subject.
no subject
Date: 2008-03-27 10:43 pm (UTC)no subject
Date: 2008-03-27 10:44 pm (UTC)no subject
Date: 2008-03-27 11:55 pm (UTC)На счёт интересности -- для многих задач соглашусь, но есть там и тупая техника или применение готовой формулы. Если не знать, как строится рациональное приближение, или как решается уравнение Пелля или простую формулу для мат. ожидания количества бросков кубика прежде чем выпадут все грани, то придумать это самому почти невозможно. В результате, решение задачи сводится к упражнению по поиску в википедии.
no subject
Date: 2008-03-28 10:43 am (UTC)Спасибо огромное за ссылку на Project Euler.
Только вот вошёл во вкус, что-то у них там стряслось и сайт остановили. К сожалению.
no subject
Date: 2008-04-15 07:05 pm (UTC)Расскажите пожалуйста, как решить задачу на перле с шестью непробельными символами :-)
no subject
Date: 2008-04-15 07:12 pm (UTC)no subject
Date: 2008-04-15 07:17 pm (UTC)no subject
Date: 2008-04-15 08:57 pm (UTC)Мда, надо наконец дорешать Эйлера. 50 задач всего осталось. :-)
За 6 непробельных символов я не умею. У меня лучшее решение получилось с 11-ю, что ли. Да и вообще, я не специалист по перлу и по подобного рода задачам. :-)
no subject
Date: 2008-04-15 09:08 pm (UTC)Задача такая (номер не помню). Есть кубик (dice, а не cube) c n сторонами. Каково матожидание количества бросков, после которых выпадут все его стороны?
Ещё была какая-то задача в которой в ответе фигурировала рекурентная последовательность x(n) = x(n-1) + x(n-2) - x(n-3) - x(n-4) + x(n-5) + x(n-6) - ... В упор не помню, что это была за задача, но по-моему, там эту формулу тоже придумать не зная почти не возможно.