Лучше, чем алгоритм Флойда
Ричард Брент описал алгоритм обнаружения альтернативного цикла , который в значительной степени похож на зайца и черепаху [цикл Флойда ], за исключением того, что медленный узел здесь не перемещается, а затем «телепортируется» в положение быстрого узла с фиксированными интервалами.
Описание доступно здесь: http://www.siafoo.net/algorithm/11 Брент утверждает, что его алгоритм на 24-36% быстрее, чем алгоритм цикла Флойда. O (n), сложность пространства O (1).
public static boolean hasLoop(Node root){
if(root == null) return false;
Node slow = root, fast = root;
int taken = 0, limit = 2;
while (fast.next != null) {
fast = fast.next;
taken++;
if(slow == fast) return true;
if(taken == limit){
taken = 0;
limit <<= 1; // equivalent to limit *= 2;
slow = fast; // teleporting the turtle (to the hare's position)
}
}
return false;
}
В LabVIEW не существует такого понятия, как значение «Пустое» для чисел с плавающей запятой, точно так же, как в C #, C ++, Java или C такого понятия нет. Все они используют один и тот же стандарт IEEE для определения значений с плавающей запятой. ,
Я открыл эту идею для обмена идеями: Создайте «необязательную» оболочку для входного типа в стиле std :: option в C ++ 17.
Это было в значительной степени отклонено, потому что это не подходит для общего пользования, но некоторые идеи относительно того, как вы могли бы реализовать это самостоятельно, обсуждались там (не пропустите вторую страницу).