- - PR -
アルゴリズムパズル(リンクリスト)
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-11-16 13:30
なら、単純に ・リストを先頭からスキャン開始! →スキャンに無限の時間がかかるなら、リストは循環参照。 →有限な時間内にスキャンが完了すれば、リストは循環参照ではない。 という「数学的」な回答に落ち着いてしまうような。。。 _________________ // 渋木宏明 (Hiroaki SHIBUKI) // http://hidori.jp/ // Microsoft MVP for Visual C# // // @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/ | ||||||||
|
投稿日時: 2005-11-16 13:42
アドレスの最小値を保存しておき
同じアドレスが出るか、最後にnullが出たら終了 ではどうでしょうか? ↑ダメダメでした。m(__)m [ メッセージ編集済み 編集者: なか-chan 編集日時 2005-11-16 15:56 ] | ||||||||
|
投稿日時: 2005-11-16 13:48
途中からループしていて、ループに突入する前に最小値が出てくるパターンだとNGかと。 「アドレス値最小」には大して意味が無いと思うので、その方向でいくならノードの全部の値を記憶しておいて、1個進むたびに既出かどうかチェックすることになるんじゃないかな?(って、これ既出か) _________________ // 渋木宏明 (Hiroaki SHIBUKI) // http://hidori.jp/ // Microsoft MVP for Visual C# // // @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/ | ||||||||
|
投稿日時: 2005-11-16 13:51
ありですねぇ〜^^ しかし、無限ならば O(n)ではないですね・・・。 n が不明であっても、バブルソートは実行できて、且つ計算量(最悪の)は O(n^2) です。 同じように、問題は「そのアルゴリズムが n の個数が明確である事を前提としてはならない」という意味ではないんですかね。 で、計算中に個数を数えるのはアリなんでしょうけど、循環参照していた場合、その個数が数えられないので、ん〜・・・。 _________________ 囚人のジレンマな日々 | ||||||||
|
投稿日時: 2005-11-16 13:54
こんにちは、でっちです。
スミマセン、なんでnが不明だとNGなのか本気で分らないです 自分ではそのまま判定できるつもりでした。 言語不定ですが、こんな感じのロジックで考えました。
[根拠] ループのある時点での最大ポインタをaとすると、その時点で循環参照せずに リストを組み立てる際に使用できるリスト個数の最大値はa+1になる。 よって、ループした回数(=参照したリストの個数)がそれを超えていた場合は 循環参照していることになる。 問題点のご指摘をお願いします m(_ _)m [ メッセージ編集済み 編集者: でっち6号 編集日時 2005-11-16 14:21 ] | ||||||||
|
投稿日時: 2005-11-16 14:00
いえ、この場合の計算量は n に対して完全に比例関係にあるので、n が無限の場合でも O(n) は成り立ちます。 ただし、O(n) も無限ですが。。。 | ||||||||
|
投稿日時: 2005-11-16 14:20
私もこれくらいしか思いつきませんけど、そうすると1つのノードに対してn-1回のチェックが必要になるんですよね。 だからどうなるんだろ。O(n2乗)かな。
最大ポインタというのはメモリ上のアドレスということですかね。(0xFFFFFF8Bとか) 参照を数値で表していない言語ではどうするんですか?C#とか。Javaもかな。 それに、O(n)にはならないですよね。「メモリアドレス空間の大きさに比例する」かな? | ||||||||
|
投稿日時: 2005-11-16 14:23
すいません、ざっとしか見ていないのですが… 参照元アドレス < 参照先アドレス という前提が崩れると、だめな場合がないですか? たとえば…アドレス0から始まる非循環リスト 0 → 2 → 3 → 1 → Null とか。 |