- - PR -
アルゴリズムパズル(リンクリスト)
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-11-16 14:30
すみません。
の「無限」は
の無限にかけてました。 n が有限の場合で循環参照している場合に、O(n) が無限になると駄目ですねって事でした。 _________________ 囚人のジレンマな日々 | ||||||||||||
|
投稿日時: 2005-11-16 14:33
最初の方で答えが出ていますが。
bool IsDangling(List l) { List p = l; while (l != null && l != (p = p.next)) { l = l.next; p = p.next; } return l != null; } ループの長さがmとします。 ループの入り口には、n-m回でたどり着きます。 また、lとpは1回のループで1つずつ ずれていきますので、およそm-1回で同じになります。 また、終端しててもn-1回で終了しますので、O(n)です。 | ||||||||||||
|
投稿日時: 2005-11-16 14:41
>cats さん
え?混乱してきた〜。 1(2)->2(3)->3(4)->4(2)・・・ ※()内は次のノード l・・・1 p・・・2 l・・・2 p・・・3 l・・・3 p・・・4 l・・・4 p・・・2 l・・・2 p・・・3 となって無理なような気が・・・。間違い指摘して下さい。 _________________ 囚人のジレンマな日々 | ||||||||||||
|
投稿日時: 2005-11-16 14:46
>ポインタを2つ用意して追いかけっこする。
わかりにくいけどこれが正解じゃない? 大体以下のような感じ。 リストの末尾はNULLとします。 typedef struct Node_{ void* data; /*テキトー*/ struct Node_* next; }Node; /* 循環しているなら1, そうでないなら0を返す */ int is_circular_list(Node* seq) { Node* rabbit = seq; Node* tortoise = seq; while(rabbit && tortoise && rabbit->next) { tortoise = tortoise->next; rabbit = rabbit->next->next; if(rabbit == tortoise) { return 1; } } return 0; } | ||||||||||||
|
投稿日時: 2005-11-16 14:51
囚人さんへ
(1,2)、(2,4)、(3,3)で同じになって循環参照の判定です。 (p != nullの判定が抜けていてバグっていますね) | ||||||||||||
|
投稿日時: 2005-11-16 14:52
リンクをたどりながら、ポインタをハッシュテーブルに格納していけば良いのでは?
ハッシュテーブルなら、O(1)で検索できますし。 | ||||||||||||
|
投稿日時: 2005-11-16 14:53
感動
互いに素な、歩幅の忍者を放ち、後ろから追突したら ループ有。 | ||||||||||||
|
投稿日時: 2005-11-16 15:00
kanaiです。
再帰を使って、こんな感じでいかがでしょうか?(VB.NET) 簡単のため、リンクリストはInteger配列として実装し、 リストの先頭は添字0、リストの末尾は値-1で表しています。
[ メッセージ編集済み 編集者: kanai 編集日時 2005-11-16 15:01 ] |