Javascript 优化阵列中奇数出现的时间复杂度
我有这样一段代码,它将数组中的相同元素配对,期望数组具有奇数长度,并且它应该返回唯一无法获得配对的元素。因此,我编写的代码写得很好,对于较小的数组来说效果很好,但是对于超过10亿的非常大的整数,时间复杂度变为O(N**2),然后需要重构代码,以便在大型数组和大型数组元素中获得更好的性能。下面是我的代码Javascript 优化阵列中奇数出现的时间复杂度,javascript,arrays,time-complexity,Javascript,Arrays,Time Complexity,我有这样一段代码,它将数组中的相同元素配对,期望数组具有奇数长度,并且它应该返回唯一无法获得配对的元素。因此,我编写的代码写得很好,对于较小的数组来说效果很好,但是对于超过10亿的非常大的整数,时间复杂度变为O(N**2),然后需要重构代码,以便在大型数组和大型数组元素中获得更好的性能。下面是我的代码 function solution(A) { if(!Array.isArray(A)) return 0; var temp = new Array(A.length); var positi
function solution(A) {
if(!Array.isArray(A)) return 0;
var temp = new Array(A.length);
var position = 0;
for(let i=0; i<A.length; i++){
if(temp.includes(A[i])){
position = temp.indexOf(A[i]);
index = A.indexOf(A[i]);
delete temp[position];
delete A[index];
delete A[i];
}else{
temp[i] = A[i];
}
}
for(let j=0; j<A.length; j++){
if(A[j] !== undefined) return A[j];
else continue;
}
}
函数解决方案(A){
如果(!Array.isArray(A))返回0;
var temp=新阵列(A.长度);
var位置=0;
对于(设i=0;i我们可以尝试使用对象的强大功能来查找一次迭代中的奇数。对象是键-值对。因此,访问对象键的权限是O(1)
。因此,当我们遇到相同的元素时,我们只需增加值:
const hashMap = arr.reduce((a, c)=> {
a[c] = a[c] || 0;
a[c] += 1;
return a;
},{})
const result = Object.keys(hashMap).filter(key => hashMap[key] === 1);
例如:
让arr=[2,3,6,7,3,5,5,6,2];
常量hashMap=arr.reduce((a,c)=>{
a[c]=a[c]| | 0;
a[c]+=1;
返回a;
},{})
const result=Object.keys(hashMap.filter)(key=>hashMap[key]==1);
console.log(result);
我们可以通过使用object的强大功能来尝试在一次迭代中找到奇数。object是键-值对。因此访问object key的权限是O(1)
。因此,当我们遇到相同的元素时,我们只需增加值:
const hashMap = arr.reduce((a, c)=> {
a[c] = a[c] || 0;
a[c] += 1;
return a;
},{})
const result = Object.keys(hashMap).filter(key => hashMap[key] === 1);
例如:
让arr=[2,3,6,7,3,5,5,6,2];
常量hashMap=arr.reduce((a,c)=>{
a[c]=a[c]| | 0;
a[c]+=1;
返回a;
},{})
const result=Object.keys(hashMap.filter)(key=>hashMap[key]==1);
console.log(result);
您可以使用对象仅存储非成对元素。
请注意,您不需要将所有数组元素及其计数存储在对象中,然后按计数进行过滤(就像@stepp那样)
一切都在一个循环中完成。
函数返回所有非成对元素的数组:
const solution=A=>Array.isArray(A)?
对象密钥(
A.减少((r,k)=>{
r[k]=r[k]| | 0;
如果(++r[k]>1)删除r[k];
返回r;
}, {})
) : [];
log(解决方案([2,3,6,7,3,5,5,6,2]))
您可以使用对象仅存储非成对元素。
请注意,您不需要将所有数组元素及其计数存储在对象中,然后按计数进行过滤(就像@stepp那样)
一切都在一个循环中完成。
函数返回所有非成对元素的数组:
const solution=A=>Array.isArray(A)?
对象密钥(
A.减少((r,k)=>{
r[k]=r[k]| | 0;
如果(++r[k]>1)删除r[k];
返回r;
}, {})
) : [];
log(解决方案([2,3,6,7,3,5,5,6,2]))
你能把源数据写成文本,把所需数据写成文本吗?@steppup,我刚刚编辑并包含了源数据和所需数据。你能把源数据写成文本,把所需数据写成文本吗?@steppup,我刚刚编辑并包含了源数据和所需数据。这看起来很好,我一直在分析你所做的事情,刚刚学会了reduce method,我能够看到您如何为每个值映射一个递增键(如果它是成对的),然后为一位数映射一个递增键,这不会给我们带来结果。但是在您刚刚编写的代码中,我仍然需要了解很多东西。谢谢。@optimalresource我很高兴它对您有所帮助!请随时提问!:)@请看科什的答案,它的复杂度为O(N)。我的答案的复杂度为O(2*N)。使用他的答案。这比我的答案好。将他的答案标记为答案,以简化其他用户的未来搜索。你将获得更好的性能。是的,我发现了复杂性,这真的很酷。我已经接受了它作为最佳答案。这看起来很好,我一直在分析你所做的事情,刚刚学会了reduce方法,并且能够看到它是如何实现的您为每个值映射了一个递增的键(如果它是成对的),然后为一位数映射了一个递增的键,没有递增的结果。但是,在您刚刚编写的代码中,有很多东西我仍然需要理解。谢谢。@optimalresource我很高兴它对您有所帮助!请随时提问!:)@optimalresource请参阅Kosh答案,它已经完成了O(N)复杂性。我的答案有复杂性O(2*N).使用他的答案。这比我的答案好。将他的答案标记为答案,以简化其他用户的未来搜索。你将获得更好的性能。是的,我发现了复杂性,这真的很酷。我已经接受了它作为最佳答案。我还没有真正理解你刚才所做的一切,它返回的是一个整数对象,我如何返回just该对象中的第一个整数?@optimalresource,函数返回数组,您可以按索引获取其任何元素。是的,我找到了,我尝试解码您所做的一切。谢谢lot@optimalresource,很乐意帮忙。是的,我也这么想,它应该成为其他人的资源,我在所有可能的条件下对它进行了测试ns和它脱颖而出。现在我了解了关于映射、过滤器和reduce的大多数事情,以及它们可以链接的方式,因为@Kosh真的让我感觉很好,在看到它的美丽之后,我的肾上腺素有了很大的跳升。我还没有真正弄清楚你刚才做的一切,它返回的是一个整数对象,我如何只返回第一个整数ger在那个对象中?@optimalresource,函数返回数组,你可以按索引获取它的任何元素。是的,我知道了,我试着解码你所做的一切。谢谢lot@optimalresource,很乐意帮忙。是的,我也这么想,它应该成为其他人的资源,我在所有可能的条件下对它进行了测试,它经得起考验t、 现在我了解了大多数关于地图、过滤器和reduce的事情,以及它们可以被链接的方式,因为@Kosh真的让我感觉很好,在看到美丽之后,我的肾上腺素有了很大的提升。