我的问题的简短版本:是否可以使用数组数据结构,例如,将x[0]
视为x[10]
作为普通数组,以及其他一些点值{{1} },x[15]
作为地图?
理由:我不计算或存储任何大于索引11的其他值,
并且使整个地图成为一个地图会大大减慢计算速度。
我最初的问题:我正在编写一个快速程序来计算一个系列,其中包含x[20]
,x(0)=0
,x(1)=1
,x(2k)=(3x(k)+2x(Floor(k/2)))mod2^60
,我的目标是列出从x(2k+1)=(2x(k)+3x(Floor(k/2)))mod2^60
到x(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?
答案 0 :(得分:4)
只需为您的想法写一个包装class
:
class MyMap {
...
operator[](size_t i) {
return ( i <= barrier_ ) ? array_[i] : map_[i];
}
}
答案 1 :(得分:2)
TL; DR
为什么不创建一个大小为10 std::array
且std::map
为成员的自定义类,并覆盖[]
运算符以检查索引并从数组或映射中选择值需要。
答案 2 :(得分:0)
理论上,您可以使用ArrayWithHash库来存储字典。它将字典存储为数组和散列表的混合,类似于lua解释器中的表实现。
orderMessage
不幸的是,内存消耗是ArrayWithHash的缺点之一。它将阵列填充到2的幂级,因此阵列部分将占用1 GB。至于散列表实现,它的内存效率更低:它可能需要比存储键/值对所需的内存多三倍。