【问题标题】:A suitable replacement for *****double*****double 的合适替代品
【发布时间】:2012-04-11 08:29:24
【问题描述】:

我有这个大数据结构,它是一个列表列表列表列表列表的列表。显然,它的处理效率极低。运行我的应用程序所花费的大约 70% 的时间用于在列表末尾的双精度中写入零。我需要一个满足两个约束的更快的替换:

1)所有内存都必须连续分配(也就是一大块内存)

2)我必须使用通常的 A[][][][][] 语法访问这个块

就目前而言,我想使用 *double 来保存整个块并重用我的列表列表...来存储指向块中适当区域的指针。

有更好的想法吗?

【问题讨论】:

  • 请问您为什么需要大块内存?稀疏矩阵样式表示将是一个很好的替代方案,但它不适用于此(以及A[][][][][] 语法!)
  • 为什么必须使用 A[][][][][] 语法?如果你可以放松这个约束,并用一个函数调用代替它,比如 getValue(A,i,j,k,l,m),那么我相信你可以简化你的问题。
  • 澄清一下,当您说“列表”时,您不是指链表吗?
  • @JeffFoster 我需要这个块,因为我的矩阵不是稀疏的。在计算过程中,每个元素都会增加一些值
  • @Patrick 我不是唯一的开发人员。我想让其他人继续使用旧语法

标签: c list dynamic allocation replace


【解决方案1】:

如何用 2D 数组实现这一点的一个例子,我懒得做 5D 的情况,是

double **a;
a = malloc (n * sizeof(*double));
a[0] = malloc (n * m * sizeof(double));
for (int i = 1; i < n; ++i)
   a[i] = a[0][i*n];

这样你可以决定是用 a[0][i*n] 还是 a[i][j] 来索引它。内存是连续的,您只需进行两次分配即可。当然,这也需要内存中有一个空闲的 n*m*sizeof(double) 块,但是由于您要求连续分配内存,我希望这会得到满足。这也意味着您必须使用以下命令正确删除它:

free(a[0]);
free(a);

所以我会创建一个 create5Darray (n,m,k,l,t) 和一个 delete5Darray 函数来简化此操作。

【讨论】:

  • 请回答 C,而不是 C++
  • 有趣,但我正在使用 C,所以 new 和 delete 是不行的。
  • 抱歉,没看到。编辑了 C 的答案。
猜你喜欢
  • 2010-09-06
  • 2013-01-11
  • 2020-02-08
  • 2018-02-09
  • 1970-01-01
  • 2020-05-26
  • 2017-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多