你并没有真正“增加”复杂性。正如您所说,排序是O(n * log n),搜索是O(log n)。如果您要对它们进行“正常数学运算”,那么它将是 (n+1)*log n,它仍然是 n*log n。
当您执行这样的多个步骤时,您通常会采用最高的复杂性并将其称为。毕竟,当 n 足够大时,n*log n 会使 log n 相形见绌。
可以这样想:当 n 为 1,000,000 时,n*log n 为 2000 万。log n 是 20。那么 20,000,000 和 20,000,020 有什么区别?(log n) 项无关紧要。所以 (n log n) + (log n) 就所有意图和目的而言,等于 (n log n)。即使 n 为 100,log n 也是 7。当 n 中等大时,(log n) 项也不会产生影响。
在您的特定情况下,如果您只需要搜索一次列表,那么顺序搜索就是要走的路。如果您需要多次搜索,则必须权衡 m 次搜索的成本 O(m * n) 与排序然后搜索的成本。如果您对最短时间感兴趣并且知道要搜索列表的次数,那么如果 (m*n) 小于 (n * log n),您将使用顺序搜索。否则使用排序然后二进制搜索。
但这不是唯一的考虑因素。对已排序列表进行二分搜索可提供非常快的响应时间,而线性搜索对于单个项目可能需要很长时间。如果您有能力在程序启动期间对列表进行排序,那么这可能是最好的方法,因为一旦程序运行,就会更快地找到(或找不到)项目。对列表进行排序可为您提供更好的响应时间。最好在启动期间付出排序的代价,而不是在操作期间经历非常不可预测的响应时间。或者发现您需要进行比您想象的更多的搜索。. .