Алгоритм Флойда для поиска зацикленности
От: e.thrash  
Дата: 25.11.16 13:37
Оценка:
Почитал в вики, в инете тут но не догоняю как это работает.

Пример вот из ссылки
60->50->40->30->20->10->40

почему вот написана такая фраза

For example : when tortoise comes to 40 hare is at 20 inside the loop.then they both meet at 20.


когда черепаха на 40, то заяц ведь на 20, почему написано

then they both meet at 20

и

Now send tortoise back to first node in the list. Let them both iterate at same speed(one node per step) then



я насколько понял мы должны отправить черепаху на старт, когда одинаковые значения. то есть если бы и черепаха и заяц были на 20, то да, отправляем черепаху на старт.

Было бы здорово, если кто-то код на яве или сишарпе накидал
Re: Алгоритм Флойда для поиска зацикленности
От: GarryIV  
Дата: 25.11.16 14:43
Оценка:
Здравствуйте, e.thrash, Вы писали:

ET>Почитал в вики, в инете тут но не догоняю как это работает.


ET>Было бы здорово, если кто-то код на яве или сишарпе накидал


По твоей же ссылке код на Java?
WBR, Igor Evgrafov
Re[2]: Алгоритм Флойда для поиска зацикленности
От: e.thrash  
Дата: 25.11.16 19:05
Оценка:
Здравствуйте, GarryIV, Вы писали:

GIV>Здравствуйте, e.thrash, Вы писали:


ET>>Почитал в вики, в инете тут но не догоняю как это работает.


ET>>Было бы здорово, если кто-то код на яве или сишарпе накидал


GIV>По твоей же ссылке код на Java?


но мне непонятно как он работает. объяснение не понятно, отсюда и код ставится под сомнение
Re: Алгоритм Флойда для поиска зацикленности
От: StatujaLeha на правах ИМХО
Дата: 25.11.16 19:36
Оценка: +1
Здравствуйте, e.thrash, Вы писали:

60->>50->40->30->20->10->40


ET>почему вот написана такая фраза


ET>

ET>For example : when tortoise comes to 40 hare is at 20 inside the loop.then they both meet at 20.


Заяц бежит со скоростью 2, а черепаха со скоростью 1, при этом в цикле 4 элемента.
Черепаха в узле 40 и до узла 20 ей надо сделать два шага, а заяц уже в узле 20, но пока черепаха делает два шага до этого узла он сделает круг по циклу.
Поэтому они встретятся в узле 20.

ET> и

ET>

ET>Now send tortoise back to first node in the list. Let them both iterate at same speed(one node per step) then


Этот кусок просто так не объяснить. Доказательство, что это так, можешь найти в http://www.ozon.ru/context/detail/id/6279127/
Глава 2.3 Точка столкновения.

Код там кривой.
Например
    public Node FindLoop()
    {
        Node tortoise = first;
        Node hare = first;
        
        while (hare.next != null)//Cдохнет, если цикла нет, а в цепочке четное кол-во элементов. Например, при 2 элементах сдохнет на второй итерации.
        {
            tortoise = tortoise.next;
            hare = hare.next.next;
            if( tortoise == hare)
            {
                break;
            }
        }
        ....
    }
Re[2]: Алгоритм Флойда для поиска зацикленности
От: e.thrash  
Дата: 26.11.16 15:57
Оценка:
Здравствуйте, StatujaLeha, Вы писали:

SL>Здравствуйте, e.thrash, Вы писали:


60->>>50->40->30->20->10->40


ET>>почему вот написана такая фраза


ET>>

ET>>For example : when tortoise comes to 40 hare is at 20 inside the loop.then they both meet at 20.


SL>Заяц бежит со скоростью 2, а черепаха со скоростью 1, при этом в цикле 4 элемента.

SL>Черепаха в узле 40 и до узла 20 ей надо сделать два шага, а заяц уже в узле 20, но пока черепаха делает два шага до этого узла он сделает круг по циклу.
SL>Поэтому они встретятся в узле 20.

то есть подразумевается, что выделенные 40 это один объект? 60->50->40->30->20->10->40
тогда почему нам дана последовательность заканчивающаяся на 40? ведь у нас после 40 идут еще 30-20-10
Re: Алгоритм Флойда для поиска зацикленности
От: e.thrash  
Дата: 26.11.16 16:31
Оценка:
Здравствуйте, e.thrash, Вы писали:

а я кажется въехал.
Проверьте плиз верно написал алгоритм

  код
private static bool CheckCycle(Node[] arr)
        {            
            if (arr.Length <= 2)
            {
                return false;
            }

            bool loopExists = true;
            Node tortoise = arr[0];
            Node hare = arr[0];

            while (tortoise.next != null && hare.next != null)
            {
                tortoise = tortoise.next;
                hare = hare.next.next;
                if (tortoise.id == hare.id)
                {                    
                    break;
                }
            }

            if (hare.next == null)
            {
                loopExists = false;
                return false;
            }

            int? startCycle;
            tortoise = arr[0];
            while (tortoise != hare)
            {
                tortoise = tortoise.next;
                hare = hare.next;
            }
            startCycle = tortoise.id;

            int cycleLength = 0;
            hare = hare.next;
            while (hare != tortoise)
            {
                hare = hare.next;
                cycleLength++;
            }

            return loopExists;
        }
Re[3]: Алгоритм Флойда для поиска зацикленности
От: StatujaLeha на правах ИМХО
Дата: 26.11.16 17:17
Оценка:
Здравствуйте, e.thrash, Вы писали:

ET>то есть подразумевается, что выделенные 40 это один объект? 60->50->40->30->20->10->40

ET>тогда почему нам дана последовательность заканчивающаяся на 40? ведь у нас после 40 идут еще 30-20-10

Сори, не понял вопрос...
Если идти из узла 60 и выводить все пройденные узлы, то будет следующий лог:
60->50->40->30->20->10->40->30->20->10->40->(30->20->10->40)...
Re[4]: Алгоритм Флойда для поиска зацикленности
От: e.thrash  
Дата: 26.11.16 17:24
Оценка:
Здравствуйте, StatujaLeha, Вы писали:

SL>Здравствуйте, e.thrash, Вы писали:


ET>>то есть подразумевается, что выделенные 40 это один объект? 60->50->40->30->20->10->40

ET>>тогда почему нам дана последовательность заканчивающаяся на 40? ведь у нас после 40 идут еще 30-20-10

SL>Сори, не понял вопрос...

SL>Если идти из узла 60 и выводить все пройденные узлы, то будет следующий лог:
60->>50->40->30->20->10->40->30->20->10->40->(30->20->10->40)...

Я рассматривал это как массив целых чисел.
а это надо, как я понимаю сейчас рассматривать как связанный список, где 40 это один и тот же объект.

Верно ведь?
Re[5]: Алгоритм Флойда для поиска зацикленности
От: StatujaLeha на правах ИМХО
Дата: 26.11.16 17:46
Оценка: 2 (1)
Здравствуйте, e.thrash, Вы писали:

ET>Я рассматривал это как массив целых чисел.


Это не массив. Для каждого элемента создается отдельный объект.
        LinkedList object = new LinkedList();
        object.insert(10);
        object.insert(20);
        object.insert(30);
        object.insert(40);
        object.insert(50);
        object.insert(60);

    public void insert(int val)//inserts at beginning of list
    {
        Node newNode = new Node(val);
        newNode.next = first;
        first = newNode;
    }


ET>а это надо, как я понимаю сейчас рассматривать как связанный список, где 40 это один и тот же объект.


ET>Верно ведь?


Да.
Там сначала создается список без цикла, а потом его конец замыкается на элемент по середине:
        Node tempObj1 = object.search(40);//creating a loop 60->50->40->30->20->10->40
        Node tempObj2 = object.search(10);

        tempObj2.next = tempObj1;//10 -> 40
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.