Тема стара как мир. Как мир спортивного программирования.
Какие алгоритмы надо знать человеку (команде), чтобы иметь возможность решить наибольшее количество задач?
Хочу услышать Ваши мнения.
№ | Пользователь | Рейтинг |
---|---|---|
1 | tourist | 4009 |
2 | jiangly | 3823 |
3 | Benq | 3738 |
4 | Radewoosh | 3633 |
5 | jqdai0815 | 3620 |
6 | orzdevinwang | 3529 |
7 | ecnerwala | 3446 |
8 | Um_nik | 3396 |
9 | ksun48 | 3390 |
10 | gamegame | 3386 |
Страны | Города | Организации | Всё → |
№ | Пользователь | Вклад |
---|---|---|
1 | cry | 167 |
2 | Um_nik | 163 |
3 | maomao90 | 162 |
3 | atcoder_official | 162 |
5 | adamant | 159 |
6 | -is-this-fft- | 158 |
7 | awoo | 157 |
8 | TheScrasse | 154 |
9 | Dominater069 | 153 |
9 | nor | 153 |
Тема стара как мир. Как мир спортивного программирования.
Какие алгоритмы надо знать человеку (команде), чтобы иметь возможность решить наибольшее количество задач?
Хочу услышать Ваши мнения.
Название |
---|
Ты не знаешь алгоритм Быковой-Афанасьева-Делюкина.
Все алгоритмы знать невозможно.
Перечисли подмножество множества всех алгоритмов, которые ты считаешь необходимыми?
Это, конечно, шутка. Но близка к правде.
Алгоритмов много. Сайт e-maxx в этом плане хорош. Там мало совсем неприменимых алгоритмов.
Вообще можно просто развивать математический аппарат. Тогда понять алгоритмы будет легче, а некоторые даже самому придумать можно.
Я создал эту тему, чтобы получить список алгоритмов, даже последовательность, чтобы их изучать.
Это будет особенно полезно для новичков.
http://www.win.tue.nl/~wstomv/publications/ioi-syllabus-proposal.pdf
Вообще разработчики IOI Syllabus, по-моему, подошли к этому весьма оригинально.
Две ведущие ассоциации компьютерных профессионалов (ACM и IEEE) совместно выпустили аналогичный документ для ВЫПУСКНИКОВ ВУЗОВ. Он называется Computing Cirricula. Там по 5 специальностям. Одна из них - Software Engineering наиболее близка к олимпиадному программированию.
Так вот они просто ВЫЧЕРКНУЛИ кое-что из того, что должны знать студенты - а остальное школьники должны знать
Темы: 623
Сообщений: 5514
А это Российский теорминимум
(использовался при приеме в Летнюю Компьютерную Школу - 2007 )
1. Циклы
2. Массивы
3. Двухмерные массивы
4. Процедуры и функции
5. Работа с текстовыми файлами: ввод из файла, вывод в файл
6. Рекурсия
7. Алгоритм Евклида вычисления НОД двух чисел
8. Проверка: является ли данное число простым методом перебора делителей
9. Сортировка массива пузырьком
10. Сортировка подсчетом
11. Сортировка массива: быстрая сортировка
12. Сортировка массива: сортировка с помощью кучи
13. Структуры данных: списки, хранение списка в массиве
14. Очереди: хранение, операции добавления и извлечения элементов
15. Стеки: хранение, операции добавления и извлечения элементов
16. Деки
17. Обход в ширину, поиск кратчайших расстояний в невзвешенном графе
18. Обход в глубину
19. Выделение компонент связности
20. Выделение мостов, точек сочленения, компонент реберной и вершинной двусвязности
21. Топологическая сортировка
22. Топологическая сортировка за O(N)
23. Выделение компонент сильной связности, конденсация графа
24. Алгоритм Дейкстры
25. Алгоритм Штайна
26. Алгоритм Флойда
27. Алгоритм Форда-Беллмана
28. Алгоритм Прима
29. Алгоритм Краскала
30. Построение эйлерова цикла в графе
31. Длинное сложение, вычитание
32. Длинное умножение
33. Длинное деление и извлечение корня
34. Алгоритм Карацубы
35. Вычисление чисел Cnk.
36. Перебор всех подмножеств данного множества
37. Быстрый перебор подмножеств заданной мощности данного множества
38. Быстрая генерация i-ой в лексикографическом порядке перестановки из N элементов
39. Быстрая генерация i-ой в лексикографическом порядке правильной скобочной последовательности из N пар скобок
40. Скалярное, векторное, смешанное произведения векторов
41. Нахождение площади многоугольника
42. Расстояние от точки до прямой
43. Нахождение точки пересечения двух прямых
44. Проверка пересечения отрезков
45. Нахождение выпуклой оболочки
46. Динамическое программирование: задача о рюкзаке
47. Динамическое программирование: наибольшая возрастающая подпоследовательность
48. Динамическое программирование: общие принципы
49. Метод рекурсивного спуска
50. Польская инверсная запись, алгоритм построение по выражению
51. Конечные автоматы, регулярные выражения
52. Контекстно-свободные грамматики, проверка принадлежности слова КС-языку
53. Коды Хаффмана
54. Алгоритм Кнута-Морриса-Пратта
55. Бор. Алгоритм Ахо-Корасик
56. Ab-отсечение, перебор с возвратом
57. Функция Гранди
58. Бинарные деревья, хранение в массиве
59. AVL-деревья
60. RB-деревья
61. Декартовы деревья
62. Нахождение наименьшего общего предка в дереве
63. Алгоритм Джонсона
64. Построение гамильтонова цикла в графе
65. Построение максимального паросочетания в двудольном невзвешенном графе
66. Венгерский алгоритм решения задачи о назначениях
67. Поиск максимального потока
68. Матрицы: определитель, обратная матрица, матричное произведение
69. Метод Гаусса решения систем уравнений
70. Дискретное преобразование Фурье
71. Дерево интервалов и его реализация
72. Динамическое дерево Тарьяна-Слейтора
73. Хэш-таблицы
74. Системы непересекающихся множеств
75. Обобщенный алгоритм Евклида, решение диофантовых уравнений
76. Метод шифрования RSA
77. Суффиксное дерево. Алгоритм Укконена.
78. Суффиксный массив. Построение без суффиксного дерева
79. Преобразование Бэрроуза-Уилера
Курс лекций по олимпиадному
программированию Михаила Густокашина
(Тоже некий теорминимум)
http://g6prog.narod.ru/lessons.html
49. Метод рекурсивного спуска
50. Польская инверсная запись, алгоритм построение по выражению
51. Конечные автоматы, регулярные выражения
52. Контекстно-свободные грамматики, проверка принадлежности слова КС-языку
55. Бор. Алгоритм Ахо-Корасик
56. Ab-отсечение, перебор с возвратом
59. AVL-деревья
60. RB-деревья
61. Декартовы деревья
63. Алгоритм Джонсона
66. Венгерский алгоритм решения задачи о назначениях
67. Поиск максимального потока
72. Динамическое дерево Тарьяна-Слейтора
75. Обобщенный алгоритм Евклида, решение диофантовых уравнений
76. Метод шифрования RSA
77. Суффиксное дерево. Алгоритм Укконена.
79. Преобразование Бэрроуза-Уилера
Вот эти вещи я вообще не знаю
Требовать знание фурье кажется странным, равно как RSA, и уж точно Укконена. Кто-нибудь когда-нибудь на контесте писал Укконена?
67 и 75 - трудно поверить что вы ни разу не кодили задачу на макс поток и не решали уравнение вида ax+by=c в целых числах.
Также 50 тоже как-то любой должен знать.
56 - это перебор с отсечениями, думаю тоже не раз кодили, хоть и не называя его гордым словом альфа-бета.
В общем, трудно поверить что можно стать красным на топкодере не зная всего из этого списка :)
Про расширенного эвклида - все что я о нем знаю это то, что он копипастится с e-maxx :о) Наизусть я его не знаю, хотя и выводил как-то очень давно.
Остальные из списка я могу теоретически знать но не знать название. Скажем метод рекурсивоного спуска - я могу предположить, что так называется когда динамику пишут не циклом, а рекурсией с запоминанием. Что касается Ахо-Карасика, то на финале в 2008 я решил задачу какую-то на строки, которая оказалась нашей седьмой и принесла нам золото, и когда я рассказал свое решение какой-то команде, мне сказали, что это Бор и Ахо-Карасик. Так что видимо это такой алгоритм, который очевидным кажется когда рука натискана. Вообще строки можно чаще всего сдавать хешами.
Кстати, в списке нет 2-SAT. Нужный алгоритм на мой взгляд. Хотя на сборах в Ижевске Пономарев из перьми его вывел за контест, но потратил на это время. Лучше все же знать :о
Чтобы стать красным на топкодере надо знать очень мало. Там чаще задачи на то, чтобы извилинами пошевелить. Задачи на поток либо 1000 либо 600 - это уже о чем-то говорит :о) И за всю историю я только один раз видел задачу на фурье. Думаю, координаторы контестов там просят авторов не давать задачи на что-то специализированное. Иван Метельский вроде как там один из координаторов, он лучше знает. Правда не думаю, что он читает тут прямо все ветки, и заметит вопрос :о)
Задача на Фурье действительно один раз была, но она решалась также и алгоритмом Карацубы, причем это решение было авторским. Хотя в результате так ее решил вроде бы только Petr, а остальные достали Фурье из загашников (ну и еще Psyho вроде написал лобовое решение с ассемблерными вставками). Т.е. получилась полная ерунда, ну и фидбек по задаче был соответствующий - в стиле "одна из худших 1000-задач за все время на ТС". Так что это скорее такое исключение, которое подтверждает правило.
Иногда (но тоже редко) бывает, что задача использует какой-нибудь (относительно) малоизвестный факт. Например, в январе была задача, существенно основанная на том, что любой двудольный граф имеет реберную раскраску в кол-во цветов, равное его максимальной степени. Так что в принципе изучение сложных алгоритмов может помочь, если их детально изучать, с обоснованием, плюс если знать много разных сопутствующих фактов. Но это тоже, мне кажется, довольно редкая вещь.
А вот если все время решать 250 и 500 - можно стать таргетом.
Проблема не пройти интервью, проблема попасть на интервью :о) Для этого очень хорошо помогает резюме вида
Я бла бла бла
Закончил бла в короде бла
Achievements:
Золотая медаль чемпионата мира ACM ICPC 2008
Еще парочка бла бла
Ну и там автоматически попадаешь на интервью :о)
Такая же система работает с Facebook и Google :о) Но Microsoft - это кул, потому что штат Washington хоть и дождливый зимой, но невероятно красивый (see my blog). И Ванкувер рядом :о)
А с точки зрения работы как таковой мне кажется везде одно и тоже.
Наверное написать за O(n log n) с помощью полиномиальных хешей вам показалось несказанно сложно по сравнению с Уконеном? :о)
Полиномиальный хэш от строки S = s1s2...sn есть , где p и P - какие-то числа, обычно простые, причем p - маленькое большее размера алфавита, P - большое. Удобства - если посчитать такие хэши для всех префиксов S (это можно сделать за O(N)), то потом для каждой подстроки можно вычислить хэш за O(1) (как - додумаетесь сами:)).
Полиномиальный хэш от строки S=s_1s_2 ... s_n есть (\sum_{i=1}^{n}s_{i}p^{i}) mod P, где p и P - какие-то числа, обычно простые, причем p - маленькое большее размера алфавита, P - большое. Удобства - если посчитать такие хэши для всех префиксов S (это можно сделать за O(N)), то потом для каждой подстроки можно вычислить хэш за O(1) (как - додумаетесь сами:)).
В идеале считаешь в 32-ух/64-ех битных числах, доверяя просто их переполнению. Потому что использование модуля (которые видимо меньше чем maxInt / p) повышает заметно шансы на коллизию
Я не помню тока что в ява происходит при переполнении - не выбрасывает ли она исключения.
Насчет явы не наю - я там даже быстрее чем scanf считывать не умею...
http://en.wikipedia.org/wiki/Binary_GCD_algorithm
В самой статье говорится, что второе название этого алгоритма "Stein's algorithm" Вроде совпадает.
Судя по полуфиналу этого года в геометрию ещё можно добавить центр масс пространственного тела. :o)
В любом случае спасибо большое за адекватный список.
Слышал, что на соревновании можно пользоваться бумажными материалами, действительно ли это так? 8)
На полуфинале ничгео нельзя брать с собой.
В 2010 я не видел печатных материалов ни у кого на столе на финале, есть подозрение, что убрали это дело.
В любом случае, мы на финале в приготовленную папку заглянули один раз - ручку взять :о)
Задачи, насколько я помню все финалы которые прорешивал, не требуют каких-то экстраординарных знаний обычно.