2016-06-30 4 views
-2

生成された値の値を保存するのに適した方法は何ですか? 値はそうのように計算されます。Cで特定の値よりも良いもの

0 
0 N/4 2N/4 3N/4 
0 N/4² .. .. .. .. (4²-1)N/4² 
. 
. 
. 
0 N/4^p .. .. .. .. (4^p-1)N/4^p 

は、適切な方法テーブルですか? (私はそうは思わない)。ハッシュテーブル(アクセス方法)または構造体??

+2

どのように生成された値にアクセスしますか? – GMichael

+2

保存する必要がありますか?あなたが 'N'と' p'を渡したかどうか尋ねられたら、いつもそれらを計算することができます。 –

+3

何に適していますか?何を達成しようとしていますか? –

答えて

1

私は2D行列に幾分似たテーブルを使用します。しかし、多くのメモリを無駄にするのを避けるために、私は動的メモリ割り当てを使用して異なる長さの行を作成します。

Row 0 : E     // 1 element 
Row 1 : EEEE     // 4 elements 
Row 2 : EEEEEEEEEEEEEEEE  // 16 elements 
Row 3 : EEEE..........EEEE // 64 elements 
and so on 

ような何か:

I上記のコードで
#include<stdlib.h> 
#include<stdio.h> 
#include <math.h> 

#define PMAX 4   // A total of 5 rows, i.e. p=0,1,2,3,4 
double** table; 

void init_table() 
{ 
    int i; 
    int j; 
    table = malloc((1+PMAX)*sizeof(double*)); // Allocate number of rows 
    for (i=0; i <= PMAX; i++) 
    { 
    unsigned int n = pow(4,i);    // Calculate number of elements needed 
    table[i] = malloc(n*sizeof(double));  // Allocate the elements 
    for (j=0; j < n; j++) 
    { 
     // calculate table values 
     table[i][j] = i*100 + j;    // Replace with correct calculation 
    } 
    } 
} 

void free_table() 
{ 
    int i; 
    for (i=0; i <= PMAX; i++) 
    { 
    free(table[i]); 
    } 
    free(table); 
} 

double getValue(int p, int n) 
{ 
    if ((p > PMAX) || (n >= pow(4, p))) 
    { 
    // Some error handling here.... 
    // For now, just exit 
    printf("Illegal use\n"); 
    free_table(); 
    exit(1); 
    } 
    return table[p][n]; 
} 


int main() 
{ 
    init_table(); 
    printf("%lf\n", getValue(0, 0)); 
    printf("%lf\n", getValue(1, 3)); 
    printf("%lf\n", getValue(3, 15)); 
    free_table(); 
    return 0; 
} 

は、私は違法なインデックスをチェックすることができるように値を読み取るために機能getValueを使用。 pow関数を呼び出すと、パフォーマンスが悪くなります。したがって、最高のパフォーマンスを得るには、機能をスキップして、table[p][n]を直接使用する必要があります。しかし、あなたのアルゴリズムでは、インデックス作成が合法であることを保証するために、他の方法が必要です。

0

これは制約条件によって異なります。

メモリが制約条件であるが、時間がない、あなただけのn及びpの関数を書くことができる場合:

#define N 42 
double function(double n, double p) { 
    return (pow(4, p)-1)*N/pow(4,p); 
} 

ここにあなたの値は、次のようになります。

value = function(n,p); 

時間があれば制約はありますがメモリがない場合は、事前定義テーブルを使用することをお勧めします。

const double values_table[NMAX][PMAX] = { 
{0.1, 0.2, 0.4, 0.8}, 
{4, 16, 64, 256}, 
{..., ..., ..., ...}, 
}; 

値は

value == values_table[n][p]; 

そして、あなたは(あなたが好きなのpython、Matlabの)スクリプトを使って、このテーブルを作成することを検討してコピー&ペーストをそれあなたの.c/.hファイルにする必要があります。簡単な計算のためにはマクロ内で行うことができますが、私が知っている限り、マクロ内でxのyを計算する方法はありません。

上記の制約のどれも問題がなければ、私の好みは読んだり、維持したり、使うのが簡単な機能になります。

+0

なぜ最初の例でconst N = 42ですか? –

+0

これは単なる値の例です。私はOPのテーブルの数式を理解していないのですが、Nは定数であり、行または列に依存しないと考えます。したがって、関数の前にNを定義しました。変数の場合は、パラメータとして関数に追加するか、テーブルに第3次元として追加するだけです。 – Tim

+0

これは4^p-1ではない4 ^(p-1) – zoska

関連する問題