问题描述
我将两个函数与performance.Now()进行了比较,因此我认为第二个函数会比第一个更好,但是相反。我不知道为什么会这样? same1在for循环中有一个indexOf和splice函数,每个函数代表一个O(n),因此我们有一个O(n ^ 2)。在same2中,我应用了频率计数器模式,其中三个用于表示O(3N)的for循环。
function same1(arr1,arr2) {
// compare length of both arrays
if (arr1.length !== arr2.length) return false
for (let i = 0; i < arr1.length; i++) {
const indexArra2 = arr2.indexOf(arr1[i] ** 2);
if (indexArra2 === -1) return false;
arr2.splice(indexArra2,1);
}
return true;
}
function same2(arr1,arr2) {
if (arr1.length !== arr2.length) return false;
let arrObj1 = {};
let arrObj2 = {};
// { 1: 1,2: 2,3: 1 }
for(let val of arr1) {
arrObj1[val] = (arrObj1[val] || 0) + 1;
}
// { 1: 1,4: 2,9: 1 }
for(let val of arr2) {
arrObj2[val] = (arrObj2[val] || 0) + 1;
}
for(key in arrObj1) {
if(!(key ** 2 in arrObj2)) {
return false;
}
if(arrObj2[key ** 2] !== arrObj1[key]) {
return false;
}
}
return true;
}
const t0 = performance.Now();
same1([1,2,3,2],[9,1,4,4]);
const t1 = performance.Now();
const t2 = performance.Now();
same2([1,4]);
const t3 = performance.Now();
console.log(`Call to same1 took ${t1 - t0} milliseconds.`);
console.log(`Call to same2 took ${t3 - t2} milliseconds.`);
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)