de-vraag
  • 質問
  • タグ
  • ユーザー
通知:
報酬:
登録
登録すると、質問に対する返答やコメントが通知されます。
ログイン
すでにアカウントをお持ちの方は、ログインして新しい通知を確認してください。
追加された質問、回答、コメントには報酬があります。
さらに
ソース
編集
 Lawyerson
Lawyerson
質問

どのようなアルゴリズムのコンテキストで 'アレイアクセス'を構成する?

以下は、JavaのLSD基数ソートの実装で、各文字列に正確に W 文字が含まれる文字列の配列をソートするためのテキストブックです。

実行時に配列アクセスの数を数えたいと思います。私はLSDソートが n * c 配列へのアクセスを必要としていると読んでいる。 n は文字列の数であり、 c 各文字列にしかし、以下のアルゴリズムは、複数の配列に複数回アクセスします。これらのそれぞれでカウンタを増やすと、重要な要素 nc になります。

では、アルゴリズムのコンテキストでは、正確には「配列アクセス」を構成するものは何ですか?ここで数える必要があると考えられる配列アクセスのインスタンスは1つだけですか、実際はこの例は、必要以上に多くの配列アクセスを使用する非効率的な実装ですか?

 public int lsdSort(String[] array, int W) {
  int access = 0;
 //Sort a[] on leading W characters.
  int N = array.length;
  String[] aux = new String[N];
  for (int d = W-1; d >= 0; d--)
  {//Sort by key-indexed counting on dth char.
    int[] count = new int[R+1];//Compute frequency counts.
    for (int i = 0; i < N; i++) {
        count[array[i].charAt(d) + 1]++;
    }
    for (int r = 0; r < R; r++) {
       //Transform counts to indices.
        count[r+1] += count[r];
    }
    for (int i = 0; i < N; i++) {
       //Distribute.
        aux[count[array[i].charAt(d)]++] = array[i];

    }  
    for (int i = 0; i < N; i++)//Copy back.
        array[i] = aux[i];
  }

  return access;
  }
4 2011-10-27T22:32:09+00:00 4
Yuval Adam
Yuval Adam
編集された質問 27日 10月 2011 в 10:37
プログラミング
java
algorithm
radix-sort
Jon Skeet
27日 10月 2011 в 10:38
2011-10-27T22:38:06+00:00
さらに
ソース
編集
#56793779

LSDソートは、n回の文字列の数と各文字列の文字数のn回のc回の配列アクセスを必要とすると読みました。

あなたはそれが O(nc)であると読んでいないでしょうか?それはまったく同じことではありません。 big-O表記です。重要な点は、配列アクセスの正確な数を判断することではなく、 n としてどのように成長するか(あるいは、成長する方法の制限) c が増加します。この場合、それは線形に増加します - もしあなたが n を1000倍に増やすと、合計コストは1000倍も増加すると予想します。 2 )アルゴリズムではなく、1,000,000倍になる可能性があります。 (厳密に言えば、O(nc)アルゴリズムもそれが限界であるために O(n 2 )です。

7
0
AHungerArtist
27日 10月 2011 в 10:37
2011-10-27T22:37:42+00:00
さらに
ソース
編集
#56793778

最初のforループ内のすべての配列アクセスは、基本的に配列アクセスの合計数としてカウントされます。 nは、これらの組み合わせられた配列アクセスを何回行うのかです。これは、アクセスの実際の数ではなく、関数の成長のおおよその考え方を示します。

1
0
Aaron Gage
27日 10月 2011 в 10:41
2011-10-27T22:41:09+00:00
さらに
ソース
編集
#56793780
public int lsdSort(String[] array, int W) {
  int access = 0;
 //Sort a[] on leading W characters.
  int N = array.length;
  String[] aux = new String[N];
  for (int d = W-1; d >= 0; d--)
  {//Sort by key-indexed counting on dth char.
    int[] count = new int[R+1];//Compute frequency counts.
    for (int i = 0; i < N; i++) {
        count[array[i].charAt(d) + 1]++;
        access++;
        access++;
    }
    for (int r = 0; r < R; r++) {
       //Transform counts to indices.
        count[r+1] += count[r];
        access++;
    }
    for (int i = 0; i < N; i++) {
       //Distribute.
        aux[count[array[i].charAt(d)]++] = array[i];
        access++; 
        access++;
        access++;   
    }  
    for (int i = 0; i < N; i++)//Copy back.
        array[i] = aux[i];
        access++;
        access++;
  }

  return access;

  }

配列 'アクセス'は、読み取りまたは書き込みのいずれかです...

1
0
vz0
27日 10月 2011 в 10:43
2011-10-27T22:43:39+00:00
さらに
ソース
編集
#56793781

Big-O 漸近表記では、アクセス数は定数に比例します。コードを分析すると、すべての定数が破棄されます。

基数ソートの場合、Big Oは O(cn)です。しかし、実際に何回配列がアクセスされたのかを数えたい場合は、定数 k にその数を掛けなければなりません。 k は、

たとえば、この関数は O(n)ですが、配列にアクセスする回数は 2n です(値を読み取るためのものと更新するためのもの)。番号 2 は破棄されます。

for (i=0; i
1
0
質問の追加
カテゴリ
すべて
技術情報
文化・レクリエーション
生活・芸術
科学
プロフェッショナル
事業内容
ユーザー
すべて
新しい
人気
1
Roxana Elizabeth CASTILLO Avalos
登録済み 6日前
2
Hideo Nakagawa
登録済み 1週間前
3
Sergiy Tytarenko
登録済み 1週間前
4
shoxrux azadov
登録済み 1週間前
5
Koreets Koreytsev
登録済み 1週間前
© de-vraag :年
ソース
stackoverflow.com
ライセンス cc by-sa 3.0 帰属