【问题标题】:Is it possible to only iterate through assigned elements in a C array?是否可以只遍历 C 数组中分配的元素?
【发布时间】:2021-07-22 07:04:58
【问题描述】:

假设一个数组分配了 10 亿个整数,但实际上数组中只有 1000 个元素被填充。我想遍历一个 C 数组,但理想情况下只使用分配的元素。我知道有一个稀疏矩阵之类的东西可以做到这一点,但是需要第二个数组,然后我必须保持第二个数组的长度。所以我想问一下,是否可以在没有第二个数组的情况下完成它?

【问题讨论】:

  • 为什么不使用将index 映射到integer 的哈希表?
  • 它是映射缓冲区吗?
  • @tstanisl 嘿嘿,hashtable其实是个好主意,但是问题是分配的元素个数不是一定的,hashtable的“key”其实是唯一的,没有经过hash。从速度方面来说,hash table 会不会比数组方式更高效?
  • 而数组只是malloc分配的动态数组
  • 您想按索引顺序迭代元素吗?或者也许在他们的插入顺序中?插入顺序允许非常快速的插入和搜索。

标签: arrays c malloc


【解决方案1】:

不,这是不可能的。 C 没有对稀疏数组的任何内置支持。无法判断哪些元素已被分配。您可能希望使用其他类型的数据结构,例如链表,因此您只分配需要的元素。

【讨论】:

    【解决方案2】:

    你有三种方式:

    1. 一个值被视为无效。所有未分配的元素都应具有此值。
    2. 分配的元素必须从数组的开头“按顺序”排列。您只需要一个变量来保留许多已分配的元素。
    3. 有一个额外的数组,您可以在其中将值标记为有效或无效。一点就够了
    #include <stddef.h>
    #include <limits.h>
    
    #define NBITS(v)       (CHAR_BIT * sizeof(v))
    
    int isvalid(unsigned long long *validArray, size_t pos)
    {
        unsigned long long mask  = 1ULL << (pos % NBITS(*validArray));
        return !!(array[pos/NBITS(*validArray)] & mask);
    }
    

    【讨论】:

      【解决方案3】:

      一种选择不是简单地存储值,而是存储一个结构

      struct DataPoint
      { 
         bool valid;
         int value;
      }
      

      然后确保初始化为无效开始。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-13
        • 2021-07-02
        • 1970-01-01
        • 2012-12-03
        • 2021-04-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多