首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++加速地图访问

C++加速地图访问
EN

Stack Overflow用户
提问于 2015-01-08 13:13:48
回答 2查看 242关注 0票数 2

我定义了以下地图:

代码语言:javascript
复制
class xy_angle {
public:
    int x;
    int y;
    int angle;

    xy_angle(int x, int y, int angle) :x(x), y(y), angle(angle){};

};

class xy_angleComparator {
public:
    bool operator () (const xy_angle &a, const xy_angle &b) const {
        if (a.x != b.x)
            return a.x < b.x;
        else if (a.y != b.y)
            return a.y < b.y;
        else if (a.angle != b.angle)
            return a.angle < b.angle;
        else
            return false;
    }
};

std::map<xy_angle, std::pair<int, int>, xy_angleComparator> transformed_coordinates_lut_;

当我初始化包含它的类时,我会填充它:

代码语言:javascript
复制
//creating LUTs
int half_patch_size=48;
for (int x_start = -half_patch_size; x_start <= half_patch_size; x_start++){
    for (int y_start = -half_patch_size; y_start <= half_patch_size; y_start++){
        for (int angle = -314; angle < 314; angle++){
            float angle_f = (float)angle / 100.f;
            double cos_theta = cos(angle_f);
            double sin_theta = sin(angle_f);

            int x_tranformed = (int)(((float)x_start)*cos_theta - ((float)y_start)*sin_theta);
            int y_tranformed = (int)(((float)x_start)*sin_theta + ((float)y_start)*cos_theta);

            if (x_tranformed > half_patch_size)
                x_tranformed = half_patch_size;

            if (x_tranformed < -half_patch_size)
                x_tranformed = -half_patch_size;

            if (y_tranformed > half_patch_size)
                y_tranformed = half_patch_size;

            if (y_tranformed < -half_patch_size)
                y_tranformed = -half_patch_size;

            transformed_coordinates_lut_[xy_angle(x_start, y_start, angle)] = std::pair<int, int>(x_tranformed, y_tranformed);
        }
    }
}

我使用以下代码访问它:

代码语言:javascript
复制
int ax2 = transformed_coordinates_lut_[xy_angle(ax, ay, theta)].first;
int ay2 = transformed_coordinates_lut_[xy_angle(ax, ay, theta)].second;

我用一大组随机密钥测量了地图的访问时间,这是相当疯狂的。它完全控制了使用它的函数的运行时间。

有办法加快速度吗?

谢谢!

吉尔。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-08 13:20:45

您可以使用三维数组代替:f[x_start][y_start][angle]。它将占用相同(或更少)的空间,因为您无论如何都有所有可能的键。当然,您也可以使用适当的索引来模拟平面向量的三维数组.这种方法保证了您的固定时间查找。

票数 3
EN

Stack Overflow用户

发布于 2015-01-08 13:29:17

无论您使用哪个容器,此代码都是错误的:

代码语言:javascript
复制
int ax2 = transformed_coordinates_lut_[xy_angle(ax, ay, theta)].first;
int ay2 = transformed_coordinates_lut_[xy_angle(ax, ay, theta)].second;

你做了两次相同的查找!绝对缓存结果:

代码语言:javascript
复制
auto& a2 = transformed_coordinates_lut_[xy_angle(ax, ay, theta)];
int ax2 = a2.first;
int ay2 = a2.second;

现在只要加快工作的进度就行了。最不需要做的就是把一个不同的关联容器类型分拆出来:

代码语言:javascript
复制
using MapType = std::unordered_map<xy_angle,
                                   std::pair<int, int>,
                                   xy_angle_hash>; // implement this hash

这将为您提供O(1)查找,而不是您当前在使用std::map的代码中看到的O(lg N)。但是,如果您真的想花很多时间探索这个容器,我建议您只包装它,这样您就可以控制实现了:

代码语言:javascript
复制
class TransformMap
{
public:
    std::pair<int, int>& operator()(const xy_angle& );

private:
    // is it std::map?
    // or std::unordered_map?
    // or 3D-array or vector or ... ?
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27841005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档