1

如果 list2 包含超过 200,000 个条目,则以下代码似乎无法在可容忍的时间内完成。

    QStringList list1; 
    QStringList list2=getalist();
    int count=list2.count();
    for(int j=0;j<count;j++)
    {
        QString e=list2[j];
        if(!list1.contains(e,Qt::CaseInsensitive))
        {
            list1<<e;
        }
    }

瓶颈是什么,我该如何优化它?

4

2 回答 2

1

瓶颈是选择QStringList作为该任务的容器。它是一个QList<QString>并且我相信它使用线性搜索来实现该功能contains

最好的解决方案是使用基于树的容器,如 std::set 或基于散列的容器QSet(是的,它基于散列,与 std::set 相反)。来自 Qt文档

QSet 是 Qt 的通用容器类之一。它以未指定的顺序存储值并提供非常快速的值查找。在内部,QSet 被实现为 QHash。

于 2020-09-18T14:38:18.320 回答
1

您的代码似乎更新list1为所有唯一元素的并集,list1list2受到不区分大小写的比较。所以像(未经测试)......

QStringList list1;
QStringList list2 = getalist();

struct case_insensitive_compare {
    bool operator() (const QString &l, const QString &r) const
    {
        return l.compare(r, Qt::CaseInsensitive) < 0;
    }
};

std::set<QString, case_insensitive_compare> set1(list1.begin(), list1.end());
set1.insert(list2.begin(), list2.end());
list1 = QStringList(set1.begin(), set1.end());
于 2020-09-18T14:43:47.633 回答