在3D空间

时间:2016-07-16 10:42:46

标签: c++ algorithm search flood-fill

我将3D空间的一部分划分为一系列1x1x1立方体,并且该部分可能具有100 ^ 3到1000 ^ 3的体积,但是,我真正感兴趣的立方体/单元格很少超过5000 -20000他们的号码。

我想要做的是找到满足我的标准的所有细胞/立方体,与所选择的相邻。但是,我不确定哪种算法最适合这样的任务。我想到的第一件事是使用常规的填充算法,但会出现以下问题:我必须存储工作区中所有单元格的信息,正如我所说,可能有多达1000 ^ 3个元素,但我需要的只有5000-20000。

所以说我的问题是:

  1. 如果我应该使用洪水填充,是否有可以在我的情况下使用的数据结构?
  2. 如果我不应该使用洪水填充,我该怎么办?

3 个答案:

答案 0 :(得分:0)

我认为这应该说明我如何解决问题的想法。完成初始处理后,您还可以考虑将set转移到vector(尽管严格来说两种结构在完全迭代摊销速度方面相似)

set<pair<int, int> > getAllPointsToProcess(const pair<int, int>& initialCell) {
    set<pair<int, int> > activatedCells; // these will be returned
    queue<pair<int, int> > toProcess;
    toProcess.push(initialCell);
    activatedCells.insert(initialCell);
    int adjacentOffsets[][] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
    pair<int, int> currentlyProcessed;
    int neighbourCell;
    while (!toProcess.empty()) {
        currentlyProcessed = toProcess.front();
        toProcess.pop();
        for (int i = 0; i < 4; i++) {
             neighbourCell.first = currentlyProcessed.first + adjacentOffsets[i][0];
             neighbourCell.second = currentlyProcessed.second + adjacentOffsets[i][1];
             if (isActive(neighbourCell) && activatedCells.find(neighbourCell) == activatedCells.end()) {
                 toProcess.push(neighbourCell);
                 activatedCells.insert(neighbourCell);
             }
        }
    return activatedCells;
} 

答案 1 :(得分:0)

正如您所指出的, Flood-Fill算法似乎与此问题相关。您遇到的问题是存储信息关于所有多维数据集是否已经访问或不访问

您有两种选择:

  1. 为每个多维数据集保留哈希值,空格: O(1000 ^ 3)时间:O(1):你不想要
  2. 维护一个访问过的多维数据集列表,空格:O(10000)时间:O(10000 2 ) :每次您需要检查是否已访问此多维数据集只是遍历已访问多维数据集的完整列表。
  3. 这只是时空交易

    P.S:我希望我的问题正确!

答案 2 :(得分:0)

我会尝试重新考虑这个需求:你想为每个单元格存储一些数据(bool访问),对于大多数单元格,它们将是相同的(也没有访问过),所以你想节省一些内存。

最近我听说过OpenVDB:http://www.openvdb.org/documentation/doxygen/

我没有使用它,但看起来它符合要求 - 它存储稀疏的体积数据并声称是内存和时间效率。