我怎样才能让一对向量像哈希表一样工作呢?

How can I make a vector of pairs work like a hash table?

本文关键字:一样 工作 哈希表 向量      更新时间:2023-10-16

我正在为一个类项目开发一个1位双峰分支预测模拟器。我正在考虑使用一个unordered_map表,但我需要能够设置大小,所以我在想使用一对向量和表。reserve(tableSize)可能是一个很好的方法来做到这一点。

然而,这让我只能线性搜索向量来查找表项,这是非常慢的。有人知道我可以为这个应用程序实现哈希函数的方法吗?

对于那些不知道分支预测表如何工作的人,关键是PC地址0x12345678,值是T或NT(分支采取或未采取)。我还需要一个解决碰撞的方法。如果进行了分支,则该位(bool)被设置为true,这将是下一个分支的预测值。如果下一个分支未被占用,则该位被设置为false或0。模拟器的目的是测量正确的预测与总分支,以获得准确性,并将其与其他方法的准确性进行比较。因此,最终目标是使用PC的2个最低有效字节(通过屏蔽它们)来定义哈希表中的位置,以存储预测值0或1。

任何帮助都将是非常感激的。

附带说明:最大表大小将是1024个条目,因此时间复杂度不会有机会真正扩展到那么高,但任何优化都是值得的,因为我将进入竞争。


编辑:

决定使用unordered_map

这是我目前得到的解决方案:

头文件

// bimodal 1-bit
class BM1Pred{
    private:
            std::ofstream &outputFile;
            //hash table with bool value mapped to addresses
            // 0 - NOT TAKEN, 1- TAKEN
            unordered_map<long long, bool> table;
            int tableSize;
    public:
            // constructor
            BM1Pred(std::ofstream& file, int size)
            : outputFile(file), tableSize(size) {}
            // deconstructor
            ~BM1Pred()
            {}
            // member functions
            void parseResults(std::string filename);
};

您仍然可以使用std::unordered_map。如果想保留一个特定的大小,可以使用std::unordered_map::reserve.

但是我不明白为什么std::map不是一个选择。它的大小动态变化。为什么需要"设置它的大小"?

为了回答您的其他问题,在这两种情况下,map[key]返回对映射到相当于key的键的值的引用,如果该键不存在,则执行插入。通过

插入或更新项
map[key] = value;
如果容器中已经存在key,则将key的值更新为value;否则,执行插入操作。你不需要自己检查任何东西

我建议使用映射容器和[]操作符。查看这个在线参考,了解更多map性能细节(例如红黑树):Big-O Cheatsheet。查看std::map和类模板std::map了解属性、成员函数、迭代器等详细信息。据我所知,映射容器在c++ 11中被实现为红黑树。我只知道在90年代末,它是作为红黑树来实现的。请记住,默认情况下顺序将从低到高(例如less<Key>)。