Я знаю, что сложность времени проявляется для больших входных данных, но для любого входного массива. Index быстрее. Например, для n = 20.000 массив занимает 0,008 мс, а набор занимает 0,4 мс
Я протестировал массив против набора с использованием этого кода:
const NS_PER_SEC = 1e9;
const MS_PER_NS = 1e-6
function runTest(test) {
let time = process.hrtime();
test();
let diff = process.hrtime(time);
return (diff[0] * NS_PER_SEC + diff[1]) * MS_PER_NS
}
function makeRandomString() {
let length = Math.round(Math.random() * 4 + 2);
let result = '';
let characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789- ';
let charactersLength = characters.length;
for (let i = 0; i < length; i++) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
}
return result;//Math.floor(Math.random()); //result;
}
function main() {
let testCases = [10, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 40000, 100000, 10000000];
let times = 5000;
let words = [];
for (let i = 0; i < times; i++) {
words.push(makeRandomString());
}
for (let tci = 0; tci < testCases.length; tci++) {
let array = [];
const items = testCases[tci];
for (let i = 0; i < items; i++) {
array.push(makeRandomString());
}
console.log('List ' + items);
for (let i = 0; i < 10; i++) {
let res = runTest( () => {
for (let j = 0; j < times; j++) {
let tmp = array.indexOf(words[j]);
}
});
console.log(res);
}
console.log('Set ' + items);
let set = new Set(array);
for (let i = 0; i < 10; i++) {
let res = runTest(() => {
for (let j = 0; j < times; j++) {
let tmp = set.has(words[j]);
}
});
console.log(res);
}
}
}
main();
Но изменив только следующую строку:
let tmp = array.indexOf(words[j]);
в:
let tmp = array.indexOf(words[j]) !== -1;
Я получаю ожидаемые результаты - например, для n = 20.000 массив занимает 333 мс и задает 0,4 мс.
Как это может быть ? Конечно, !== -1
не может замедлить линию на порядки.