我想要`Fast Rollup algorithm`搜索关键字

时间:2018-01-19 15:54:15

标签: c++ algorithm rollup

我目前正在处理数据处理模块, 我需要汇总多个具有聚合函数的相同记录。

例如,

如果我们有下表,

---------------------------------
| Dimension1 | Dimension2 | Sum |
---------------------------------
|      A     |      B     |  12 |
|      A     |      B     |  23 | 
|      B     |      C     |  42 |
|      C     |      B     |  33 |
|      C     |      B     |  22 |
---------------------------------

汇总之后我们得到了

---------------------------------
| Dimension1 | Dimension2 | Sum |
---------------------------------
|      A     |      B     |  35 |
|      B     |      C     |  42 |
|      C     |      B     |  55 |
---------------------------------

我使用hash id将所有相同的行收集到字典数据结构中。 (如哈希地图,树等)

以下是我的c ++代码

unsigned int Record::GetHashCode()
{
    unsigned int hash = 1;
    for(const auto dim : *this)
    {
        hash = 31*hash + dim.HashCode();        
    }

    return hash;
}

unsigned int Dimension::HashCode()
{
    // Just burrowed java's hash function
    // Please see https://en.wikipedia.org/wiki/Java_hashCode()
}

void Gatherer::Gather(const vector<Record>& records)
{
    for(const auto& record : records)
    {
        if(table.find(record.GetHashCode()) == table.end())
        {
            // No this record in table
            table[record.GetHashCode()] = record;
        }
        else
        {
            table[record.GetHashCode()]["metric"] += record["metric"];
        }
    }
}

是的,这是非常直截了当的,它的表现并不差,也不是超级好。

问题是在不久的将来可能需要添加更多维度。 尺寸数量将为80或更多。 我担心目前基于散列的聚会不适合大尺寸记录。

所以我正在寻找比我更好的汇总算法。

是否有纸张或其他快速汇总算法? 欢迎任何想法! 或者如果你很忙,也欢迎折腾搜索关键词!

谢谢,祝你有愉快的一天。

0 个答案:

没有答案