C++ 提供优化算法来处理时间戳值

C++ 提供优化算法来处理时间戳值,c++,c,C++,C,可能重复: 我需要最大限度地提高以下功能的速度: a。一个值进来了。值有两个属性-int值和长时间戳(以记号为单位) b。需要计算以前存储的小于1ms的值(从当前开始) c。需要分别计算负数和正数 d。我只需要知道是否有10个neg或pos值。我不需要保留任何关于价值观的其他知识 me thinks-分别为pos和neg实现2个环形阵列,将过期的替换为0,在pos.neg计数出现时跟踪它们 有什么想法吗?我会将这些值存储在一个由时间戳键入的min堆中,因此最年轻的值位于堆的顶部。整数值是每

可能重复:

我需要最大限度地提高以下功能的速度:

  • a。一个值进来了。值有两个属性-int值和长时间戳(以记号为单位)
  • b。需要计算以前存储的小于1ms的值(从当前开始)
  • c。需要分别计算负数和正数
  • d。我只需要知道是否有10个neg或pos值。我不需要保留任何关于价值观的其他知识
me thinks-分别为pos和neg实现2个环形阵列,将过期的替换为0,在pos.neg计数出现时跟踪它们


有什么想法吗?

我会将这些值存储在一个由时间戳键入的min堆中,因此最年轻的值位于堆的顶部。整数值是每个节点的辅助数据。然后可以使用遍历堆的递归函数实现计数。您将传递负数和正数的运行总数,以备份递归调用

在类似Python的伪代码中,类型如下:

def young_pos_and_neg(Time currtime, HeapNode p):
    if (p is not None and currtime - p.time < 1):
        posleft, negleft = young_pos_and_neg(p.leftChild())
        posright, negright = young_pos_and_neg(p.rightChild())
        totpos = posleft + posright
        totneg = negleft + negright
        if (p.intValue < 0):
            return totpos, totneg + 1
        else:
            return totpos + 1, totneg
    else:
        return 0, 0
def young_pos_和neg(时间-当前时间,HeapNode p):
如果(p不是无且currtime-p.time<1):
posleft,negleft=young_pos_和_neg(p.leftChild())
posright,negright=young_pos_和_neg(p.rightChild())
totpos=posleft+posright
总负=负左+负右
如果(p.intValue<0):
返回totpos,totneg+1
其他:
返回totpos+1,totneg
其他:
返回0,0

如果在插入新值之前在堆根上调用此函数,但将新值的时间戳作为
currtime
参数,则会得到每个值的计数。这可能不是最快的方法,但它非常简单和优雅。在C++中,可以用Stut.< /P> < P>替换元组返回值,保持2个缓冲区,以保持正片与负片分离,听起来像是一种痛苦和低效。


相反,您可以使用一个包含所有值的缓冲区,并使用
std::accumulate
来计算正负值。如果从所有元组(每个元组都有一个年龄和一个值)的集合开始,您可以首先根据年龄对集合进行排序,找到最后一个元素,即值可能会被无序接收,即先是较年轻的值,然后是较老的值?您的需求令人困惑。在第(c)部分中,您的意思是什么?一个选项是添加一个字段,该字段将存储时间戳小于1 ms的数据计数。这样做的好处是,您不需要在添加新数据时执行O(N)操作,但通过与以前的数据进行比较,您可以获得相同的结果value@staven. 是的,很抱歉我不得不这么说。时间戳可能会出问题。@skizz实际任务是在负计数达到10时将某个变量设置为-1,或者在pos达到10时将某个变量设置为1。这就是我数一数的原因。谢谢。但你需要考虑的是,累积将被称为10次每MS。矢量管理会吃掉所有这些。因为元组在开始时不会很好地添加。它们来得很快,我需要先插入/放置它们啊,那是另一个问题。我读到你的OP时,并不清楚传入的数据不能被缓存。好了,等一下。您的问题的标题是“数组中的时间戳值”。该数组在哪里?您只需
累积
即可。如果我累积,阵列将占用服务器上的所有ram。我需要抛弃旧的价值观。但原则上您可能是对的
accumulate
不复制数组中的元素。
#include <algorithm>
#include <numeric>
#include <iterator>
#include <vector>
#include <string>
#include <ctime>
using namespace std;

struct Counter 
{
    Counter(unsigned pos=0, unsigned neg=0) : pos_(pos), neg_(neg) {};
    unsigned pos_, neg_;
    Counter& operator+(int n)
    {
        if( n < 0 )
            ++neg_;
        else if( n > 0 )
            ++pos_;
        return * this;
    }
};

int main()
{
    srand((unsigned)time(0));

    vector<int> vals;
    generate_n(back_inserter(vals), 1000, []() 
    {
        return (rand() / (RAND_MAX/40)) - 20;
    });

    Counter cnt = accumulate(vals.begin(), vals.end(), Counter());
}
#include <algorithm>

#include <numeric>
#include <iterator>
#include <vector>
#include <string>
#include <ctime>
using namespace std;

struct Tuple
{
    int val_;
    unsigned age_;
};

struct Counter 
{
    Counter(unsigned pos=0, unsigned neg=0) : pos_(pos), neg_(neg) {};
    unsigned pos_, neg_;
    Counter& operator+(const Tuple& tuple)
    {
        if( tuple.age_ > 1 )
            return * this; 

        if( tuple.val_ < 0 )
            ++neg_;
        else if( tuple.val_ > 0 )
            ++pos_;

        return * this;
    }
};

int main()
{
    srand((unsigned)time(0));

    vector<Tuple> tuples;
    generate_n(back_inserter(tuples), 1000, []() -> Tuple
    {
        Tuple retval;
        retval.val_ = (rand() / (RAND_MAX/40)) - 20;
        retval.age_ = (rand() / (RAND_MAX/5));
        return retval;
    });

    Counter cnt = accumulate(tuples.begin(), tuples.end(), Counter());
}