3

XORリンクリスト(ウィキペディアから)を読ん でいますが、理解するのに問題があります。

次の段落が表示されません。

ある時点からいずれかの方向にリストのトラバースを開始するには、1つだけでなく、2つの連続するアイテムのアドレスが必要です。2つの連続するアイテムのアドレスが逆になると、リストを反対方向にトラバースすることになります。

私はそれについていくつか質問があります:

  1. それ(XORリンクリスト自体)は実際にどのように機能しますか?

    (いくつかの例を挙げて答えを正当化するとよいでしょう。つまり、いくつかの住所を取得し、それに応じていくつかの計算を実行します。)

  2. どうすれば実装できますか?実装についての簡単なアイデア。

  3. 実際にどこにあるのか、どこで使用できるのか?どうやら本当に参考になりますか?
4

2 に答える 2

5
  1. 上記の手順は、次の要素と前の要素の両方のアドレスを1つのフィールドに格納することで機能します(これをAと呼びます)。したがって、リスト内の次の要素の値を取得するには、所有している他の要素のアドレスを取得します(これが、2つ必要な理由です... Bと呼びます)。次の要素のアドレスを見つけるには、A XOR BだけでC(次の要素の場所)を取得します。

  2. 使用している言語によって異なります。使用している言語に関係なくビット演算を調べれば、かなりすばやく理解できるはずです。

  3. ダブルリンクリストを使用する場所ならどこでも使用できます(XORリンクリストはメモリを節約します)。注意点は、要素をトラバースするには、リストの2つの連続した要素が必要であるということです。

于 2009-10-26T14:49:51.770 に答える
5

3.この種のリンクリストは、最近ではあまり実用的ではありません。その主な利点は、一般的に安価で豊富なメモリを節約することです。あなたがリンクしたウィキペディアの記事は、不利な点をかなり明確に説明しています。

この形式のリンクリストはお勧めできません。

  • 汎用デバッグツールはXORチェーンをたどることができないため、デバッグがより困難になります。
  • メモリ使用量の減少の代償は、コードの複雑さの増加であり、メンテナンスがより高価になります。
  • ほとんどのガベージコレクションスキームは、リテラルポインタを含まないデータ構造では機能しません。
  • ポインターのXORは、一部のコンテキスト(C言語など)では定義されていませんが、多くの言語では、ポインターと整数の間で何らかの型変換が提供されています。
  • リストをトラバースしていない場合、たとえば、リストアイテムへのポインタが別のデータ構造に含まれている場合、ポインタは読み取り不能になります。
  • リストをトラバースしている間、次のノードのアドレスを計算するために、以前にアクセスしたノードのアドレスを覚えておく必要があります。

コンピュータシステムはますます安価で豊富なメモリを備えており、ストレージのオーバーヘッドは一般に、特殊な組み込みシステム以外では最優先の問題ではありません。リンクリストのオーバーヘッドを削減することが依然として望ましい場合、展開はより実用的なアプローチを提供します(また、キャッシュパフォーマンスの向上やランダムアクセスの高速化などの他の利点もあります)。

于 2009-10-26T17:05:08.940 に答える