用于时间戳组织的容器

Container for time stamp organization

本文关键字:时间戳 用于      更新时间:2023-10-16

以下是我的一些代码的摘录。

高压泵:

class message_receiver
{
    struct Chunk
    {
        // inits timestamp and other data memebers
        Chunk();
        boost::uint64_t m_timeStamp;
        bool last;
        std::vector<std::string> m_message;
        ...
    };
    struct Compare
    {
        bool operator()(const boost::shared_ptr<Chunk> p_left, const
             boost::shared_ptr<Chunk> p_right) const
        {
            return p_left.m_timeStamp > p_right.m_timeStamp;
        }
    };
    std::vector< boost::shared_ptr<Chunk> > m_chunks;
    void setTimeStamp(const boost::shared_ptr<Chunk>& p_ca, bool isNew)
   //other stuff
};
cpp

:

void message_receiver::setTimeStamp(const boost::shared_ptr<Chunk>& p_ca, bool isNew)
{
    p_ca->m_timeStamp = boost::chrono::duration_cast<boost::chrono::microseconds>(
    boost::chrono::high_resolution_clock::now().time_since_epoch()).count();
    if (isNew)
    {
        m_chunks.push_back(p_ca);
        std::push_heap(m_chunks.begin(), m_chunks.end(), Compare());
    }
    else
    {
        std::make_heap(m_chunks.begin(), m_chunks.end(), Compare());
    }
}

最终,时间戳的设置是在循环中完成的。所以这个函数被调用了很多次,这应该使所有的时间戳保持在最小堆顺序

我想把戳保持在最小的堆顺序,这样最老的时间戳就可以在我的向量的前面获得。这是用std::pop_heap完成的(没有显示)。这样做是因为我需要顺序访问。

所以我的第一个问题是在else语句中的std::make堆调用。应该这样做吗?我在文档中搜索了一段时间,我没有看到任何其他方法可以修改堆顺序,除非使用std::pop_heap或push heap,但在一种情况下,我所做的就是更新对象。我想当我这样做的时候,堆顺序可能没有得到维护?更新后是否有更好的方法来恢复堆属性?

其次,我意识到这段代码每次更新时间戳时都会调用min-heapify,这是一个复杂度为O(n)的算法。这对我来说有点慢。我考虑使用斐波那契堆,但经过一些研究后,它似乎只会在减小大小时更有效,最终不会提供很大的性能提升。经过大量的研究,我还没有能够找到一个容器,有效地满足我的需求,所以你知道任何其他容器,可能会更好地工作在这里吗?

我不认为堆是最好的选择。

有几个自组织树,它们具有你似乎想要的属性。

我建议使用这样的树(树),只是重新插入修改的元素。

Q。 经过大量的研究,我还没能找到一个容器,有效地满足我的需求,所以你知道任何其他容器,可能会更好地工作在这里吗?

我会看看Boost侵扰中的各种树容器。

  • 。http://www.boost.org/doc/libs/1_59_0/doc/html/intrusive/treap_set_multiset.html intrusive.treap_set_multiset.treap_set_multiset_containers

Boost侵扰在用法上有些特殊,但它看起来很像你在这里想要做的(因为侵扰容器从来没有拥有它们所包含的元素)。