【问题标题】:Smart way to filter array in c在c中过滤数组的智能方法
【发布时间】:2014-04-21 09:32:25
【问题描述】:

我目前正在用 c 编程,我想知道是否有一种聪明的方法可以过滤数组以使另一个数组满足某些条件。

一个示例问题是: 给定一个大小为 10 的随机整数数组,生成一个仅包含数组中偶数的数组。

由于很难知道有多少元素满足条件,所以我通过数组检查了两次,一次计算满足条件的元素个数,然后将相应的元素实际放入数组中。

我尝试的另一件事是创建一个大小为 10 的整数数组,在第一次运行时存储所有满足条件的索引,然后在将所需元素复制到数组时读取所需索引数组中的元素。

一般来说,数组可能很大,检查条件可能很昂贵,所以我认为这种方法不会很好。

我觉得应该有更聪明、更有效的方法来做到这一点。你能帮帮我吗?

【问题讨论】:

  • 假设最坏情况并分配足够的内存来复制整个数组?或者这不是一个合适的方法?您对原始数组的大小有一个很好的近似值吗?
  • 可以使用动态内存分配。
  • 制作类似 c++ 向量的东西。 How to replicate vector in c?
  • 顺便问一下,CUDA中可以使用动态内存分配吗?

标签: c arrays performance


【解决方案1】:

一般来说,在性能方面,您需要在速度和内存之间进行权衡。

在您的双循环版本中,您会牺牲速度来换取内存,而在单循环版本中,您会牺牲内存来换取速度。

您可以尝试每隔这么多元素动态分配空间。例如,您分配了 5 个元素的空间,当空间已满时,您再分配 5 个元素,依此类推。不幸的是,动态分配空间可能会花费大量时间。

我不知道除了您所描述的之外的任何其他方法,尽管可能有一些东西在那里。例如,在 C++ 中,您可以使用向量,它会自动调整自身大小以接受新值,方法类似于我所描述的。

【讨论】:

  • "[…] 虽然可能有一些东西。在 C++ 中 […]" 那将是来自 c++11 中 <algorithm> 标头的 std::copy_if
【解决方案2】:

int动态分配内存。
每次获得满足条件的元素并将该元素添加到动态分配的整数数组时。
使用realloc() 增加某个指针指向的int 数组的大小,并将新元素添加到该数组中。
使用计数器知道数组中的元素个数。

【讨论】:

  • 你不应该用矢量代替吗?
  • @Vladp 注意标签,这是c
  • 对不起,但是,分配每个单个元素仍然是一种浪费,使用向量方法并且每次分配更多(1,2,4,8,...)这样便宜得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
相关资源
最近更新 更多