Я понимаю, почему черепаха и заяц встретятся, если заяц движется со скоростью 2, а черепаха движется со скоростью 1, если существует один цикл. Потому что, если длина цикла равна k, (2-1)*t (расстояние между черепахой и зайцем) в конечном итоге будет делиться на k. Но чего я не понимаю, так это почему, чтобы найти точку входа, черепаха и заяц должны начинать с одного и того же места вначале.
Вот что я реализовал правильно. Но просто изменив начальное условие, поиск точки входа будет зацикливаться навсегда.
if(!head || head->next==nullptr) return nullptr;
ListNode* fast=head->next->next;
ListNode* slow=head->next; // if changing to slow=head or fast=head->next the second loop below will loop forever.
while(fast!=nullptr && fast->next!=nullptr
&& slow!=nullptr && fast!=slow) {
fast = fast->next->next;
slow = slow->next;
}
if(fast!=nullptr && slow!=nullptr && fast==slow) {
slow = head;
while(fast!=slow){
fast = fast->next;
slow = slow->next;
}
return fast;
} else {
return nullptr;
}
Подробнее здесь: https://stackoverflow.com/questions/782 ... o-start-at
Почему алгоритм поиска цикла Флойда, черепаха и заяц, должны начинаться в одном и том же месте? ⇐ C++
Программы на C++. Форум разработчиков
1711428601
Гость
Я понимаю, почему черепаха и заяц встретятся, если заяц движется со скоростью 2, а черепаха движется со скоростью 1, если существует один цикл. Потому что, если длина цикла равна k, (2-1)*t (расстояние между черепахой и зайцем) в конечном итоге будет делиться на k. Но чего я не понимаю, так это почему, чтобы найти точку входа, черепаха и заяц должны начинать с одного и того же места вначале.
Вот что я реализовал правильно. Но просто изменив начальное условие, поиск точки входа будет зацикливаться навсегда.
if(!head || head->next==nullptr) return nullptr;
ListNode* fast=head->next->next;
ListNode* slow=head->next; // if changing to slow=head or fast=head->next the second loop below will loop forever.
while(fast!=nullptr && fast->next!=nullptr
&& slow!=nullptr && fast!=slow) {
fast = fast->next->next;
slow = slow->next;
}
if(fast!=nullptr && slow!=nullptr && fast==slow) {
slow = head;
while(fast!=slow){
fast = fast->next;
slow = slow->next;
}
return fast;
} else {
return nullptr;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78222926/why-floyds-cycle-finding-algorithm-the-tortoise-and-hare-both-need-to-start-at[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия