C++ 如何找到共同价值
我有一个区域结构,在那里我存储上层区域。结构位于映射中,AreaID作为键。区域可以有直接上部区域或间接上部区域C++ 如何找到共同价值,c++,C++,我有一个区域结构,在那里我存储上层区域。结构位于映射中,AreaID作为键。区域可以有直接上部区域或间接上部区域 struct Area { AreaID area_id_; Name name_; std::vector<Coord> coords_; std::vector<Area*> lower_areas_; Area* upper_area_ = nullptr; bool check_area_ = false
struct Area
{
AreaID area_id_;
Name name_;
std::vector<Coord> coords_;
std::vector<Area*> lower_areas_;
Area* upper_area_ = nullptr;
bool check_area_ = false;
};
空指针将更改为指向另一个函数中的区域
我需要找到两个区域之间的公共上部区域。必须考虑到间接区域。必须选择最接近区域层次结构中两个区域的公共区域
我已经预先编写了这个代码
AreaID Datastructures::common_area_of_subareas(AreaID id1, AreaID id2)
{
std::unordered_map<AreaID, Area>::iterator area1 = areas_.find(id1);
if (area1 == areas_.end()) {
return NO_AREA;
}
std::unordered_map<AreaID, Area>::iterator area2 = areas_.find(id2);
if (area2 == areas_.end()) {
return NO_AREA;
}
bool check = true;
while (check) {
AreaID area_id1 = area1->second.upper_area_->area_id_;
AreaID area_id2 = area2->second.upper_area_->area_id_;
if () {
}
}
return common_id;
}
有没有更快的方法来找到公共区域,而不必在其中两次比较所有项目的双for循环?任何帮助都将不胜感激。我认为您无法避免两个循环 从这里开始,你可以
AreaID Datastructures::common_area_of_subareas(AreaID id1, AreaID id2)
{
std::unordered_map<AreaID, Area>::iterator areaIt1 = areas_.find(id1);
if (areaIt1 == areas_.end()) {
return NO_AREA;
}
std::unordered_map<AreaID, Area>::iterator areaIt2 = areas_.find(id2);
if (areaIt2 == areas_.end()) {
return NO_AREA;
}
const Area& area1 = areaIt1->second;
const Area& area2 = areaIt2->second;
// get list of all parent ids from first area
// use set for easier lookup
std::set<AreaID> upper_area_ids;
Area* upper_area_ptr = area1.upper_area_
while(upper_area_ptr != nullptr) {
const AreaID &parent_id = upper_area_ptr->area_id_;
upper_area_ids.insert(parent_id);
upper_area_ptr = upper_area_ptr->upper_area_;
}
// move upward from second area and return on first common parent
upper_area_ptr = area2.upper_area_;
while(upper_area_ptr != nullptr) {
const AreaID &parent_id = upper_area_ptr->area_id_;
if (upper_area_ids.find(parent_id) != upper_area_ids.end()) {
// success-case
return parent_id;
}
upper_area_ptr = upper_area_ptr->upper_area_;
}
return NO_COMMON_PARENT;
}
因为两个while循环没有嵌套,所以执行时间与树深度成线性关系,因此很难进一步优化
我这边的最后一个建议是:请尝试对变量和代码格式保持一致的命名约定。这简化了与其他人的协作,例如堆栈溢出上的响应者。进一步研究的搜索词是