【问题标题】:How can I make a vector of pairs work like a hash table?如何使对向量像哈希表一样工作?
【发布时间】:2014-03-24 15:29:16
【问题描述】:

我正在为一个班级项目开发一个 1 位双峰分支预测模拟器。我正在考虑为表格使用 unordered_map,但我需要能够设置大小,所以我在考虑使用成对的向量,而 table.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::map?看起来很合适。
  • @VioletGiraffe 我可以设置它的大小吗?此外,地图最初必须为空。这些值将在程序执行过程中累积在其中。
  • 您可以添加和删除元素,它是一个动态大小的容器。我不记得它是否有保留特定大小的方法,但即使没有 - 只需在循环中添加所需数量的元素并使用空白值初始化。
  • @VioletGiraffe 需要它覆盖地图元素 0-1023 之一,而不是添加另一个。如果我将其初始化为空白值,则不会添加另一个元素将表大小增加到 1025....1026...等等?
  • 当然,但是[] 操作符的功能是,如果新的键值不存在,它将被创建。我正在发布一个答案供您参考。

标签: c++ vector hashtable std-pair


【解决方案1】:

您仍然可以使用std::unordered_map。如果要预留具体尺寸,可以使用std::unordered_map::reserve

但我不明白为什么不能选择std::map。它的大小动态变化。为什么需要“设置它的大小”?

为了回答您的其他问题,map[key] 在这两种情况下都会返回对映射到等效于 key 的键的值的引用,如果该键不存在,则执行插入。所以你插入或更新一个项目

map[key] = value;

在这种情况下,如果容器中已经存在key,则为key 存储的值会更新为value;否则,执行插入。你不需要自己检查任何东西。

【讨论】:

  • 这是因为表格最多只能有一定数量的条目。
  • @Riptyde4 抱歉,这还不清楚。关联容器没有最大大小。如果要设置一个,只需在插入时检查尺寸,如果超过给定尺寸则不允许;但我看不出这在哪里有用。也许你没有在这里描述你的实际问题。
  • 添加超过限制的项目不能删除吗?
  • @Veritas 当然可以,但我仍然看不出有什么意义。我觉得我们都在这里进行了毫无意义的讨论。
  • @iavr 是的,我会为表格中的条目数量保留一个计数器。我可以发布这个项目,但相信我,你真的不想通读它......哈哈
【解决方案2】:

我建议使用地图容器和[] 运算符。查看此在线参考以了解更多map 性能详细信息(例如红黑树):Big-O Cheatsheet。查看std::mapclass template std::map 了解属性、成员函数、迭代器等详细信息。据我所知,地图容器在 C++11 中实现为红黑树。我确实知道,早在 90 年代后期,它肯定是作为红黑树实现的。请记住,默认情况下排序是从低到高(例如less&lt;Key&gt;)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-03
    • 2010-10-18
    • 2012-01-03
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    相关资源
    最近更新 更多