У меня есть этот код здесь с сайта www.interviewcake.com, который на сайте называется O (n), и после запроса разъяснения у члена команды на собеседовании они подтвердили, что это правда. Вот код:
function reverseWords(message) {
// First we reverse all the characters in the entire message
reverseCharacters(message, 0, message.length - 1);
// This gives us the right word order
// but with each word backward
// Now we'll make the words forward again
// by reversing each word's characters
// We hold the index of the *start* of the current word
// as we look for the *end* of the current word
let currentWordStartIndex = 0;
for (let i = 0; i <= message.length; i++) {
// Found the end of the current word!
if (i === message.length || message[i] === ' ') {
// If we haven't exhausted the string our
// next word's start is one character ahead
reverseCharacters(message, currentWordStartIndex, i - 1);
currentWordStartIndex = i + 1;
}
}
}
function reverseCharacters(message, leftIndex, rightIndex) {
// Walk towards the middle, from both sides
while (leftIndex < rightIndex) {
// Swap the left char and right char
const temp = message[leftIndex];
message[leftIndex] = message[rightIndex];
message[rightIndex] = temp;
leftIndex++;
rightIndex--;
}
}
Объяснение того, что член команды на собеседовании сказал следующее:
* Да, есть вложенный l oop, который делает его похожим на O (n ^ 2).
Но, по ходу проблемы, мы видим, что мы не обращаем O (n) символов в каждом внутреннем l oop ... мы только обращаем вспять каждый символ ровно в два раза Таким образом, общая стоимость в конечном итоге становится O (n).
Это сложная задача, потому что вы должны смотреть на стоимость всех обращений к reverseCharacters по всему алгоритму, а не каждый вызов на его собственный. *
Я все еще в замешательстве, поскольку мы все еще перебираем КАЖДЫЙ символ во внутреннем l oop, и чем больше строка, тем больше времени потребуется для выполнения вызова.
Я хотел открыть это для другого канала и посмотреть, смогу ли я получить дополнительную информацию об этом и почему его O (n) вместо O (n) ^ 2.
Для чтобы быть совершенно ясным, я хотел бы объяснить, почему функция reverseWords
в приведенном выше коде является O (n), а не O (n) ^ 2