【问题标题】:Reallocating space for a dynamically changing multi-dimensional array?为动态变化的多维数组重新分配空间?
【发布时间】:2015-04-19 18:18:46
【问题描述】:

我只是想知道我到底该怎么做。我知道我应该使用malloc,但我仍然不确定该怎么做。

编辑:我意识到我真正想要使用的函数是realloc

我想分配的每一行的大小都会发生变化,我还想随着程序代码的进行添加更多行。

如果您想知道为什么,我正在做一个项目,在该项目中,我读取了一个 .txt 文件,然后打印出出现次数最多的单词以及出现次数.

【问题讨论】:

  • @iharob 那你会怎么做呢?
  • Knuth 的“Literal Programming”第 12 章中有两个很好的解决方案。第一个可能是解决这个问题的最佳方法,而第二个示例是在 Unix 上如何使用一个简单的 shell 脚本。
  • @iharob 如果没有malloc,我认为你无法做到这一点。

标签: c multidimensional-array malloc


【解决方案1】:

如果您想读取行文件,我建议您使用行的链表而不是行数组,因为您可以通过保留指向最后一个元素的指针轻松附加到链表 (自己解决这个问题)。如果您愿意,以后可以将该链表转换为数组。

您还可以尝试计算文件的长度并一次性为整个文件分配所有空间(然后可能一次读取整个文件),这样您就不必重新分配每时每刻。同样,请自行制定详细信息。

对于您的特定问题,您实际上根本不需要将文件读入内存!您可以将单词与出现次数一起保存在 trie 或类似的数据结构中,并保留指向迄今为止计数最高的单词的链接。这并不是很复杂,但细节超出了这个问题的范围。

【讨论】:

  • 感谢您的建议!我会研究这些选项
  • 不幸的是我还不能投票,但它确实回答了我的问题。再次感谢。
  • 很高兴能够帮助您。恐怕你需要多加几分才能投票赞成。
【解决方案2】:

我有几个想法给你,这取决于你的程序的动态行为。

首先,您可以考虑链表而不是数组。这将使元素的删除和添加变得非常容易。如果要减少行数,首先必须删除行中的所有元素,然后删除行元素本身。

使用链表的二维矩阵:

[[_]] -> [[_]] -> [[_]] -> [[_]] -> [[_]]
  |        |        |        |        |
  v        v        v        v        v
 [_]      [_]      [_]      [_]      [_]
  |        |        |        |        |
  v        v        v        v        v
 [_]      [_]      [_]      [_]      [_]
  |        |        |        |        |
  v        v        v        v        v
 [_]      [_]      [_]      [_]      [_]

其次,如果您通常只ADD 元素,您的行的行为可能与 C++ 向量相似。使用内部变量创建每一行/行以跟踪填充水平。如果结构已满,则重新分配更大的尺寸(有消息称“双倍尺寸”是一种很好的通用方法)。

可以用来代替链表的数据结构(至少在一行内):

struct d_array(){
    int fillevel, size;
    void* memory;
}

这个数据结构需要在每次插入之前检查一些函数,如果它已满并根据需要重新分配。收缩比较困难,您可以尝试运行定期清理。一般来说,您不希望过于急切地缩小,因为以后可能会再次需要空间(如果您的行再次增长)。

【讨论】:

  • 我同意,在许多情况下,类似矢量的方法更有效。但是,链表仍可用于存储数组,这样您就可以删除整行而无需重新排序顶级数据结构。
  • 确实如此。这就是我在回答中所说的。
  • 我更关注标题中所述的动态多维数组的一般概念。然而,对于给定的单词出现问题,trie 是一个更优雅的选择。
【解决方案3】:

如果你想知道为什么,我正在做一个项目,在这个项目中,我 读取一个 .txt 文件,然后打印出数字最高的单词 出现次数,以及出现次数。

您不需要多维数组。文本按顺序存储,新行使用\n 字符表示。

但是您还需要一些关联容器,例如地图,以便您在解析文本文件时在其中存储唯一的单词。

在“伪代码”中:

for the entire text
    parse a word
        if word is not in the map insert it with count one
        else find and increment the word's count
find the word with higher count value

不幸的是,C 没有附带地图容器,您必须find one 或自己编写一个,这可能仍然超出您的编程能力。

对于单词的解析,您可以创建一个表示有效文本字符的字符数组,例如AaBbCcDd...,并为文本的每个字符检查它是否包含在该数组中。如果它被包含而前一个没有(或者这是第一个字符),你注册一个单词开始的索引,如果它不包含,并且之前你有一个,那么你标记单词的结尾,从索引范围中提取单词并继续在地图中更新它。以此类推,直到到达文本的末尾。

最后但同样重要的是,地图实际上是可选的。您也可以将单词条目作为 char * wordint count 的结构存储在常规数组中,但在许多单词的情况下,查找性能可能会很差,因为它会涉及大量字符串比较,而映射会散列字符串并查找整数而不是字符串。

【讨论】:

    猜你喜欢
    • 2011-05-31
    • 2017-03-18
    • 2020-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多