最快的插入速度,无需重复处理少量物品

时间:2018-07-19 08:20:02

标签: c++ performance duplicates collision-detection

我正在将整数插入容器中。许多整数是重复的,在这种情况下,我只想插入一个。我预计最后一个容器中的项目不会超过100个(通常只有<10个)。

自然的解决方案是使用std::unordered_setstd::set。但是我仍然有一些疑问:

  • unordered_set为O(1),而set为O(log n),但是对于少数元素,设置速度可能更快?
  • 我的元素数量很少,因此我并不真正在乎内存的复杂性。是否有一些比unordered_set(即hashmap)更快的专门算法?

详细信息和背景:我使用常规3D网格在3D引擎中存储对象。一些对象重叠更多的单元格。当我检查哪些对象与对象A重叠时,我会遍历所有与A重叠的单元格并将所有对象插入每个单元格中

int findInCells( int n, int* cells, int* objects ){
    std::unordered_set<int> found;
    for(int i=0; i<n; i++){                                   // go over cells
        auto range = map.equal_range( cells[i] );             // list all objects in std::unordered_multimap<int,int> map;
        for(auto it = range.first; it != range.second; it++){ // 
            found.insert(it->second);
        }
    }
    int io=0;
    for(int o : found){ objects[io]=o; }
    return io;
}

我正在尝试使其不比不关心重复的简单版本慢很多。

int findInCellsNaive( int n, int* cells, int* objects ){
    // problem - what if we have same object in two different cells? we will insert it multiple times
    int io=0;
    for(int i=0; i<n; i++){                                    // go over cells
        auto range = map.equal_range( cells[i] );             // list all objects in std::unordered_multimap<int,int> map;
        for(auto it = range.first; it != range.second; it++){  // 
            outInds[io]=it->second;
            io++;
        }
    }
    return io;
} 

我正在尝试的另一种解决方案是使用额外的布尔数组来“绘制”已插入的对象,该布尔数组的大小为所有对象的数量。

bool* painted = new bool[NOBJECTS]; 
for(int i=0; i<NOBJECTS; i++){ painted[o]=true; };

inline int findInCellsPaint( int n, int* cells, int* objects ){
    int io=0;
    for(int i=0; i<n; i++){                                    // go over cells
        auto range = map.equal_range( cells[i] );             // list all objects in std::unordered_multimap<int,int> map;
        for(auto it = range.first; it != range.second; it++){  // 
            int o = it->second;
            if( painted[o] ){
                objects[io]=o;
                painted[o]=false;
                io++;
            }
        }
    }
    for(int i=0; i<io; i++){ painted[objects[o]]=true; };
    return io;
}

0 个答案:

没有答案