如何在C ++中使用数组和映射的混合?

时间:2015-03-06 12:30:06

标签: c++ arrays optimization dictionary

我的问题的简短版本:是否可以使用数组数据结构,例如,将x[0]视为x[10]作为普通数组,以及其他一些点值{{1} },x[15]作为地图? 理由:我不计算或存储任何大于索引11的其他值, 并且使整个地图成为一个地图会大大减慢计算速度。

我最初的问题:我正在编写一个快速程序来计算一个系列,其中包含x[20]x(0)=0x(1)=1x(2k)=(3x(k)+2x(Floor(k/2)))mod2^60,我的目标是列出从x(2k+1)=(2x(k)+3x(Floor(k/2)))mod2^60x(10^12)

的数字

我列出并存储了第一个x(2*10^12)值和普通数组

10^8

列出这些数字需要大约2s和750MB的内存。

我计划存储特定值,例如for (unsigned long long int i = 2; i<=100000000;i++){ if (i%2==0) { x[i] =(3*x[i/2] + 2*x[(unsigned long long int)(i/4)])&1152921504606846975; } else{ x[i] =(2*x[(i-1)/2] + 3*x[(unsigned long long int)((i-1)/4)])&1152921504606846975; } }//these code for listing unsigned long long int xtrans(unsigned long long int k){ if (k<=100000000)return x[k]; unsigned long long int result; if (k%2==0) { result =(3*xtrans(k/2) + 2*xtrans((unsigned long long int)(k/4)))&1152921504606846975; } else{ result =(2*xtrans((k-1)/2) + 3*xtrans((unsigned long long int)((k-1)/4)))&1152921504606846975; } return result; }//These code for calculating x x[2*10^8],而不计算和存储其他值以进行进一步优化。但是我必须在这种情况下使用地图。但是,在我将x的声明从数组转换为map之后,我花了90s和4.5GB内存来实现相同的列表。 所以我现在想知道是否可以使用10 ^ 8以下的索引作为数组,其余部分是否为map?

3 个答案:

答案 0 :(得分:4)

只需为您的想法写一个包装class

class MyMap {
    ...
    operator[](size_t i) {
        return ( i <= barrier_ ) ? array_[i] : map_[i];
    }
}

答案 1 :(得分:2)

TL; DR

为什么不创建一个大小为10 std::arraystd::map为成员的自定义类,并覆盖[]运算符以检查索引并从数组或映射中选择值需要。

答案 2 :(得分:0)

理论上,您可以使用ArrayWithHash库来存储字典。它将字典存储为数组和散列表的混合,类似于lua解释器中的表实现。

orderMessage

不幸的是,内存消耗是ArrayWithHash的缺点之一。它将阵列填充到2的幂级,因此阵列部分将占用1 GB。至于散列表实现,它的内存效率更低:它可能需要比存储键/值对所需的内存多三倍。