2016-10-08 9 views
0

私は配列T*arrayと述語pを持っていますが、pと一致するすべての要素で配列を異なるサブ配列T**subsに分割したいとします。要素上の分割C配列

だから、のようなもの:

typedef bool (*P) (T element); 
T**subs(T*array,P p){....} 

はどのようにsubs()のためのコードは次のように見ることができますか?

subs()の実装方法を知りたいので、このコードは擬似コードなので、例ではarray_lengthなどの変数を使用できます。

+0

'array'はポインタではなく、つまり' T'へのポインタです。 'subs'と同じですが、配列ではなく' T'へのポインタへのポインタです。 – alk

+0

配列は技術的にCのポインタです –

+0

さて、あなたは確かに 'array'を見てから、いくつの要素があるのか​​を教えてくれるでしょうか? – alk

答えて

1

コールバック関数ではなく、述語と呼びます。これは、引数arrayのメモリを再利用し、グループの長さについての情報を返しませんが、あなただけのこの問題を解決する方法についての一般的なアイデアを望んでいたことから、私は、これは十分に開始されるべきだと思う

typedef bool (*P) (T element); 

T * * subs(T * array, P callback) { 
    T * * retval = malloc(sizeof(T*) * max_groups); // either count before, or realloc as needed 
    size_t group = 0; 
    retval[group] = array; 

    for (size_t i = 0; i < array_length; ++i) { 
     if (callback(array[i])) { 
      retval[++group]=array + i; 
     } 
    } 

    return retval; 
} 

あなたが望むものを正確に得るためのポイント。

+0

うわー、この答えは素晴らしいです、ありがとうございます:) –

+0

と私はどのようにサイズを得ることができます結果配列? –

+0

ありがとう、ありがとうございますが、個人のサイズを知っているといいでしょう。size [0]はsubsとsize [1〜n]の数になるように 'int * size'変数を追加してください。すべてのサブアレイの個々のサイズです、ありがとうございます! –

3

"どのようなコードのように見えるか"という質問は、 "どのようなデータ構造を使用したい/使用する必要がありますか?"という質問です。

たとえば、元の値を変更せずにサブアレイを変更する必要がある場合は、配列要素を新しい配列にコピーする必要があります。サブ配列の値を変更しない場合は、元の配列にポインタまたはインデックスの配列を返すことができます。ポインタの配列はリストです。

要件に合ったデータ構造を決定したら、アルゴリズムを開発することができます。しかし、あなたのアルゴリズムが面倒であるか遅いと判明した場合は、処理を高速化できるようにデータ構造を調整する必要があります。

あなたの質問には、あなたの要件に基づいて、たくさんの「デザイン」とデシジョンが必要です。

+0

これらのうちどれも変更される予定はありません。 –

+0

それはちょっと変わっていない –

+0

あなたの決断の1つです。ちょうど考え続けて...私は(コード)の答えを与えることはありません。 –

2

サブアレイ間にはギャップが存在しないであろうと仮定すると、あなたはM=N-2検出要素にサイズNで動的に作成された配列T * resultへのポインタを返すことができます。

この配列は、がNULLである必要があることを示すために、NULLで終了する必要があります。

の各要素は、サブアレイの開始(第1要素)を示すソースarrayを指し示します。

result[N-2]は最後の要素をちょうど超えています。

サブアレイiのサイズは(ため、I = {0 ... M})をresult[i+1]-result[i]を行うことによって導出することができます。

コピーしないで、サブアレイのサイズを示す追加の配列は必要ありません。ソース配列のサイズはsubs()に渡す必要があります。

+0

ありがとう、これは助けになります:) –

+0

@einmensch:最後のサブアレイの最後の要素は常にソース配列の最後の要素であると推測できます。 N = M-1個の要素が返されます。 – alk

+0

@einmensch:サブアレイ間にギャップがある場合は、N =(2 * M)+1エレメントを返す必要があり、サブアレイの終わりを別々に示す必要があります。したがって、偶数インデックスはサブアレイの先頭を返し、奇数インデックスは最後をマークします。 – alk