タグ付けされた質問 「linked-lists」

3
フロイドのサイクル検出アルゴリズム| サイクルの開始点の決定
私はフロイドのサイクル検出アルゴリズムを理解する助けを求めています。ウィキペディア(http://en.wikipedia.org/wiki/Cycle_detection#Tortoise_and_hare)の説明を読みました。 アルゴリズムがO(n)時間でサイクルを検出する方法を見ることができます。ただし、亀とウサギのポインターが初めて会った後、亀のポインターを最初に戻し、亀とウサギの両方を一度に動かすことで、サイクルの開始を決定できるという事実を視覚化することはできません。彼らが最初に会うポイントは、サイクルの始まりです。 私がそれを理解/視覚化できないので、誰かが説明を提供することで助けてくれますか?


3
順序付けで他の2つの要素の「間に」要素を挿入できる効率的な順序付けを維持していますか?
次のような要素の束に注文があると想像してください: 矢印は意味します。また、推移的です:。X←YX←YX \leftarrow YX&lt;YX&lt;YX < Y(X&lt;Y)∧(Y&lt;Z)⟹(X&lt;Z)(X&lt;Y)∧(Y&lt;Z)⟹(X&lt;Z)\left(X < Y\right) \wedge \left(Y < Z\right) \implies \left(X < Z\right) ようなクエリに効率的に応答するには、何らかのラベル付けまたはデータ構造が必要です。たとえば、左から右へのノードに番号を付けることができ、従って、単にクエリに答えるために比較整数行うことができます:{}?A \ stackrel {&lt;} D \ 1 &lt;4を意味\ Tを暗示。次のようになります。A&lt;?DA&lt;?DA \stackrel {?}{<} DA&lt;?D⟹1&lt;4⟹TA&lt;?D⟹1&lt;4⟹TA \stackrel {?}{<} D \implies 1 < 4 \implies T 番号は順序であり、文字は単なる名前です。 しかし、次のように、順序付けで他の2つの要素の「間に」要素を挿入する必要がある場合はどうでしょう。 どのようにしてそのような順序を維持できますか?単純な番号付けでは、使用する整数の間に「2,3」がないという問題に遭遇2,32,32,3します。

2
単一リンクリストで実装されたキューのエンキューおよびデキューの時間の複雑さはどれくらいですか?
リンクリストデータ構造で実装されたキューの時間の複雑さを理解しようとしています。私の本では、次の方法でO(1)時間でキューを実装できると述べています。 奥に入れる 先頭でデキュー そしてそれはまた言います 要素を尾に追加するのは一定の時間ですが、新しい尾を見つける必要があるため、要素を尾から削除することはO(n)であることに注意してください 新しいノードをキューの先頭(エンキュー)に追加するには、ヘッドポインターがあるためO(1)がかかることを知っています。同様に、先頭のノードを削除すると(デキュー)、O(1)も使用されます。しかし、要素を後ろ(エンキュー)に追加するとO(1)がかかり、削除(デキュー)するとO(n)になる理由がわかりません。どちらの場合も(後ろでの追加/削除)はテールポインターを見つける必要があるため、トラバースする必要があるため、後ろでのキューへの登録がO(1)ではなくO(n)である場合、私にはより理にかなっています。リスト全体。

2
フォワードリードイテレーターチューリングを備えたスタックマシンは完成していますか?
スタックの先頭からしか読み取ることができない場合、ストレージが無制限の単一スタックのマシンはチューリング完了ではないことはよく知られています。スタックマシンよりも(少し)強力なマシンが必要ですが、それでもチューリングは完全ではありません。(多項式のスローダウンのみで非決定論的なプッシュダウンオートマトンを決定論的にシミュレートできる非チューリング完全なマシンが存在するかどうか疑問に思います。)私の頭に浮かんだ最も良性の(まっすぐな)拡張は、(単一の)前進でした。イテレータを読みます。 実装の詳細を詳しく説明して、フォワードリードイテレーターの意味を明確にします。単独リンクリストには、スタックを実装するために使用することができます。リストpTopは、ゼロであるか、SListノードを指すポインターによって実装されます。SListノードは、ペイロードフィールドから構成valueし、ポインタフィールドpNext、pNextのいずれかがゼロであるか、または点SListノード。前方読み取り反復子をpRead、ゼロであるか、SListノードを指すポインターによって実装します。ポインタpTopにpReadは直接アクセスできませんが、次の方法でのみ使用できます。 Push(val)およびで新しいSListノードnを作成し、を設定します。n.value = valn.pNext = pToppTop = &amp;n Pop()pTop == 0またはの場合は中止しpRead == pTopます。それ以外の場合は、が指すノードを読み取っval = pTop-&gt;valueてpTopNext = pTop-&gt;pNext解放SListしpTop、を設定pTop = pTopNextして返しますval。 ReadBegin()セットpRead = pTop。 ReadNext()場合は中止しますpRead == 0。それ以外の場合は、読み取りval = pRead-&gt;value、設定pRead = pRead-&gt;pNext、および戻りますval。 ReadFinished()のtrue場合pRead == 0は、falseそれ以外の場合はを返します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.