Какова временная и пространственная сложность этого алгоритма?
Я рассчитываю временную сложность WC следующим образом:
все инициации должны быть O(1) каждый
для цикла будет O (n), потому что
- outer for loop to run max of n times,
- инициации будут стоить 1 каждое,
- внутренний цикл for выполняется максимум 17 раз, и
- операторы if и присваивания будут стоить 1 каждый.
- Я вычисляю O((n+1+1)*(17+1+1+1+1+1+1+1+1+1+1+1+1+1), а затем игнорирую константу O(n).
временная сложность второй части алгоритма будет следующей:
- Initiation of List to be of cost 1
- чтобы цикл был 17
- Инициация встречи будет стоить 1
- если оператор будет стоить 1
- инициирование indexOfEndTime равным 1
- чтобы цикл был 16
- если оператор должен быть 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;
}