QT开发积累——通过利用hash显著提高程序运行的效率
for(PointData &point: DataPoint001){
// 点周围的线
QList<int> lineIndex;
for(LineData &line:DataLine001){
if(line.pointIndex.contains(point.pointIndex)){
lineIndex.append(line.lineIndex);
}
}
point.lineIndex = lineIndex;
// 点周围的面
QList<int> faceIndex;
for(FaceData &face:DataFace001){
if(face.points.contains(point.point)){
faceIndex.append(face.faceIndex);
}
}
point.faceIndex = faceIndex;
}
将嵌套的循环拆开并优化,有可能显著提高运行速度。当前的嵌套循环的时间复杂度是 O(n⋅m)O(n⋅m)(其中 n 是 DataPoint001
的大小,m 是 DataLine001
或 DataFace001
的大小)。拆开循环并使用适当的数据结构,可以降低时间复杂度,从而提高性能。
优化思路
DataLine001
和 DataFace001
中的点与线、面的对应关系预处理为哈希表,这样可以在常数时间内完成查找。优化后的代码
以下是优化后的代码示例:
// 假设PointData、LineData、FaceData结构如下:
struct PointData {
int pointIndex;
QList<int> lineIndex;
QList<int> faceIndex;
// 其他成员
};
struct LineData {
int lineIndex;
QList<int> pointIndex;
// 其他成员
};
struct FaceData {
int faceIndex;
QList<int> points;
// 其他成员
};
// 初始化数据结构
QList<PointData> DataPoint001;
QList<LineData> DataLine001;
QList<FaceData> DataFace001;
// 预处理:构建点到线、点到面的映射
QHash<int, QList<int>> pointToLinesMap;
QHash<int, QList<int>> pointToFacesMap;
// 预处理线数据
for (const LineData& line : DataLine001) {
for (int pointIndex : line.pointIndex) {
pointToLinesMap[pointIndex].append(line.lineIndex);
}
}
// 预处理面数据
for (const FaceData& face : DataFace001) {
for (int point : face.points) {
pointToFacesMap[point].append(face.faceIndex);
}
}
// 更新每个点的lineIndex和faceIndex
for (PointData& point : DataPoint001) {
point.lineIndex = pointToLinesMap.value(point.pointIndex);
point.faceIndex = pointToFacesMap.value(point.pointIndex);
}
解释
pointToLinesMap
和 pointToFacesMap
分别存储每个点到相关联的线索引和面索引的映射。这一步只需要遍历一次 DataLine001
和 DataFace001
,时间复杂度是 O(m)O(m),其中 m 是 DataLine001
或 DataFace001
的大小。lineIndex
和 faceIndex
时,通过哈希表进行查找。这样,每次查找都是常数时间 O(1)O(1),总的时间复杂度是 O(n)O(n),其中 n 是 DataPoint001
的大小。优化效果
原始代码的时间复杂度是 O(n⋅m)O(n⋅m),优化后的代码时间复杂度是 O(n+m)O(n+m),显著降低了计算量,尤其是在数据量较大的情况下,性能提升会更加明显。
QT开发积累——通过利用hash显著提高程序运行的效率
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。