Javascript 大O复杂度算法

Javascript 大O复杂度算法,javascript,performance,big-o,Javascript,Performance,Big O,我刚刚学习了大O符号,我经历了一些思维难题,我想我应该和人们一起验证我是否正确地思考了问题 在Javascript中,这会被认为是通过两个数组搜索公共项的O(n)时间解决方案吗?或者,该语言在对象中执行查找,并以遍历数组的相同方式遍历对象中的n个元素吗 function findCommon (input, input2){ var key = {}; var out = []; for(var i=0; i<input.length; i++){ key[input[

我刚刚学习了大O符号,我经历了一些思维难题,我想我应该和人们一起验证我是否正确地思考了问题

在Javascript中,这会被认为是通过两个数组搜索公共项的O(n)时间解决方案吗?或者,该语言在对象中执行查找,并以遍历数组的相同方式遍历对象中的n个元素吗

function findCommon (input, input2){
  var key = {};
  var out = [];
  for(var i=0; i<input.length; i++){
    key[input[i]] = true;
  }
  for(var j=0; j<input2.length; j++){
    if(key[input2[j]] == true){
      out.push(input2[j]);
    }
  }
  return out;
} 
函数findCommon(输入,输入2){
var key={};
var out=[];

对于(var i=0;i你的函数由两个
O(n)
复杂度组成。因此,你函数的总复杂度是
O(n)
。如评论中所述,我想澄清一下,你有两个不同的
O(n)
O(m)
,它们不等于
O(2n)
(但是,你仍然会删除所有常数)但这在你的例子中并不重要,因为复杂性不取决于
m
n
的大小,而是取决于结构的复杂性(在你的例子中,单
循环

m
输入的长度,而
n
输入2
的长度。第一个循环的复杂性是
O(m) 
第二个循环的复杂度是
O(n)
。每当你面对顺序代码时,复杂度都会被求和(如果循环是嵌套的而不是顺序的,它们会成倍增加),给我们一个总的
O(m+n)
,这是精确的上界,并且在参数的大小上显然是线性的


现在,
m+n它是O(n)。关于JS的事情:这不是你的代码的问题,是吗?(事实上,我确信他们使用的数据结构比普通的线性阵列更好)您几乎回答了我关于js数据结构的问题。可以安全地说对象是在一组数据中执行查找的最佳数据结构吗?或者这种语言依赖于语言吗?是的,它依赖于语言(因为有许多语言没有对象)还有你的JS引擎和…我想正式地说,你需要一个额外的解释,你有两个输入长度n和m,你假设长的一个总是n。根据这个假设,你可以大约
O(2n)
=
O(n)