优化算法

时间:2011-08-11 12:50:13

标签: c++ optimization variable-assignment

我需要优化这个功能,但我很难想法提高它的速度......

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都是无法更改的二进制搜索功能。有人可以帮我这个吗?

2 个答案:

答案 0 :(得分:1)

我看到的第一件事是你没有预先分配任何内存。这是优化无法更改算法的算法时要做的第一件事。您应该找出这些结构需要多少内存,并立即将其全部分配,以防止它们重复重新分配。

另外,请考虑使用排序向量而不是set。这将极大地改善查找时间 - 只是不要经常插入或者你会受伤。

答案 1 :(得分:0)

你已经明确排除了最大的优化,说getTitles()无法触及。循环内的循环内部有一个循环。中间环似乎是罪魁祸首。实际上,getTitles()强制要求线性搜索算法。如果问题的根源在其他地方,则无法优化某些内容。