在C中,在内存管理,链表或数组方面效率更高?
对于我的程序,我可以使用其中一个或两个。我想在开始之前考虑这一点。
答案 0 :(得分:2)
链接列表和数组都有好的和坏的一面。
<强>阵列强>
在特定位置访问需要O(1)时间,因为初始化的内存对于数组是连续的。因此,如果第一个位置的地址是A,那么第五个元素的地址是A + 4.
如果要在某个位置插入数字,则需要O(n)时间。因为您必须在该特定位置之后移动每个数字并且还增加数组的大小。
关于搜索元素。考虑到数组已排序。你可以进行二进制搜索并访问每个位置是O(1)。所以你按二进制搜索的顺序进行搜索。如果数组没有排序,你必须遍历整个数组,所以O(n)时间。
删除与插入完全相反的内容。你必须从你删除它的地方开始移动所有数字。您可能还需要重新创建阵列以提高内存效率。所以O(n)
内存必须是连续的,这在旧的x86机器上可能是一个问题 有64k段。
解放是一项操作。
<强>链表强>
在特定位置访问需要花费O(n)时间,因为您必须遍历整个列表才能到达特定位置。
如果您想在某个位置插入一个数字并且指针已经在该位置,则需要花费O(1)时间来插入新值。
关于搜索元素。无论数字如何排列,您都必须逐个遍历数字,以便找到您的特定数字。所以它总是O(n)
关于删除与插入完全相反的内容。如果您已经通过某个指针知道位置,则假设列表是这样的。 p-&gt; q-&gt; r你要删除q你需要的是p到r的下一个。没有别的。所以O(1)[鉴于你知道指向p
]
记忆分散。使用简单的实现,可能会导致高速缓存一致性,并且整体占用可能很高,因为内存分配系统对每个节点都有开销。然而,仔细的编程可以解决这个问题。
删除需要为每个节点单独调用,但是仔细编程可以解决这个问题。
因此,根据您要解决的问题,您必须选择其中一个。
答案 1 :(得分:2)
链接列表使用更多内存,来自链接列表本身和内存管理器内部,因为您正在分配许多单独的内存块。
这并不意味着效率会降低,具体取决于你在做什么。
虽然链表使用更多内存,但添加或删除元素非常有效,因为它根本不需要移动数据,而调整动态数组的大小意味着你必须分配一个全新的区域。内存以适应添加/删除项目的新数组和修改后的数组。您也可以在不移动数据的情况下对链接列表进行排序。
另一方面,由于缓存,路径预测等因为数据按顺序放置在内存中,所以数组的迭代速度可以大大加快。
哪一个更适合你,真的取决于应用程序。