2011-06-26 38 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));