You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
113 lines
2.7 KiB
JavaScript
113 lines
2.7 KiB
JavaScript
"use strict";
|
|
|
|
const timeCall = require("time-call");
|
|
const syncpipe = require("syncpipe");
|
|
|
|
// let list1 = [ 2, 9, 10, 12, 13, 16, 19, 21, 23, 24, 33, 43, 46, 48, 49, 58, 60, 61, 69, 71, 74, 75, 78, 79, 80, 82, 85, 86, 88, 90, 91, 92, 95, 98, 99 ];
|
|
// let list2 = [ 3, 4, 5, 9, 10, 12, 13, 14, 16, 17, 19, 23, 24, 28, 29, 31, 32, 34, 37, 41, 42, 44, 45, 48, 50, 51, 52, 55, 56, 64, 69, 75, 77, 79, 85, 87, 91, 92, 93, 94, 98 ];
|
|
// let list3 = [ 2, 5, 8, 9, 15, 23, 27, 31, 32, 33, 34, 36, 37, 40, 43, 45, 53, 54, 56, 58, 60, 63, 64, 66, 71, 72, 74, 75, 78, 84, 89, 91, 94, 96, 97, 98, 99 ];
|
|
|
|
function randomIntegers(count, limit) {
|
|
return syncpipe(new Array(count), [
|
|
_ => _.fill(0),
|
|
_ => _.map(() => Math.ceil(Math.random() * limit)),
|
|
_ => new Set(_),
|
|
_ => Array.from(_),
|
|
_ => _.sort((a, b) => a - b)
|
|
]);
|
|
}
|
|
|
|
let list1 = randomIntegers(1000, 2000);
|
|
let list2 = randomIntegers(1000, 2000);
|
|
let list3 = randomIntegers(1000, 2000);
|
|
|
|
console.log(list1);
|
|
|
|
function intersectThree(list1, list2, list3) {
|
|
let pointer1 = 0;
|
|
let pointer2 = 0;
|
|
let pointer3 = 0;
|
|
|
|
let results = [];
|
|
|
|
while (pointer1 < list1.length && pointer2 < list2.length && pointer3 < list3.length) {
|
|
let value1 = list1[pointer1];
|
|
let value2 = list2[pointer2];
|
|
let value3 = list3[pointer3];
|
|
|
|
if (value1 === value2 && value1 === value3) {
|
|
results.push(value1);
|
|
|
|
pointer1++;
|
|
pointer2++;
|
|
pointer3++;
|
|
} else {
|
|
let lowest = Math.min(value1, value2, value3);
|
|
|
|
if (value1 === lowest) { pointer1++; }
|
|
if (value2 === lowest) { pointer2++; }
|
|
if (value3 === lowest) { pointer3++; }
|
|
}
|
|
}
|
|
|
|
return results;
|
|
}
|
|
|
|
function intersectSets(list1, list2, list3) {
|
|
let set2 = new Set(list2);
|
|
let set3 = new Set(list3);
|
|
|
|
return list1.filter((value) => set2.has(value) && set3.has(value));
|
|
}
|
|
|
|
function intersectSets2(list1, list2, list3) {
|
|
let set2 = new Set(list2);
|
|
let set3 = new Set(list3);
|
|
|
|
let results = [];
|
|
|
|
for (let value of list1) {
|
|
if (set2.has(value) && set3.has(value)) {
|
|
results.push(value);
|
|
}
|
|
}
|
|
|
|
return results;
|
|
}
|
|
|
|
function tryOut(ITERATIONS) {
|
|
console.log(`# ${ITERATIONS} iterations, time is per iteration`);
|
|
|
|
let result1 = timeCall(() => {
|
|
for (let i = 0; i < ITERATIONS; i++) {
|
|
intersectThree(list1, list2, list3);
|
|
}
|
|
});
|
|
|
|
let result2 = timeCall(() => {
|
|
for (let i = 0; i < ITERATIONS; i++) {
|
|
intersectSets(list1, list2, list3);
|
|
}
|
|
});
|
|
|
|
let result3 = timeCall(() => {
|
|
for (let i = 0; i < ITERATIONS; i++) {
|
|
intersectSets2(list1, list2, list3);
|
|
}
|
|
});
|
|
|
|
console.log({
|
|
pointer: result1.time / ITERATIONS / 1e3 + "us",
|
|
setsFilter: result2.time / ITERATIONS / 1e3 + "us",
|
|
setsFor: result3.time / ITERATIONS / 1e3 + "us"
|
|
});
|
|
}
|
|
|
|
tryOut(100);
|
|
tryOut(1000);
|
|
tryOut(10000);
|
|
tryOut(100000);
|
|
|
|
|
|
// console.log(intersectThree(list1, list2, list3));
|