마지막으로 인터뷰 퀴즈 질문을 적용 할 수있는 경우처럼 들릴 수 있습니다. O (1) 메모리 만 사용하여 링크 된 목록에서주기를 찾으십시오.
이 경우 "연결 목록"은 열거하는 요소의 순서입니다.두 개의 열거자를 사용하고 반 속도로 실행하고 빠른 것이 느린 속도로 실행되면 루프가 생깁니다. 이것은 또한 '본'목록을 확인하는 데 필요한 O (n^2) 시간 대신 O (n) 시간이됩니다. 단점은 일부 노드가 여러 번 처리 된 후에 만 루프에 대해 알아낼 수 있다는 것입니다.
예에서 '반 속도'방법을 쓰기가 더 쉬운 '드롭 마커'방법으로 바꿨습니다.
class GenTreeNode {
...
///<summary>Wraps an the enumeration of linked data structures such as trees and linked lists with a check for cycles.</summary>
private static IEnumerable<T> CheckedEnumerable<T>(IEnumerable<T> sub_enumerable) {
long cur_track_count = 0;
long high_track_count = 1;
T post = default(T);
foreach (var e in sub_enumerable) {
yield return e;
if (++cur_track_count >= high_track_count) {
post = e;
high_track_count *= 2;
cur_track_count = 0;
} else if (object.ReferenceEquals(e, post)) {
throw new Exception("Infinite Loop");
}
}
}
...
///<summary>Enumerates the tree's nodes, assuming no cycles</summary>
private IEnumerable<GenTreeNode> tree_nodes_unchecked() {
yield return this;
foreach (var child in this.nodes)
foreach (var e in child.tree_nodes_unchecked())
yield return e;
}
///<summary>Enumerates the tree's nodes, checking for cycles</summary>
public IEnumerable<GenTreeNode> tree_nodes()
{
return CheckedEnumerable(tree_nodes_unchecked());
}
...
void ProcessTree() {
foreach (var node in tree_nodes())
proceess(node);
}
}
이진 트리에는 사이클과 같은 것이 없습니다. 올바른 계보 데이터조차도 이진 나무가 아닙니다. 나는 "그래프" – Triptych
호기심을 읽으라는 질문을 편집하여 복용량 지수, 워커 닉 평가 또는 이와 유사한 어떤 것을 (서러브레드에서와 같이) 알아 냈습니까? – nlucaroni
아니요 ... 전체 말 혈통을 파일로 내보냅니다. 나는 근친 교배를 탐지하기 위해서도이 소프트웨어를 사용할 것입니다. 그러나 소프트웨어 제품이 특정 품종이 아니기 때문에 분석 할 역사적인 데이터가별로 없습니다. – Romias