在数组和链表之间使用内存

时间:2017-02-27 20:46:34

标签: c memory-management

在C中,在内存管理,链表或数组方面效率更高?

对于我的程序,我可以使用其中一个或两个。我想在开始之前考虑这一点。

2 个答案:

答案 0 :(得分:2)

链接列表和数组都有好的和坏的一面。

<强>阵列

  1. 在特定位置访问需要O(1)时间,因为初始化的内存对于数组是连续的。因此,如果第一个位置的地址是A,那么第五个元素的地址是A + 4.

  2. 如果要在某个位置插入数字,则需要O(n)时间。因为您必须在该特定位置之后移动每个数字并且还增加数组的大小。

  3. 关于搜索元素。考虑到数组已排序。你可以进行二进制搜索并访问每个位置是O(1)。所以你按二进制搜索的顺序进行搜索。如果数组没有排序,你必须遍历整个数组,所以O(n)时间。

  4. 删除与插入完全相反的内容。你必须从你删除它的地方开始移动所有数字。您可能还需要重新创建阵列以提高内存效率。所以O(n)

  5. 内存必须是连续的,这在旧的x86机器上可能是一个问题 有64k段。

  6. 解放是一项操作。

  7. <强>链表

    1. 在特定位置访问需要花费O(n)时间,因为您必须遍历整个列表才能到达特定位置。

    2. 如果您想在某个位置插入一个数字并且指针已经在该位置,则需要花费O(1)时间来插入新值。

    3. 关于搜索元素。无论数字如何排列,您都必须逐个遍历数字,以便找到您的特定数字。所以它总是O(n)

    4. 关于删除与插入完全相反的内容。如果您已经通过某个指针知道位置,则假设列表是这样的。 p-&gt; q-&gt; r你要删除q你需要的是p到r的下一个。没有别的。所以O(1)[鉴于你知道指向p]

    5. 的指针
    6. 记忆分散。使用简单的实现,可能会导致高速缓存一致性,并且整体占用可能很高,因为内存分配系统对每个节点都有开销。然而,仔细的编程可以解决这个问题。

    7. 删除需要为每个节点单独调用,但是仔细编程可以解决这个问题。

    8. 因此,根据您要解决的问题,您必须选择其中一个。

答案 1 :(得分:2)

链接列表使用更多内存,来自链接列表本身和内存管理器内部,因为您正在分配许多单独的内存块。

这并不意味着效率会降低,具体取决于你在做什么。

虽然链表使用更多内存,但添加或删除元素非常有效,因为它根本不需要移动数据,而调整动态数组的大小意味着你必须分配一个全新的区域。内存以适应添加/删除项目的新数组和修改后的数组。您也可以在不移动数据的情况下对链接列表进行排序。

另一方面,由于缓存,路径预测等因为数据按顺序放置在内存中,所以数组的迭代速度可以大大加快。

哪一个更适合你,真的取决于应用程序。