[DÚVIDA] Cálculo de complexidade de um algoritmo
Olá, tudo bem?
Recetemente eu estava estudando na disciplina de Algoritmos e Estruturas de Dados e desenvolvi 2 algoritmos como atividade prática. O primeiro é o Two Sum, que busca 2 números em 1 array que quando somados são iguais ao "target_number". O segundo é uma evolução do anterior, o Three Sum, faz exatamente a mesma coisa que o anterior, porém dessa vez com 3 números, com o diferencial de retornar todas as possibilidades.
Código do Two Sum:
function getTwoSum(numbers, target_sum) {
const repeat_1 = numbers.length - 1;
const numbers_length = numbers.length;
for (let index_1 = 0; index_1 < repeat_1; index_1++) {
const number_1 = numbers[index_1];
const outher_numbers = numbers.slice(index_1 + 1, numbers_length);
const repeat_2 = outher_numbers.length;
for (let index_2 = 0; index_2 < repeat_2; index_2++) {
const number_2 = outher_numbers[index_2];
const sum = number_1 + number_2;
if (sum === target_sum) {
return [number_1, number_2];
};
};
};
return [];
}
Código do Three Sum:
function getThreeSum(numbers, target_sum) {
const valid_numbers = [];
const repeat_1 = numbers.length - 1;
const numbers_length = numbers.length;
for (let index_1 = 0; index_1 < repeat_1; index_1++) {
const number_1 = numbers[index_1];
const other_numbers_1 = numbers.slice(index_1 + 1, numbers_length);
const repeat_2 = other_numbers_1.length - 1;
for (let index_2 = 0; index_2 < repeat_2; index_2++) {
const number_2 = other_numbers_1[index_2];
const other_numbers_2 = other_numbers_1.slice(index_2 + 1, numbers_length);
const repeat_3 = other_numbers_2.length;
for (let index_3 = 0; index_3 < repeat_3; index_3++) {
const number_3 = other_numbers_2[index_3];
const sum = number_1 + number_2 + number_3;
if (sum === target_sum) {
valid_numbers.push([number_1, number_2, number_3].sort());
};
};
};
};
return valid_numbers;
}
Ambos funcionam super bem, porém eu gostaria de saber qual é a complexidade de cada um, pois vi outros companheiros de turma utilizando o método Array.prototype.includes(), porém esse método é de complexidade O(n), o que faria a função getTwoSum por exemplo ter uma complexidade O(n²), já que tem o O(n) do loop For e o O(n) do método includes().
Porém na forma que eu implementei, fica algo menos complexo que O(n²) mas ao mesmo tempo não fica tão simples quanto o O(n). Vocês podem me ajudar a calcular a complexidade?