c - 用于频繁随机访问的数组或链表?

标签 c arrays data-structures linked-list comparison

我经常使用列表和数组,我想知道哪个更快,数组还是列表?

假设我们有整数数组和链表,两者都具有相同的值。

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 条记录甚至更多要保存,并且每条记录包含不止一种数据类型,这将是最好的解决方案。我将主要需要插入到最后,并且非常频繁地访问元素。

谢谢!

最佳答案

你每次都考虑这个问题是正确的;在决定是否实现数组、链表(或其他)结构时。

数组

  • + 快速随机访问。
  • + 动态分配的数组可以使用 `realloc()` 调整大小。
  • + 使用 `qsort()` 排序。
  • + 对于排序数组,可以使用 `bsearch()` 定位特定记录

  • - 必须占用连续的内存块。
  • - 对于长期存在的应用程序,数组的频繁扩大最终会导致内存空间碎片化,甚至可能最终导致 `realloc()` 失败。
  • - 插入和删除元素是昂贵的。插入一个元素(在排序数组中)需要移动插入点之外的所有数组元素。删除元素时需要类似的元素移动。

链表

  • + 不需要连续的内存块。
  • + 动态调整大小比数组更有效。 在碎片化内存使用方面优于数组
  • + 顺序访问很好,但可能仍然不如数组快(由于 CPU 缓存未命中等)。

  • - 随机访问是不可能的。
  • - 节点指针(priorNode、nextNode)的额外内存开销。

还有其他结构甚至将数组与链表结合在一起,例如哈希表、二叉树、n-树、随机访问列表等,每种结构都有不同的特性需要考虑。

关于c - 用于频繁随机访问的数组或链表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23807759/

相关文章:

java - 为 Java 应用程序中的可扩展性制作映射

c - 用于从 matlab 创建可执行 .mexa64 文件的 Makefile

ruby - 字符串中的数组条目不映射到哈希

c++ - 预处理器 IDE 是唯一的功能吗?

c# - 动态编程由 64 个按钮 (8x8) 组成的网格

c++ - 读取.txt文件并组织成二维数组

algorithm - 平衡树的批量操作

java - Java 中的正则表达式映射实现

c - 使用指针读入值

c - 使用 **ptr 将多维数组传递给函数