这个算法的时间复杂度和空间复杂度是什么?
我将WC时间复杂度计算如下:
1. 所有初始化每个都为O(1) 2. 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)。
3. 第二部分算法的时间复杂度如下: - 初始化List成本为1 - for循环为17 - 初始化Meeting成本为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) = 步骤1 + 步骤2 + 步骤3 = O(1+n+c),这意味着它的最坏情况时间复杂度是O(n)。这个计算正确吗?你能确认我的每个计算都正确吗?在这种情况下,最好情况的时间复杂度为O(1)?考虑平均情况有意义吗?如果有,如何找到平均情况?
最后,我计算出最好/平均/最坏空间复杂度为O(n)。
我将WC时间复杂度计算如下:
1. 所有初始化每个都为O(1) 2. 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)。
3. 第二部分算法的时间复杂度如下: - 初始化List成本为1 - for循环为17 - 初始化Meeting成本为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) = 步骤1 + 步骤2 + 步骤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;
}
n
的函数)。然后,您可以在给定n的情况下,对输入分布进行平均运行时间计算。 - Kevin Wang