高效的循环队列重新排序

时间:2011-06-26 06:01:37

标签: c queue arrays

我使用循环队列作为数据缓冲区。我使用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;
}

1 个答案:

答案 0 :(得分: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));