【问题标题】:Dynamically extending array C动态扩展数组 C
【发布时间】:2013-03-31 23:01:36
【问题描述】:

我有一个程序可以计算文本文件中出现的单词并将它们存储在一个数组中。到目前为止,我使用的是固定数组,一切正常,但现在我想将其更改为动态数组,这样就不会浪费/需要任何内存。我知道必须使用 malloc 和 realloc 来完成此操作,但我真的不明白如何去做。

我的第一个想法是简单地计算文本文件中的单词,然后为所有单词分配足够的空间,但这会浪费空间,因为重复的单词会增加计数器,但不会再次添加到数组中。

这种方法听起来是否有意义并且是实现它的最佳方法?如果我首先 malloc 一个小数组,就足以找到一个单词及其计数器。然后每次我找到一个需要添加到数组中的新单词时,只需 realloc 足以容纳另一个单词和计数器。如果它是重复的,则不需要 realloc,因为现有的计数器只会增加。

【问题讨论】:

  • K&R 的“C 编程语言”(完整实现,详细解释)中给出了另一个与动态扩展数组无关的问题的解决方案。他们使用二叉树来记录单词及其频率。这不仅对字数统计问题有最佳的内存使用,而且效率很高,是一个非常干净的解决方案。无论如何,如果你正在使用 C 编程,阅读这本书会对你有很大帮助。

标签: c malloc realloc


【解决方案1】:

通常最好不要以 100% 的内存利用率为目标(就交易速度与内存使用而言);特别是如果您的程序只运行有限的时间,那么使用比需要更多的内存确实不会“花费”很多,总体而言。

一种典型的方法是使动态数组具有初始大小,例如 8 或 128 或其他任何值,然后在填满时将其加倍。

与在填满时仅将大小增加 1 相比,这减少了重新分配的次数(代价高昂)。当然,这会浪费一些内存。

【讨论】:

  • 这是针对我们的一个项目,目的之一是“利用有效的内存分配”。我读过很多人推荐加倍方法。所以在我“添加一个新词”之前,我必须检查数组是否已满,如果不继续,是否为 realloc?这是一个结构数组,所以我不确定如何首先进行内存分配。
猜你喜欢
  • 1970-01-01
  • 2018-03-12
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
  • 2016-11-22
  • 1970-01-01
  • 2014-02-26
相关资源
最近更新 更多