我需要优化这个功能,但我很难想法提高它的速度......
bool generateShortestpathLink (const string& start, const string& finish, const book& db) {
vector <lib> bks;
vector <string> authors;
set <lib> storeBKS;
set <string> storeAuthor;
queue <pathLink> q;
pathLink p(start);
q.push(p);
while (!q.empty()) {
p = q.front();
if (p.getLength() > 6) return false;
db.getTitles(p.getLastPlayer(), bks);
for (int x = 0; x < (int) bks.size(); x++) {
const film& newBook = bks[x];
if (storeBKS.find(newBook) != storeBKS.end()) continue;
db.getAuthors(newBook, authors);
storeBKS.insert(newBook);
for (int i = 0; i < (int) authors.size(); i++) {
if (storeAuthor.find(authors[i]) != storeAuthor.end()) continue;
pathLink newpathLink(p);
newpathLink.addConnection(newBook, authors[i]);
if (authors[i] == finish) return true;
storeAuthor.insert(authors[i]);
q.push(newpathLink);
}
}
q.pop();
}
return false;
}
它假设是BFS的算法,它创建了用于将不同书籍与作者连接起来的路径。 getTitles()
和getAuthors
都是无法更改的二进制搜索功能。有人可以帮我这个吗?
答案 0 :(得分:1)
我看到的第一件事是你没有预先分配任何内存。这是优化无法更改算法的算法时要做的第一件事。您应该找出这些结构需要多少内存,并立即将其全部分配,以防止它们重复重新分配。
另外,请考虑使用排序向量而不是set
。这将极大地改善查找时间 - 只是不要经常插入或者你会受伤。
答案 1 :(得分:0)
你已经明确排除了最大的优化,说getTitles()
无法触及。循环内的循环内部有一个循环。中间环似乎是罪魁祸首。实际上,getTitles()
强制要求线性搜索算法。如果问题的根源在其他地方,则无法优化某些内容。