|
|
|
Канал Игры Мечты: «Алгоритмы - кирпичики Игры Мечты» |
|
|
Krom
455 EGP
   Рейтинг канала: 1(3) Репутация: 159 Сообщения: 1988 Откуда: Горы Урала Зарегистрирован: 19.07.2005
 |
|
"- А кто этот молодой юноша? Он тоже генеральный инспектор? Эзра, - Костя повернулся к голубоглазому, - пусть Владимир Сергеевич держит ось, а мальчику ты дай чем-нибудь полезно поиграть. Лучше всего поставь его к своему экрану, пусть он посмотрит, как большие дяди делают бах." ("Стажёры", А. и Б. Стругацкие.)
Даже самые великие свершения начинаются с малого. Предлагаю полезно поиграться, с прицелом на делание в будущем "бах". Может быть, даже в виде Игры Мечты.
Вот, например, простенькая задачка:
1) Имеется практика продажи билетов на городской и пригородный транспорт. Билеты имеют серийный номер из шести цифр. Счастливым называется билет, у которого сумма цифр первой триады совпадает с суммой цифр второй триады. Сколько существует билетов со счастливыми номерами? Ответ привести в виде алгоритма, результатом работы которого было бы искомое число. Алгоритм должен работать менее двух секунд на машинах класса х486.
_________________ Не спешите меня. |
|
|
AlexD
383 EGP
  Рейтинг канала: 2(10) Репутация: 82 Сообщения: 1084 Откуда: Тюмень, Россия Зарегистрирован: 25.04.2003
 |
|
Прикольно. Сразу школу вспомнил, это была первая задачка, на которой меня поймал мой учитель информатики. Вторая была про поиск минимального элемента в массиве.
_________________ тетрагидрометаноптерина макарена
метилентетрагидрофолата макарена
ЭЭЭЭЭ МАКАРЕНА |
|
|
Krom
455 EGP
   Рейтинг канала: 1(3) Репутация: 159 Сообщения: 1988 Откуда: Горы Урала Зарегистрирован: 19.07.2005
 |
|
AlexD:
Напиши ту задачку, если она такая же простенькая. Потом и посложнее возьмём, например, АСМ-ные.
_________________ Не спешите меня. |
|
|
AlexD
383 EGP
  Рейтинг канала: 2(10) Репутация: 82 Сообщения: 1084 Откуда: Тюмень, Россия Зарегистрирован: 25.04.2003
 |
|
Там суть подлова была не в сложности задачи, а в реализации алгоритма. Вернее сначала была задача про поиск максимального элемента. Я ему тогда сказал: "Берем переменную, делаем ее нулем, а потом перебираем массив, если число в массиве больше переменной, то запоминаем и идем дальше..." А он мне и говорит, а если надо найти минимальный, то какой значение первым поставим в переменную? Самое большое? А это какое? Максимальное которое влезает в байт (если массив из байтов)? А если числа в массиве будут отрицательные числа?
И вот тут я "подвис"... И вправду, а какое значение ставить стартовое???
_________________ тетрагидрометаноптерина макарена
метилентетрагидрофолата макарена
ЭЭЭЭЭ МАКАРЕНА |
|
|
Krom
455 EGP
   Рейтинг канала: 1(3) Репутация: 159 Сообщения: 1988 Откуда: Горы Урала Зарегистрирован: 19.07.2005
 |
|
Да, сложный вопрос!
Нам повеселее задачку дали: максимальное надо было выбирать из окна в десять тысяч элементов в миллионном массиве, причём на каждом шаге окно сдвигалось на один элемент. Давалось пять секунд времени.
_________________ Не спешите меня. |
|
|
AlexD
383 EGP
  Рейтинг канала: 2(10) Репутация: 82 Сообщения: 1084 Откуда: Тюмень, Россия Зарегистрирован: 25.04.2003
 |
|
Кышмар! Это на каких пентиумах? Не-е-е, мы тогда на своих 386х только в Lotus гоняли или в Vorona... да DOS изучали... А програмили мы в основном дома на Z80, на асме... Пытались даже что-то вроде сетевой Элиты сделать... через порт принтера...
_________________ тетрагидрометаноптерина макарена
метилентетрагидрофолата макарена
ЭЭЭЭЭ МАКАРЕНА |
|
|
Shirson
1605 EGP
           Рейтинг канала: 7(626) Репутация: 219 Сообщения: 16511 Откуда: 79°W 44°N Зарегистрирован: 29.01.2002
 |
|
AlexD : |
И вот тут я "подвис"... И вправду, а какое значение ставить стартовое???
|
Первый элемент массива, вестимо. В задаче с максимальным числом - тоже самое.
_________________ У меня бисера не доxеpа. |
|
|
Shirson
1605 EGP
           Рейтинг канала: 7(626) Репутация: 219 Сообщения: 16511 Откуда: 79°W 44°N Зарегистрирован: 29.01.2002
 |
|
Krom : |
Да, сложный вопрос!
Нам повеселее задачку дали: максимальное надо было выбирать из окна в десять тысяч элементов в миллионном массиве, причём на каждом шаге окно сдвигалось на один элемент. Давалось пять секунд времени.
|
На каждом шаге чего? Цикла перебора окна или как?
_________________ У меня бисера не доxеpа. |
|
|
Krom
455 EGP
   Рейтинг канала: 1(3) Репутация: 159 Сообщения: 1988 Откуда: Горы Урала Зарегистрирован: 19.07.2005
 |
|
Тогда и эту задачку напишу.
2) Вот почти точная копия той самой задачки
_________________ Не спешите меня. |
|
|
Damien
|
|
AlexD : |
Вторая была про поиск минимального элемента в массиве.
|
Отсортировать массив по возростанию/убыванию и выбрать первый жлемент! Быстрые алгоритмы сортировки науке известны.
Krom : |
я билет, у которого сумма цифр первой триады совпадает с суммой цифр второй триады.
|
Первый напрашивающийся ответ, естественно - цикл с миллионом итераций. Что-то мне подсказывает, что не этого от меня ожидают. Посему я начал размышлять.
Сперва я подумал, что однозначно подходят числа, где вторая триада = первой. Таких чисел ровно 1000. Ну хорошо. Потом мне подумалось, что сюда-же подходят все пермутации первой триады. Ну да ладно. В любом справочнике по комбинаторике будет формула подсчета числа пермутаций. И что дальше?
Короче, в итоге мне придумался такой вот алгоритм, к комбинаторке не имеющий никакого отношения.
Производим цикл с тысячей итераций. На каждой итерации производим вложенный цикл из десяти итераций. Внутри цикла вычисляем значение переменной дельта=первая цыфра числа-счетчик цикла. После чего производим еще один вложенный цикл снова из десяти итераций, где выполняем следующие действия: дельта += вторая цифра числа-счетчик этого цикла. Ну и в итоге если третья цифра числа - дельта находится в пределах 0..9 то увеличить счетчик результата на один
В итоге я так посчитал, получается всего 1000х10х10 = 100 000 итераций цикла. Прирост производительности в 10 раз. Меньше, чем я ожидал Но тем не менее. Щас попробую реализовать этот алгоритм на Питоне, посмотрим как он работает...
|
|
|
Dark Archon
231 EGP
   Репутация: 56 Сообщения: 389 Откуда: Moscow Federation Зарегистрирован: 27.05.2004
 |
|
Почитал задачу (довольно мутно изложенную), проанализировал сэмпл и пришел к такому выводу: sequence делится на subsequences по М (первое число), причем каждый следующий subsequence сдвигается относительно предыдущего не на М а всего на 1. Это имелось в виду?
Damien : |
AlexD : |
Вторая была про поиск минимального элемента в массиве.
|
Отсортировать массив по возростанию/убыванию и выбрать первый жлемент! Быстрые алгоритмы сортировки науке известны.
|
Шутку понял... смешно... (ц) Гоблин.
По твоему O(N*logn(N)) быстрее чем O(N)?
Damien : |
Производим цикл с тысячей итераций. На каждой итерации производим вложенный цикл из десяти ...... В итоге я так посчитал, получается всего 1000х10х10 = 100 000 итераций цикла.
|
Зачем делать 100000 итераций, когда можно сделать их 1000, а дальше воспользоваться формулами комбинаторики? Правда понадобится вспомогательный массив размером 9+9+9=27 байт. (Последнее предложение считать подсказкой ).
Если подумать, то возможно можно и проще, но мне думать лень после тяжелой рабочей недели.
_________________ o
_/0\_
< > КУ! |
|
|
Shirson
1605 EGP
           Рейтинг канала: 7(626) Репутация: 219 Сообщения: 16511 Откуда: 79°W 44°N Зарегистрирован: 29.01.2002
 |
|
Damien : |
Отсортировать массив по возростанию/убыванию и выбрать первый жлемент! Быстрые алгоритмы сортировки науке известны.
|
Это называется надев лыжи и стоя в гамаке
Простой перебор массива даёт более быстрый и менее хлопотный результат, чем сортировка массива.
_________________ У меня бисера не доxеpа. |
|
|
Krom
455 EGP
   Рейтинг канала: 1(3) Репутация: 159 Сообщения: 1988 Откуда: Горы Урала Зарегистрирован: 19.07.2005
 |
|
Думаю, что Dark Archon'у за первую задачку можно поставить "зачёт", хотя намёки на решение ещё не есть решение И комбинаторные алгоритмы там вообще-то не используются Но это уже спойлер.
Шутка насчёт сортировки навела на мысль - завтра попробую рассказать, как определять временные затраты алгоритма (или, как говорят, его сложность О() )
Насчёт второй задачки кто-нибудь что-нибудь придумал?
_________________ Не спешите меня. |
|
|
Shirson
1605 EGP
           Рейтинг канала: 7(626) Репутация: 219 Сообщения: 16511 Откуда: 79°W 44°N Зарегистрирован: 29.01.2002
 |
|
А тут чего-то в голове мелькнуло...
Код: |
Делать выборку в первом срезе окна, на предмет наибольшего числа. (НЧ)
Запоминать само число И его индекс.
При сдвиге проверять, вышло ли указанное число из выборки (индекс есть)
НЕТ - проверять пришедшее число на предмет его большести НЧ.
НЕТ - гоу ту сдвиг.
ДА - Запоминать пришедшее число как НЧ
ДА - Делать выборку НЧ перебором. ГоуТу сдвиг. |
Сыро, впринципе. Надо подумать, как исключить переборы, при выходе НЧ из выборки. Может "прогноз" хранить, на несколько чисел, меньших НЧ по убыванию.
_________________ У меня бисера не доxеpа. |
|
|
Krom
455 EGP
   Рейтинг канала: 1(3) Репутация: 159 Сообщения: 1988 Откуда: Горы Урала Зарегистрирован: 19.07.2005
 |
|
Shirson:
Тепло!
_________________ Не спешите меня. |
|
|
Shirson
1605 EGP
           Рейтинг канала: 7(626) Репутация: 219 Сообщения: 16511 Откуда: 79°W 44°N Зарегистрирован: 29.01.2002
 |
|
Ладно, может еще чего в голове мелькнёт
_________________ У меня бисера не доxеpа. |
|
|
Krom
455 EGP
   Рейтинг канала: 1(3) Репутация: 159 Сообщения: 1988 Откуда: Горы Урала Зарегистрирован: 19.07.2005
 |
|
А вот ещё задачка на предсказание(для понимания некоторых особенностей ИИ):
Над алфавитом (a,b) действуют следующие правила:
1) bXbY => XYbb
2) XabYbZ => XbYabaZ, X,Y,Z - п.п.ф.
правильно построенной формулой (п.п.ф.) будем считать любое, возможно пустое, слово. Например, aabba, baba, bbbbb суть п.п.ф. исчисления.
Аксиомой исчисления является слово abb;
Выводима ли в данном исчислении формула aa...abb [(a^14)bb]? На раздумья одна минута. (Но не больше двух! )
_________________ Не спешите меня. |
|
|
Dark Archon
231 EGP
   Репутация: 56 Сообщения: 389 Откуда: Moscow Federation Зарегистрирован: 27.05.2004
 |
|
Значит вторую задачу я понял правильно.
Shirson, грамотный алгоритм. Это первое что приходит в голову. Во всяком случае в мою пришло тоже.
Возиться с сохранением НЧ (наибольшего числа) по убыванию - не стоит. Это надо будет сохранять сортированный массив и соблюдать сортировку при добавлении/выбрасывании числа из него. Это только увеличит сложность алгоритма. Кроме того, не надо забывать что данные даются не в качестве массива, а потоком , т.е. для повторного прохода, в целях нахождения нового НЧ, нужно будет сохранять текущее окно потока.
У меня другая мысля булькнула в вареных мозгах:
Что мешает вести вместо одного НЧ - М таких НЧ, по одному на каждый "срез окна", пересекающихся и соответственно проверяемых одновременно? В таком случае не надо будет ни сохранять значения измерений из потока, ни чего либо сортировать. Каждое значение будет взято единожды, но сравнено с М числами. Сложность получается O(N*M), когда worst, best и optimal case равны.
Н счет алфавита: a^14 - это что? "a" вроде буква алфавита, а не переменная/неизвестное, что в таком случае значит возведение буквы в степень? Или я чего не догнал?
_________________ o
_/0\_
< > КУ! |
|
|
Krom
455 EGP
   Рейтинг канала: 1(3) Репутация: 159 Сообщения: 1988 Откуда: Горы Урала Зарегистрирован: 19.07.2005
 |
|
Dark Archon:
Уточни, пожалуйста, насчёт множества НЧ и пересекающихся окон, я что-то не совсем вник.
А "возведение в степень" - это просто упрощение записи, указание того, сколько букв а в том ряду.
_________________ Не спешите меня. |
|
|
Krom
455 EGP
   Рейтинг канала: 1(3) Репутация: 159 Сообщения: 1988 Откуда: Горы Урала Зарегистрирован: 19.07.2005
 |
|
Статья про определение сложности алгоритма.
Если читать лень, то вкратце: сложность алгоритма определяется количеством его обращений к(или операций над) исходным данным, либо данным, построенным из исходных. Например, поиск минимального элемента массива требует проверки каждого элемента массива один раз - это означает сложность О(n), где n - число элементов массива. Метод сортировки "пузырёк" сравнивает все элементы сортируемого массива попарно, а так как пар элементов в массиве длины n будет n^2, то и сложность алгоритма равна O(n^2). Некоторые особо сложные задачи имеют решения в виде алгоритмов со сложностью не меньше O(n^3*log n), обычно это означает немалую нагрузку на процессор. Рабоче-крестьянские решения задач часто приводят к сложности вида O(2^n), что уже не лезет ни в какие ворота.
Если программа имеет участки различной сложности, то общей сложностью будет максимальная из сложностей участков. Например, если по задаче нужно выбрать минимальный элемент массива (сложность участка О(n)), а затем отсортировать элементы слева от него по возрастанию методом "пузырька" (сложность участка О(n^2)), то суммарная сложность алгоритма будет О(n^2).
Очевидно, что чем сложнее алгоритм, тем больше будут временные затраты на его работу. Более того, тем быстрее растут временные затраты с ростом количества входных данных. И если количество входных данных в общем случае уменьшить нельзя, то сложность программы, а значит и нагрузку на процессор, можно уменьшить, выбрав более эффективный алгоритм.
_________________ Не спешите меня. |
|
|
|
|
|
Канал Игры Мечты: «Алгоритмы - кирпичики Игры Мечты» |
|