Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 高效循环队列重排序_C_Queue_Arrays - Fatal编程技术网

C 高效循环队列重排序

C 高效循环队列重排序,c,queue,arrays,C,Queue,Arrays,我使用循环队列作为数据缓冲区。我使用一个字符数组来保存数据,我的问题是当我需要按原始顺序查看缓冲区中的数据时。缓冲区的重新排序占用了大部分处理时间,占64%。我需要尽可能优化它,因为我使用这个缓冲区来搜索千兆字节数据中的签名。任何优化建议和/或关于如何存储此缓冲区并轻松将其转换为字符数组进行处理的任何其他建议都将不胜感激。提前谢谢 编辑:很抱歉,我所说的重新排序是指如果数据是“abcdef”,那么缓冲区很有可能看起来像“defabc”,因此我需要将缓冲区重新排序为“abcdef” 队列结构: t

我使用循环队列作为数据缓冲区。我使用一个字符数组来保存数据,我的问题是当我需要按原始顺序查看缓冲区中的数据时。缓冲区的重新排序占用了大部分处理时间,占64%。我需要尽可能优化它,因为我使用这个缓冲区来搜索千兆字节数据中的签名。任何优化建议和/或关于如何存储此缓冲区并轻松将其转换为字符数组进行处理的任何其他建议都将不胜感激。提前谢谢

编辑:很抱歉,我所说的重新排序是指如果数据是“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;
}

现在,您正在复制所有数据,以便按顺序查看。我想我应该提供一个函数,将下标转换为指向缓冲区中正确位置的指针:

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));
for(i=0;isize;i++)
printf(“%c\n”,*sub(q,i));

现在,您复制所有数据只是为了按顺序查看。我想我应该提供一个函数,将下标转换为指向缓冲区中正确位置的指针:

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));
for(i=0;isize;i++)
printf(“%c\n”,*sub(q,i));

您需要按输入的顺序输入数据。但无法理解重新排序部分。我不理解您为什么需要“重新排序”它。您需要按输入的顺序排列数据。但无法理解重新订购的部分。我不明白您为什么需要“重新订购”它。