当我不得不插入很少的元素时,哪种方式可以提供更快的入队和出队,数组是否优于链接列表?队列性能更好的实现 - 数组或链接列表
我需要插入几个元素,我必须删除并从队列中读取已删除的元素。 如果是数组,我每次删除一个元素时都可能需要修改索引。插入和删除也可能同时发生。
从下面的情况哪个更好?
typedef struct{
mylist list;
struct mylistQ *next;
}mylistQ;
阵列码
static mylist myListQ[QUEUESIZE+1];
int qLast = 0;
void enqueue_element(mylist qItem)
{
myListQ[qLast] = qItem;
qLast++;
}
mylist dequeue_element()
{
retryq:
if(qLast >0) {
mylist qReturn = myListQ[0];
int i;
for (i = 0; i < qLast - 1; i++){
myListQ[i] = myListQ[i + 1];
}
qLast--;
return qReturn;
}
else {
goto retryq;
}
}
链表
int qLast = 0;
mylistQ *headElement = NULL;
mylistQ *tailElement = NULL;
void enqueue_element(mylist *List)
{
mylistQ *newnode;
newnode=(mylistQ*)av_malloc(sizeof(mylistQ));
newnode->next=NULL;
newnode->list=*List;
qLast++;
if(headElement==NULL && tailElement==NULL)
{
headElement=newnode;
tailElement=newnode;
}
else
{
tailElement->next=newnode;
tailElement=newnode;
}
}
mylist dequeue_element()
{
mylistQ *delnode; /* Node to be deleted */
mylist Dellist;
if(headElement==NULL && tailElement==NULL){
LOg("Queue is empty to delete any element");
}
else
{
Log("In dequeue_picture queue is not empty");
delnode=headElement;
headElement=headElement->next;
if (!headElement){
tailElement=NULL;
}
Dellist = delnode->list;
av_free(delnode);
qLast--;
}
return Dellist;
}
CPU缓存位置为王。一个数组非常*难以击败。 – 2011-02-24 23:04:01
@Hans:阵列很难被击败,除非你需要调整它们,否则它们对你的缓存线太大了。尽管大小合理的数组链接列表相当不错。 – nmichaels 2011-02-24 23:10:57
使用nmichaels。如果您希望它对于小型和大型队列来说是快速的,则阵列的链接列表是最好的。 – Tobu 2011-02-27 17:11:30