【问题标题】:inserting/emplacing into a hash table where the position is already occupied插入/放置到该位置已被占用的哈希表中
【发布时间】:2013-03-30 22:38:09
【问题描述】:

假设我有这样的事情:

 struct equity{          ///keep in hash table
     long long numSharesTraded;
     list<order> buyList;
     list<order> sellList;       //put in priority queue
};

如果我想在 buyList 或 sellList 中插入一些东西,我是否有必要检查并查看我应该添加到的特定权益在哈希表中的哪个位置?...所以我最终得到了类似:

 map[i].equity.buyList.push_back(orderI'mPushing);

?

或者有没有其他方法可以让我不必每次都搜索它?据我了解,搜索特定股权的平均时间是恒定的( O(n) 最坏情况),但如果可能的话,我想摆脱这种搜索......

所以 1) 有没有一种方法可以在不搜索的情况下添加到列表中,以查看该权益是否每次都已经在哈希表中,以及 2) 如果我每次都必须搜索,这是否会导致运行时间大幅增加更长?

提前致谢

【问题讨论】:

    标签: c++ hash c++11 insert complexity-theory


    【解决方案1】:

    来自 C++11 的无序关联容器(例如 std::unordered_set,如果不能使用 C++11,Boost.Unordered 中有类似的容器)具有多个 insert() 成员函数,尤其是

    std::pair<iterator,bool> insert( const value_type& value );
    

    如果容器不包含具有等效键的元素,则将元素插入容器。这将返回一个对,该对由一个指向插入元素(或阻止插入的元素)的迭代器和一个表示插入是否发生的布尔值组成。还有范围插入功能可将一组项目(由 firstlast 迭代器分隔)插入到您的容器中。

    您可以这样使用它(如果您想在订单中存储更多东西,请使用std::unordered_map):

    struct equity { /* like before */ };
    std::unordered_set<equity> orders;
    auto result = orders.insert(orderI'mPushing);
    if (result.second) 
        // handle first-time insert by reusing result.first
    else
        // item was already stored
    

    单个插入已摊销O(1) 复杂度,这意味着插入大量N 元素具有O(N) 时间复杂度。因此,平均而言,您不应该因重复搜索而受到任何惩罚。

    但是,如果您正在进行超高频交易并且面临单个插入的实时延迟限制,您可能会选择使用常规的 std::set,它具有较慢但更可预测的 O(log N) 复杂性。

    【讨论】:

      猜你喜欢
      • 2021-10-02
      • 1970-01-01
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 2017-03-28
      相关资源
      最近更新 更多