我经常使用列表和数组,我想知道什么是更快,数组或列表?
假设我们有整数数组和链表,两者都有相同的值。
int array_data[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
typedef struct node_data{
int data;
struct node_data * next;
} list_data;
____ ____ ____ ____ ____ ____ ____ ____ ____ ____
list_data *d = -> | 1| -> | 2| -> | 3| -> | 4| -> | 5| -> | 6| -> | 7| -> | 8| -> | 9| -> |10| -> NULL
如果我想在索引6上获取array_data的值,我将使用array_data[6]
并获得值7.但是如果我想从列表中获取相同的数据怎么办?我是否应该从开始算起并计算跳数,直到我问到索引get_data(d,6)
?或者有更好的方法来做到这一点?
int get_data(list_data *l, int index){
int i = 0;
while(l != NULL){
if(index == i){
return l -> data;
}
i++;
l = l -> next;
}
return 0;
}
如何使用指针列表来列出元素?如果我有超过100,000条记录甚至更多要保存,这将是最好的解决方案,每条记录包含多个数据类型。我最需要插入到最后,并经常访问元素。
谢谢!
答案 0 :(得分:3)
数组在访问时间不变;即访问任何元素需要相同的时间。
列表不是这样:平均花费的时间与元素数量呈线性关系。
但是,与数组不同,列表不需要连续的内存块。因此,附加到数组会导致内存重新分配,这可能会对您存储的数组元素的任何指针造成严重破坏。
在数组和列表之间进行选择时,这些要点是主要考虑因素。
答案 1 :(得分:3)
每次都考虑这个问题是正确的;在决定是否实现数组,链表(或其他)结构时。
ARRAY
链表
还有其他结构甚至将数组与链表组合在一起,例如哈希表,二叉树,n树,随机访问列表等,每种结构都有各种需要考虑的特性。
答案 2 :(得分:0)
还有第三种方式:随机访问列表(单链接或双链接,或者根本不链接)。 最坏的情况是访问O(log(n)),并且不需要有序数据。 这不是一个跳过列表(不可靠)。 您可以在本文中找到信息:Random Access List