O-нотация - это всего лишь оценка функции сверху. Если среднее время работы avg_time = f(n) = const, то формально avg_time = O(1). Где здесь манипуляция?
В таком случае хеш-таблицы вам тоже должны не нравиться: там время вставки O(1) — это именно среднее время, а не оценка в худшем случае.
Рандом вообще не причем тут, они ведь уже перемешаны по условию
Где такое можно прочитать?)
Наоборот, если мы говорим про олимпиадное программирование, где все тесты запускаются независимо, то опытные составители обязательно подсунут вам тесты, на которых без рандома все будет работать медленно.
Мы точно решаем или неточно.
Мне кажется, вы путаете два разных понятия: приближенные и рандомизированные алгоритмы. Первые - выдают ответ с определенной погрешностью. Вторые - просто используют внутри себя рандом (как например quick sort).
Если массив на вход подается случайный, то метод random ничего нового не привносит. Разумеется, он только замедлит. Однако, на плохих входах будет деградация до O(N).
Да я уже нашел ошибку в статье, так что этот вопрос уже закрыт.
Благодарю вас за проделанную работу. Однако, ни на одну фактическую ошибку вы так и не указали, зато сообщили всем вокруг, что не смогли ничего понять.
Убедительно прошу прекратить вас спамить и замусоривать комментарии.
Имея на руках две реализации можем посмотреть как они себя поведут в бенчмарке (Length - кратное увеличение размера строки, чтобы смотреть как ведет себя реализация на больших данных)
Из статьи не совсем ясно, что такое "большие данные". Нет ни слова о том, как вы их на самом деле генерируете, а это может существенно влиять на бенчмарки.
Если я верно понял, вы просто много раз повторяете исходную строку? В таком случае, это не совсем честный бенчмарк, т.к. максимум достигается почти сразу (на первом же вхождении исходной строки в длинную). Интереснее было бы посмотреть на тест, в котором максимум постоянно растет.
О багах знаю, нашел сильно после выхода статьи, исправлять не стал так как из головы уже всё выветрилось, а заново изучать код, быстро вникать в тему - я не способен. Поэтому просто не стал трогать.
Получается, если я захочу воспроизвести ваши результаты на своем компьютере и измерить время работы у себя, у меня не получится это сделать? В чем смысл тогда вообще код приводить, если вы знаете, что он работать не будет?
Сниппет — это блок с краткой информацией о странице сайта, содержащий ссылку на документ, который отображается в результатах поиска.
Сниппет - это просто англицизм от англ. snippet - фрагмент, отрывок. Тем более, смысл был из контекста понятен.
Браво! А теперь замените черепаху на синюю клетку и получится дословно алгоритм из статьи.
Создать список синих клеток (все свободные клетки лабиринта)
Цикл - пока список синих клеток не пуст
Рассчитать путь для синей клетки до выхода
Записать в результирующий список команд
Передвинуть все синие клетки из списка по маршруту из п.3 производя слияние элементов списка при совпадении клеток или удаляя из списка тех, что вышли из лабиринта
мне не требуется Дейкстра чтобы найти выход, информация о том как именно выйти строится во время обхода.
Да нет никакой разницы как вы его найдете, хоть dfs запустите. Речь же не о том. Задача стояла "придумайте алгоритм, который выпишет конечную последовательность". Это теоретическая задача, а не контест. Здесь никаких ограничений по времени и памяти нет у вас нет.
O-нотация - это всего лишь оценка функции сверху. Если среднее время работы avg_time = f(n) = const, то формально avg_time = O(1). Где здесь манипуляция?
В таком случае хеш-таблицы вам тоже должны не нравиться: там время вставки O(1) — это именно среднее время, а не оценка в худшем случае.
Спасибо за комментарий и ссылки на теоремы!
Где такое можно прочитать?)
Наоборот, если мы говорим про олимпиадное программирование, где все тесты запускаются независимо, то опытные составители обязательно подсунут вам тесты, на которых без рандома все будет работать медленно.
Мне кажется, вы путаете два разных понятия: приближенные и рандомизированные алгоритмы. Первые - выдают ответ с определенной погрешностью. Вторые - просто используют внутри себя рандом (как например quick sort).
Шикарное решение, спасибо!
Да, именно так :)
Решение авторов именно такое.
O(1) по памяти, а не по времени.
Если массив на вход подается случайный, то метод
randomничего нового не привносит. Разумеется, он только замедлит. Однако, на плохих входах будет деградация до O(N).Если массив был случайно перемешан, да. Однако, если нам назло подсунули плохой массив, будет O(n), например:
Решение за O(1) по памяти без рандома здесь: https://youtu.be/B-1h5xEjBvk?si=RVxUnYKOJnnx-wZK&t=791
Благодарю вас за проделанную работу. Однако, ни на одну фактическую ошибку вы так и не указали, зато сообщили всем вокруг, что не смогли ничего понять.
Убедительно прошу прекратить вас спамить и замусоривать комментарии.
Спасибо!
Из статьи не совсем ясно, что такое "большие данные". Нет ни слова о том, как вы их на самом деле генерируете, а это может существенно влиять на бенчмарки.
Если я верно понял, вы просто много раз повторяете исходную строку? В таком случае, это не совсем честный бенчмарк, т.к. максимум достигается почти сразу (на первом же вхождении исходной строки в длинную). Интереснее было бы посмотреть на тест, в котором максимум постоянно растет.
del
Получается, если я захочу воспроизвести ваши результаты на своем компьютере и измерить время работы у себя, у меня не получится это сделать? В чем смысл тогда вообще код приводить, если вы знаете, что он работать не будет?
Сниппет - это просто англицизм от англ. snippet - фрагмент, отрывок. Тем более, смысл был из контекста понятен.
У вас во втором сниппете кода баг. Сможете найти?
Вполне корректный алгоритм.
А код на питоне вас устроит? :)
Браво! А теперь замените черепаху на синюю клетку и получится дословно алгоритм из статьи.
Создать список синих клеток (все свободные клетки лабиринта)
Цикл - пока список синих клеток не пуст
Рассчитать путь для синей клетки до выхода
Записать в результирующий список команд
Передвинуть все синие клетки из списка по маршруту из п.3 производя слияние элементов списка при совпадении клеток или удаляя из списка тех, что вышли из лабиринта
Вернуться в п.2
Так если задача не причем, почему пишите об этом здесь?
Оптимизация чего? Я как автор статьи не совсем понимаю, о чем вы :)
Да нет никакой разницы как вы его найдете, хоть dfs запустите. Речь же не о том. Задача стояла "придумайте алгоритм, который выпишет конечную последовательность". Это теоретическая задача, а не контест. Здесь никаких ограничений по времени и памяти нет у вас нет.
Затем, что вы не знаете, где черепаха. Все синие клетки для вас норм.
Кто кого троллит)
Одна итерация - это не одна команда, а последовательность команд, переводящая одну из синих клеток в зеленую.
То, что выбрав любую точку можно дойти до выхода доказывать как раз не нужно, т.к. это следует из словосочетания "связный лабиринт" :)