Так само, як я збирався запропонувати алгоритм виявлення циклу Флойда, публікація Rici перемогла мене. Однак все це можна зробити більш практичним, прискоривши порівняння повних станів.
Вузьким місцем пропонованого алгоритму було б порівняння повного стану. Ці порівняння зазвичай не закінчуються, а зупиняються рано --- при першій різниці. Оптимізація полягає в тому, щоб запам'ятати, де відбулися минулі відмінності, і перевірити спочатку ці частини штату. Наприклад, підтримуйте список місць і пройдіть цей список, перш ніж зробити повне порівняння. Коли місцеположення із цього списку виявить різницю, зупиніть порівняння (з помилкою) та перенесіть його на передню частину списку.
Інший (і потенційно більш масштабований) підхід - це використання покрокового хешування. Виберіть функцію повного стану таким чином, щоб хеш-значення легко регулювались в O (1), коли деяка частина стану змінюється. Наприклад, візьміть зважену суму державних слів мода якийсь великий простий і з'єднайте з невзваженою сумою mod деякий інший великий простий (може також кинути модульну зважену суму квадратів слів з різною вагою та модулем). Таким чином, оновлення хешу займе час O (1) на кожному кроці виконання, а порівняння займе час O (1), поки ви не отримаєте звернення. Імовірність помилкового позитиву (тобто збігаються хеші, коли стани відрізняються) дуже низька, і навіть якщо це коли-небудь трапиться, воно буде амортизуватися за великою кількістю справжніх негативів (помилкові негативи неможливі).
Звичайно, на практиці, мабуть, більше шансів потрапити в такі ситуації, як генерування цифр числа pi --- речі продовжують змінюватися, але ніколи не закінчуються. Ще одна часта можливість полягає в тому, що нескінченний цикл виділяє пам'ять, і в цьому випадку вона швидко вичерпує всю наявну пам'ять.
У моєму курсі з алгоритмів та структур даних, наш автоградер має справу з поданнями студентів, які іноді потрапляють у нескінченні цикли. Для цього переймається 30-секундний тайм-аут і певний обмеження пам’яті. Обидва значно слабкіші, ніж тривалість виконання та бюджети пам’яті, які ми накладаємо в рамках оцінки. Я не впевнений, чи втілення виявлення справжнього нескінченного циклу мало б багато сенсу в цьому контексті, оскільки такі програми працюватимуть трохи повільніше (саме тут може допомогти апаратне забезпечення для хешування стану, але знову ж вам знадобиться додаткове використання для обґрунтуйте це). Коли студенти знають, що їх програма закінчилася, вони зазвичай можуть знайти нескінченний цикл.