2

私は学校の課題のために二重リンク リストの独自の実装を作成してNodeおり、リスト クラス内で呼び出される内部ノード クラスを使用しています。これは、相互にリンクされているリスト ノードを表します (リンク リストの場合は通常そうです)。

class DoublyLinkedList<T>
{
    class Node
    {
        T obj;
    }
}

多くのノードを持つ大きなリストの場合、各Nodeオブジェクトが親リスト クラスのインスタンスを参照する可能性があるため、それはかなりのオーバーヘッドと最適ではない設計でしょうか? 非静的クラスとして持つと確かに便利です。ノードは親リストfirstlast参照を変更する可能性があり、カプセル化に最適であることがわかりました。

静的にするNodeと、(リストへの明示的なメンバー参照がなければ) 親リストを操作するために使用できなくなり、firstすべてlast逆からアプローチする必要があります-リストは独自のメソッドを介してノードを割り当てて操作します、つまり、それらを相互にリンクし、リンクを解除して、その値firstlast値を自然に調整します。

優れた設計と学習のために、 The Smart Thing To Do (c) (ある場合)とは何かを知りたいです。

4

2 に答える 2

4

内部クラスが存在しない場合、親クラスへの暗黙的な参照が既に存在し、クラス内からstatic参照できます。DoublyLinkedList.thisNode

Nodeいずれにせよ、クラスが親クラスの属性を直接変更できる必要がある理由がわかりません。リストを変更するメソッド (それfirstlast含め) はクラスのものであるべきであり、DoubleLinkedList直接クラスのものであってはなりませんNode。これはまさにカプセル化のためであり、Nodeインスタンスは、それがどこに含まれているか、または外部からどのように使用されているかについて何も知らないはずです。

于 2013-03-09T14:33:57.023 に答える
2

オーバーヘッドは、ノードごとに正確に 1 つの参照になります。ペイロードに加えてノードにも前のリンクと後ろのリンクがあると仮定すると、親への余分な参照のオーバーヘッドは、追加のメモリ使用量 (3 つの既存のものの上に 1 つの参照) で約 33% になります。これは、特にノード数が多く、ペイロードが小さい場合に、かなりのオーバーヘッドになります。一方、ペイロードが大きい場合は、それほど問題にはなりません。

ただし、一般的には、ペイロード サイズについては想定せず、Node クラスを作成しstaticます。

于 2013-03-09T14:35:45.603 に答える