使用C ++对大量元素进行分组的最快方法

时间:2015-09-02 18:29:37

标签: c++ algorithm c++11 optimization

我需要一种方法来快速将大量连接(目前为300k)分组到每组具有允许的最大元素数的组中,当前为14k,并且同一组中的所有连接都不能连接到同一组点。基本上,每个连接都在两点之间,我需要将它们分组到桶中,其中桶中的连接不共享点。希望这是有道理的。

这是我到目前为止所做的事情,虽然有效但速度很慢:

for (size_t i = 0; i < ConnectionGroups.size(); i++)
{
    auto& group = ConnectionGroups[i];
    if (group.size() < MaxConnectionGroupSize) // Has room for us...
    {
        int validGroupIdx = i;
        for (size_t gIdx = 0; gIdx < group.size(); gIdx++)
        {
            const auto groupConnection = ConnectionsQuickAccess[group[gIdx]];

            // Are we directly connected to one of the Connections in this group by one degree...
            if (Connection.Point1 == groupConnection->Point1 || Connection.Point1 == groupConnection->Point2 ||
                Connection.Point2 == groupConnection->Point1 || Connection.Point2 == groupConnection->Point2)
            {
                validGroupIdx = -1;
                break; // We are, check the next group
            }
        }

        if (validGroupIdx != -1)
        {
            ConnectionGroups[i].push_back(Connection.Slot);
            Connection.Group = i;
            return;
        }
        else
            continue;
    }
}

// All groups are full, create a new group
vector<int> newGroup;
newGroup.push_back(Connection.Slot);
ConnectionGroups.push_back(newGroup);

此代码需要29.68秒才能通过300k连接,有更快的方法吗?或者可能采用不同的方法?

谢谢!

1 个答案:

答案 0 :(得分:2)

似乎发布的代码处理一个连接,即,它被称为n次,其中n是连接数。该算法显然是O(n * n):添加新连接所需的时间增长为二次方 - 这是您通常不想要的。

除非内存是主要限制因素,否则我会为每个组简单存储一个包含所有现有端点的哈希,并检查其中的内容,即

中的内容。
for (std:size_t i(0); i != ConnectionGroups.size(); ++i) {
    if (ConnectionGroups[i].size () < MaxConnectionGroupSize)
        && !ConnectionGroups[i].usesEndPoint(Connection.Point1)
        && !ConnectionGroups[i].usesEndPoint(Connection.Point2)) {
        ConnectionGroups[i].addEndPoint(Connection.Point1);
        ConnectionGroups[i].addEndPoint(Connection.Point2);
        ConnectionGroups[i].addConnection(Connection);
    }
}

显然,ConnectionGroups[i]将是连接的组合和使用相应函数访问的端点的散列。