当前位置: 首页 > 科技观察

如何使用JavaScript集集合更快地编写代码

时间:2023-03-17 13:12:12 科技观察

我敢肯定,有很多开发人员坚持使用基本的全局对象:数字、字符串、对象、数组和布尔值。对于许多用例,这些就是您所需要的。但是,如果您想让代码尽可能快且可扩展,这些原始类型并不总是足够好。在本文中,我们将讨论JavaScript的Set集合如何使您的代码更快,尤其是在缩放方面。Array的功能与Set的功能之间存在大量重叠。使用Sets往往会带来数组无法带来的运行时优势。在本文中,我们将探讨如何做到这一点。设置有何不同?最根本的区别在于数组是有索引的集合,也就是说数组中的数据值是按照索引来排序的。constarr=[A,B,C,D];console.log(arr.indexOf(A));//Result:0console.log(arr.indexOf(C));//Result:2Comparison,Setisakeyed收藏。集合使用键来排序数据,而不是索引。Set的元素可以按插入顺序迭代,并且不能包含任何重复数据。换句话说,集合中的每一项都必须是唯一的。主要好处是什么?在直接比较中,Set集合比数组有几个优势,特别是在运行时更快:搜索项目:使用indexOf()或includes()检查数组中是否存在项目速度较慢。删除项:在Set集合中,可以根据项的值来删除项。在数组中,等效于根据元素的索引使用splice()。与前一点一样,依赖索引很慢。插入项目:将项目添加到Set比使用push()、unshift()或等效方法将项目添加到数组更快。存储NaN:不能使用indexOf()或include()来查找值NaN,而Set可以存储该值。RemoveDuplicates:Set对象只存储唯一值。与数组相比,这是一个显着的优势,如果您想避免存储重复项,则需要额外的代码来处理重复项。时间复杂度是多少?数组用于搜索项目的方法具有O(N)的线性时间复杂度。换句话说,运行时间随着数据大小的增加而增加。相比之下,Set的查找、删除和插入项目的方法的时间复杂度仅为O(1)——这意味着数据的大小实际上与这些方法的运行时间无关!Set集合的速度有多快?多少?我希望我的测试结果能让您对Set的运行速度有一个实际的了解,尽管运行时间可能会因使用的系统、提供的数据大小和其他变量而有很大差异。我将分享我所做的三个简单测试和我得到的结果。1.准备测试在运行任何测试之前,让我们创建一个数组和一个Set,每个都有一百万个条目。为简单起见,我将从0开始,逐步增加到999,999。letarr=[],set=newSet(),n=1000000;for(leti=0;i{letindex=arr.indexOf(item);returnindex!==-1&&arr.splice(索引,1);};这是测试代码:console.time('Array');deleteFromArr(arr,n);console.timeEnd('Array');console.time('Set');set.delete(n);console.timeEnd('放');结果:Array:1.122ms,set:0.015ms,在这个例子中,Set快了惊人的74.13倍!总的来说,我们可以看到使用Set和Not数组可以大大提高运行时间。现在让我们看一些Set集合有用的实际例子。案例一:去除数组中的重复值如果想快速去除数组中的重复值,可以将其转换为Set。这是迄今为止过滤唯一值最干净的方法:constduplicateCollection=['A','B','B','C','D','B','C'];//如果要打开将数组放入Set集合中letuniqueCollection=newSet(duplicateCollection);console.log(uniqueCollection)//Result:Set(4){"A","B","C","D"}//如果要将值保存在一个数组中letuniqueCollection=[...newSet(duplicateCollection)];console.log(uniqueCollection)//Result:["A","B","C","D"]案例2:一道Google面试题给定一个无序的整数数组和一个值之和,如果有两个则返回true可以添加项目,使它们等于总和的值。否则,返回假。所以,如果给定数组[3,5,1,4]和值9,我们的函数应该返回真,因为4+5=9。解决这个问题的一个好方法是在创建一组套。让我们将这个想法应用到上面的例子中。当我们遇到3时,我们可以将6添加到我们的Set中,因为我们知道我们需要找到9的总和。然后,每次我们在数组中触摸一个新值时,我们可以检查它是否在我们的Set中.当我们到达5时,我们将4添加到我们的集合中。然后,当我们最终遇到4时,我们也会在我们的Set中找到它,因此我们可以返回true。解决方案可能如下所示:constfindSum=(arr,val)=>{letsearchValues=newSet();searchValues.add(val-arr[0]);for(leti=1,length=arr.length;iarr.some((set=>n=>set.has(n)||!set.add(sum-n))(newSet));因为设置。prototype.has()的时间复杂度仅为O(1),所以用Set代替数组来存储可以帮助我们的整体方案获得线性运行时间O(N)。如果我们改为依赖Array.prototype.indexOf()或Array.prototype.includes(),两者的时间复杂度均为O(N),则总运行时间将为O(N2),慢得多!如果您以前从未接触过JavaScriptSets,希望我已经展示了它们是多么有用!