понедельник, 18 февраля 2008
Задачка на подумать, сроки совсем не жмут.)


В общем, всё бы было хорошо, но меня смущают ограничения по времени. Как сделать это со сложностью куб я знаю, причём где-то тремя способами, но куб от 1500 - это многовато для четырёх секунд...
@темы:
Олимпиадные задачи
а вообще задачка элементарная^^
а вообще, это не высшая математика^^ это же программирование в чистом виде^^
За куб - задачка элементарная.)
А не через массивы ты как предлагаешь?
или их можно не хранить?
В общем, дан граф, нам нужно найти все циклы длиной три. Тут или несколько раз поиск вширину /сложность - куб/, или перемножение матриц /сложность - куб/, или тупой перебор /сложность та же/. Я чего-то упустил?
а как вы предполагаете узнавать потом где плюсик а где минус? Заново читать каждый раз?
Это хорошо еще если вы сумеете организовать произвольный доступ к файлу...
Ёлупень Надо сделать как-то сложность квадрат (мне так кажется)
Используя то, что для города А плюсики можно рассматривать как возможность вылета в В и сразу же как возможность возвращения из С...
N = n*(n-1)*(2n-4)/12 {N-количество маршрутов, n - количество городов}. Теперь задача вычеслить сколько треугольников разорванно, я так понял для нужд программирования желательно считать каждую строчку единожды, при этом не запоминать ее.
Значит, считываем первую строку. Вычисляем N.
Считываем количество минусов во второй строке, пропуская c 1 по j символ. Вычисляем сколько треугольников разорвалось:
R=k(n-a-2)-(k(k+1)-2)/2 {k - количество минусов, a - количество уже считанных строк, пока 0}. Заносим в некую базу данных номер строки i и номер символа j, если есть разрыв.
Считываем количество минусов в третьей строке, пропуская c 1 по j (a+1) символ. Вычисляем сколько треугольников разорвалось:
R=k(n-a-2)-(k(k+1)-2)/2 {k - количество минусов, a - количество уже считанных строк}. Заносим в некую базу данных номер строки i и номер символа j, где есть разрыв (только один раз каждое число). Если новые данные не содержаться в базе данных разрывов то ничего не делаем, если наоборот от R отнимаем 1 (для каждого разрыва отдельно, уже содержашегося в базе данных).
Так считываем всю "матрицу". В конце N-R=Искомое число маршрутов.
Жду дополнений и баг фиксов.
"Сложность" в данном случае — количество вложенных циклов, то есть количество проходов по файлу.
Для трех вложенных циклов как раз получается сложность n3
У Вас, насколько я понимаю, сложность не выше квадрата. Это замечательно!
Только я сами действия понимаю не очень...
Значит, считываем первую строку. Вычисляем N.Считываем количество минусов во второй строке, пропуская c 1 по j символ.
Почему надо пропускать и что такое j?
А вообще — супер-красота!!!
Но, блин, это мегакрасиво.))) Обязательно попытаюсь это запрограммить.)
Поклон до земли.)
Какой поиск? Ты про сравнение с базой разорванных треугольников? Элементов в матрице n^2, а поиск-сравнение идет по n.
Я так и не понял как считать сложность.... Если сложность - это функция отношения операций алгоритма к числу элеменов в матрице, то она линейная, если к числу городов, то квадратная.
P.S.
Я многих своих мыслей не написал, как все-таки пришел к этому алгоритму... просто хотел сказать, что при считывании каждой строчки мы избавляемся от одного измерения симплекса. А чтобы не вычеркнуть лишнее, надо сраниваться с базой данных.
для программиста со сложностью вопросов вообще нет: сколько уровней вложенности циклов, — такова и сложность.
Потому что компьютерная память и выполнение программ устроены таким образом, что два вложенных цикла: поэлементный проход по строкам матрицы: i=1..n, j=1..n происходит гораздо дольше, чем если бы мы вытянули ЭТУ ЖЕ матрицу в одну строку и запустили один цикл: i=1..n2.
"Гораздо" — как раз и имеется в виду "на порядок".
Ёлупень Но, блин, это мегакрасиво.))) Обязательно попытаюсь это запрограммить.)
На чем писать будете?
Здорово с картинкой сделать!
Ага, но у меня в алгоритме другая ситуация. Я попытался минимизировать расход оперативной памяти, чтобы считывалась одна строка в момент времени. Но я могу запросто распаралелить эти два цикла, вложенный можно вытащить из внешнего так, как он не мешает считать следующую формулу. В таком случае какая будет сложность?
мне так на пальцах тяжело мыслить ))
длинные ментальные конструкции меня расстраивают...
вот есди б это написать...
Я так понимаю, что в принципе это уже вопрос реализации. Если все циклы выполняются линейно, то есть строго друг за другом, тогда и сложность линейная...
Но что-то мне кажется, что для матрицы алгоритм от этого усложнится....
а память экономить, мне кажется, здесь не надо...
Заносим в некую базу данных номер строки i и номер символа j, если есть разрыв.
вот для этого всё равно придется массив создавать...
при этом этот массив тоже надо проходить многократно...
тут всё-таки надо более детально смотреть...