2011-06-26 12 views
1

私は循環バッファをデータバッファーとして使用しています。私は、データを保持するためにchar配列を使用しています。私の問題は、バッファ内のデータを元の順序で表示する必要があるときです。バッファの並べ替えが64%の処理時間の大半を占めています。このバッファを使用してデータのギガバイト単位のシグネチャを検索するので、できるだけ最適化する必要があります。どのような最適化の提案も非常に高く評価され、このバッファをどのように格納し、処理のために簡単にchar配列に変換するかについての提案があります。ありがとうございます。効率的な循環キューの並べ替え

編集:データが "abcdef"の場合、バッファが "defabc"のように見えるので、 "abcdef"にバッファを並べ替える必要があります。

キュー構造:

typedef struct item{ 
unsigned char* data; 
int length; 
} item; 

typedef struct queue{ 
unsigned char *data; 
int front; 
int back; 
int length; 
int size; 
} queue; 

リオーダー機能:

int toStr(queue *ptr, item *ret){ 
int length; 
int i; 
int j; 
int back = ptr->back; 
int size = ptr->size; 
char* tmp; 
char* tmp_data; 

if(ptr->length == 0){ 
    return 0; 
} 

tmp = ret->data; 
ret->length = ptr->length; 
tmp_data = ptr->data; 
i = ptr->front; 
j = 0; 
while(i != back){ 
    //ret->data[j] = tmp_data[i]; 
    tmp[j] = tmp_data[i]; 
    ++i; 
    ++j; 
    if(i > size){ 
     i = 0; 
    } 
} 

return 1; 
} 
+0

あなたがデータを必要とします入力した順番で入力します。並べ替える部分を理解できませんでした。 – phoxis

+0

私はなぜあなたがそれを「並べ替える」必要があるのか​​分かりません。 – trutheality

答えて

4

は今、あなただけのためにそれを見るために、すべてのデータをコピーしています。私は、バッファ内の正しい場所へのポインタへの添え字を変換する機能を提供したいと思う:

unsigned char *sub(queue const *q, int subscript) { 
    return q->data + (front + subscript) % q->size); 
} 

次にためにデータを使用してのようなものです:

for (i=0; i<q->size; i++) 
    printf("%c\n", *sub(q, i)); 
関連する問題