【发布时间】:2020-05-03 19:40:24
【问题描述】:
这个算法的时间和空间复杂度是多少?
我计算WC时间复杂度如下:
所有启动都是 O(1) 次
-
for 循环为 O(n),因为
- 外部 for 循环最多运行 n 次,
- 每次启动费用为 1,
- 内部 for 循环最多运行 17 次,并且
- if 语句和分配的成本分别为 1。
- 我计算 O((n+1+1)*(17+1+1+1+1+1+1+1+1+1+1+1+1) 然后忽略常数 O(n) .
-
算法第二部分的时间复杂度如下:
- 启动列表的成本为 1
- for 循环为 17
- 召开会议的费用为 1
- if 语句的成本为 1
- indexOfEndTime 初始化为 1
- for 循环为 16
- if 语句为 1
- 分配为 1 个
- O(1+(17+1+1+1+1+1+1)*(16+1+1+1+1)+1) 这只是常数值,比如 c。
T(n) = Step 1 + Step 2 + Step 3 = O(1+n+c) 这意味着我最坏情况的时间复杂度是 O(n)。
这是正确的吗?您能否确认我的每个计算是否正确?在这种情况下,最佳情况的时间复杂度将是 O(1)?考虑平均情况是否有意义?如果可以,如何解决?
最后,我计算出最佳/平均/最差空间复杂度为 O(n)。
public static List<Meeting> mergeRanges(List<Meeting> meetings) {
byte available = 0;
byte reservedBlockStart = 1;
byte reservedBlockMiddle = 2;
byte reservedBlockEnd = 3;
byte[] slots = new byte[17];
for(Meeting meeting : meetings) {
byte startTime = (byte) meeting.getStartTime();
byte endTime = (byte) meeting.getEndTime();
for(byte i = startTime; i <= endTime; i++) {
if(slots[i] == available) {
if(i == startTime) {
slots[i] = reservedBlockStart;
} else if(i == endTime) {
slots[i] = reservedBlockEnd;
} else {
slots[i] = reservedBlockMiddle;
}
} else if(slots[i] == reservedBlockStart) {
if(i != startTime) {
slots[i] = reservedBlockMiddle;
}
} else if(slots[i] == reservedBlockEnd) {
if(i != endTime) {
slots[i] = reservedBlockMiddle;
}
}
}
}
List<Meeting> condRange = new ArrayList<Meeting>();
for(byte i = 0; i < slots.length; i++) {
Meeting meet = new Meeting(0,0);
if(slots[i] == reservedBlockStart) {
byte indexOfEndTime = i;
meet.setStartTime(i);
for(byte j = (byte)(i + 1); j < slots.length; j++) {
if(slots[j] == reservedBlockEnd) {
meet.setEndTime(j);
indexOfEndTime = j;
j = (byte)(slots.length - 2);
}
}
condRange.add(meet);
i = (byte)(indexOfEndTime - 1);
}
}
return condRange;
}
【问题讨论】:
-
我只想说它是 O(n*17) = O(n)。因为第一个循环超过 n,然后第二个循环超过 17 个元素,你说它是恒定的。你经历了这两次,但 O(2*n) 与 O(n) 相同...
-
> 考虑平均情况是否有意义,如果确实如此,如何解决? “平均情况”运行时要求您了解/定义您期望看到的输入分布(我相信,作为
n的函数)。然后,您可以在给定 n 的情况下获取输入分布的平均运行时间。 -
@KevinWang 在这种情况下,我们可以说最好和最坏的情况都是 O(n),所以平均情况一定是 O(n) 也一样,无论分布是平均的。
标签: java algorithm performance big-o