5

私はしばらくの間、Eric Lippert のブログを読んでいます (すばらしいので、チェックしてみてください)。彼の投稿の 1 つに対するコメントで、彼は、一連の数字にインデックスを付けるつもりはなく、単にそれらを列挙するだけであると述べています。

列挙とインデックス作成の違いは何ですか。どこでも検索しましたか? 私の検索中に、反復が方程式に持ち込まれたとき、私はさらに混乱しましたか?誰かがこれらの 3 つの概念を説明してくれませんか? これをだまされたとマークする前に、「イテレータと列挙子」に関するいくつかの質問をすでに見ましたが、適切な説明はまだ見ていません(したがって、質問です)。私はあなたの助けに感謝します。

4

3 に答える 3

5

記事へのコメントで、Eric は、順列のサイズが指数関数的に大きくなるため、32 ビットで表現できる数をすぐに超えてしまうという観察に答えました。エリックの返答は、順列にインデックスを付けるつもりはないというものでした。これは、順列の連続番号を取得するための番号付けスキームを定義することを意味していました。そのため、32 ビットのオーバーフローは彼の関心事の 1 つではありませんでした。彼のアプローチでは、何らかの番号付けスキームに従って順列を取得する方法を提供するのではなく、すべての順列を特定の順序で列挙する、または単に「生成」することができました。N-th

これを、前のものをすべて通過せずに順列を生成することに関する質問N-thで議論されている問題と比較してください。

上記の質問で説明されているインデックス順列の例を次に示します。

1 ABC
2 ACB
3 BAC
4 BCA
5 CAB
6 CBA

この索引付けスキームにより、次の 2 つの質問に答えることができます。

  • 特定の順列の数、たとえばBCA? (それは 4)
  • 順列数X、たとえば 5 とは何ですか? (それはCAB)

この問題は、番号付けスキームを作成する必要があるため、すべての順列を列挙するよりもやや難しい場合があります。

于 2013-05-11T10:36:00.667 に答える
1

indexできるのは、本物のことだけです。arrayusingにインデックスをoperator []付けるか、a にインデックスを付けることができますlist(少なくとも C# では、より正式なコンピューター サイエンスに興味がある人はうんざりするでしょう)。

IEnumerable<T>単純な手段を列挙することは、すべての項目を順番に調べることができることを意味するため、インデックスを作成することはできません。ただし、特定の項目にジャンプすることはできません。

string text = "hello";

これは列挙しています:

foreach( var c in text ) Console.WriteLine(c);

これは索引付けを使用します。

for( int i = 0 ; i < text.Length ; i++ ) Console.WriteLine(text[i]);

これは実際のデータです:

var arr = new int[15]; 

これは実際のではありません。 にはデータがありませんnumber。列挙型でデータを配信するという約束にすぎません。実際のデータを取得するには、それを具体化する必要があります。

var number = GetNumbers();

これにより、無限の数が生成されます。これは実際のデータではありません。列挙した後に実際のデータを生成する方法のレシピのようなものです。

public IEnumerable<int> GetNumbers()
{
    while(true) yield return 1;
}
于 2013-05-11T10:40:55.043 に答える
1

概念的には、列挙子と反復子はどちらもシーケンスについてほとんど知りません。通常、次のことができます。

  • 次のアイテムを取得
  • 現在の要素が最後の要素かどうかを確認する

コレクションが変更されると、動作が異なる場合があります。これらの型は、一度に 1 つの要素をフェッチするため、大量のデータ、ストリーム、LINQ、および遅延読み込みを処理するのに役立ちます。シーケンスからi要素を取得するには、前のすべての要素を反復処理する必要があります。これは O(N) 操作です。linked listそれらはデータ構造と考えることができます。

インデクサーは固定長メモリでのみ機能しますが、基になるストレージは (List<T>型のように) 縮小および拡大する可能性があります。インデクサーは、データの型、ストレージの使用量、またはオブジェクトへの参照がストレージを使用する量を認識しています。これにより、インデクサーは O(1) のシーケンスから任意の項目をフェッチできますが、欠点は、すべてのデータをメモリ内に格納する必要があることです。インデックスに要素のサイズを乗算し、結果を開始アドレスに追加するだけです。したがって、必要なオブジェクトへの値または参照を取得します。arrayインデクサーはデータ構造と考えることができます。

于 2013-05-11T10:35:43.947 に答える