
双方向リストは一方向より早いのでしょうか?
それは何故でしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答6件
0
双方向という事は前後へのリンク情報も保持しているという事なので削除対象が特定されている時点で削除物の前にあるデータと削除物の後にあるデータを連結して削除対象物をリストから除外するという整理操作がその場ですぐに解決できますが、例えば片方向(後方)の場合だと、削除対象が特定されていても削除物の前にあるデータは検索しないと特定できないので双方向の時に比べると検索コストが余計にかかってしまう理屈になります。
[例]
A→B→C から B を削除したい場合に
1.「Aの次がBである」を「Aの次はCである」に変更
2.「Cの前がBである」を「Cの前はAである」に変更(双方向の場合)
をしなくてはなりませんが、
・双方向ならBがAとCへのリンク情報を持っているのでBだけですぐにAとCを特定できる
・片方向ならBはCへのリンク情報しかもっていないのでAの特定には検索が必要
という違いがあります。
投稿2018/06/01 01:30
編集2018/06/01 01:38総合スコア2160
0
ベストアンサー
prev -> here -> next で現在hereをポイントしてて、hereを削除となると
削除要素のひとつ前:prevをポイントせにゃならんので速くはなさそう。
が、ゴマカシが許されるなら nextのナカミをhereにコピーしたのちnextを削除することで hereが削除されたようにみせかけることができます。
ただし、
1.コピーのコストが大きいと速くない(ポインタ張替えの方が速いなら、双方向の方が速いことになる)
2.末尾要素が削除できない
投稿2018/06/01 11:03
編集2018/06/01 11:05総合スコア16612
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

2018/06/01 16:42
2018/06/02 10:58

0
解決済みですが。
皆様おっしゃられる通り、以下のようなリストを考えます。
head->p1->・・・->p11->p12->p13->・・・
ここでp12を削除する場合を考えると、p11のポインタを書き換える必要があります。しかし、フォーカス(巡回用ポインタ)がp12を指示しているならば、先頭から辿らないとp11のポインタを変更できないので手間がかかります。
ただし、これはフォーカスの運用次第です。
フォーカスを二つ使うとか、先読運用(例えばp11を指しているときにp12に対する処理を行う。)とか、解決する方法がないわけではありません。
蛇足
非常に変則な形ですが、フォーカスだけ双方向ポインタをもち、これを中心にリストの向きを変更していくといったリストの使い方もあります。
head<-p1<-・・・<-p11<-[focus]->p12->p13->・・・
これはメモリ容量が小さいときに使われていた小手先の技術なので推奨はしません。読み取りだけでもデータ改変が必要なので、現在はむしろ悪手です。
投稿2018/06/01 15:21
総合スコア4844
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
多分に推測になりますが、双方向連結リストで「削除が高速にできる」の比較対象は一方向リストではなく、配列などリストでないデータ構造なのではないかと思います。
配列であれば途中の削除は「残りを全部ずらす」しかないのでリスト構造のほうが有利ですが、一方向リストに対しては優位になりません。
投稿2018/06/01 01:23
総合スコア146337
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。