怎样才能使这个代码在C++中运行得更快呢?这个代码需要很多时间来运行。目的是确定需要多少个登机口来处理一个规定的到达和离开时间表。
#include <vector>
struct Airplane {
int arrival_time_seconds;
int departure_time_seconds;
};
class Schedule {
private:
const std::vector<Airplane> airplanes_;
public:
Schedule(const std::vector<Airplane>& airplanes) :
airplanes_(airplanes) {}
int MaximumNumberOfPlanes() const {
int rv = 0;
for (const Airplane& airplane : airplanes_) {
int num_planes = NumberOfPlanes(airplane.arrival_time_seconds);
if (num_planes > rv) {
rv = num_planes;
}
}
return rv;
}
private:
int NumberOfPlanes(int time_seconds) const {
int rv = 0;
for (const Airplane& airplane : airplanes_) {
if (airplane.arrival_time_seconds < time_seconds &&
time_seconds <= airplane.departure_time_seconds) {
rv++;
}
}
return rv;
}
};
2条答案
按热度按时间mznpcxlj1#
该算法被写成一个O(N²)问题,但它可以很容易地被改写成一个O(N)问题。
首先你需要按到达时间对飞机向量排序,这样向量就是一个排序序列,每次你添加一架新飞机,你都必须按顺序插入它,你甚至可以考虑用
std::map
作为容器。然后你在“当前”飞机上向前走,同时保持指针指向第一架飞机,两者的差值就是你当前停靠的飞机数量。
一旦你增加了你的索引,你就检查“最后一架”飞机的起飞时间是否小于新的当前时间,如果是,你就增加。
那应该是非常快的。
或者,如果你不想保留一个有序数组,你可以建立一个单独的向量,只包含时间。
Godbolt链接:https://godbolt.org/z/5de9corEM
4si2a6ki2#
很多人都说这是O(N),在某种程度上是可能的,至少我能把它变成O(max(N,86400)),这比你的版本在 N〉294时要好,比O(NlogN)在 N〉6788时要好。
我假设如果一架飞机第二天起飞,它有一个
departure_time_seconds = 86400
(一天中的秒数),而所有arrival_time_seconds
都小于86400。你可以用O(N)编译一个飞机数量变化的向量,然后用它来计算机场中每秒钟的飞机数量,时间为O(86400):
具有一定定时的测试程序:
这给出(在我的笔记本电脑上):