Algorithm 两个圈除以一个圈,可以吗?

Algorithm 两个圈除以一个圈,可以吗?,algorithm,performance,Algorithm,Performance,下面是两个函数的循环: constfoos=[1,2,3,4,5]; 对于(让foo of foos){ 职能1(foo); 职能2(foo); } 我想把它一分为二。因为代码的语义分离 constfoos=[1,2,3,4,5]; 对于(让foo of foos){ 职能1(foo); } 对于(让foo of foos){ 职能2(foo); } 撇开我为什么要这样做不谈,我想知道性能是否降低了。在这两种情况下,都可以,因为它是O(n),对吗?此更改不会影响时间复杂性。因此,是的,假设f

下面是两个函数的循环:

constfoos=[1,2,3,4,5];
对于(让foo of foos){
职能1(foo);
职能2(foo);
}
我想把它一分为二。因为代码的语义分离

constfoos=[1,2,3,4,5];
对于(让foo of foos){
职能1(foo);
}
对于(让foo of foos){
职能2(foo);
}

撇开我为什么要这样做不谈,我想知道性能是否降低了。在这两种情况下,都可以,因为它是O(n),对吗?

此更改不会影响时间复杂性。因此,是的,假设
func1
func2
都是
O(1)
,那么您的时间复杂度仍然是
O(n)
(其中
n=len(foos)

不过,您可能会担心的是,这两个代码片段并不相同。根据您对
func1
func2
的实现,您可能会得到不同的结果。
第一个是:

func1(1);
func2(1);
func1(2);
func2(2);
...
func1(1);
func1(2);
...
func2(1);
func2(2);
...
第二个是:

func1(1);
func2(1);
func1(2);
func2(2);
...
func1(1);
func1(2);
...
func2(1);
func2(2);
...
直观解释:
您从:
O(n*(1+1))=O(n*2)=O(2n)=O(n)


对以下对象的操作:
O((n*1)+(n*1))=O(n+n)=O(2n)=O(n)

尽管看起来可能不是这样,但在列表上迭代是有代价的。这是因为我们必须反复调用列表上的
.next()
,才能检索下一项。对于一个数组,它将是常数时间,但是对于其他可枚举结构,它的成本可能会更高,这取决于数据的存储方式(例如hashmap)

让我们假设枚举的成本是
f(N)
,其中N是集合的大小。在本例中,我们假设
func1
func2
在恒定时间k内执行

两者的复杂性是相同的:
O(N*f(N)+N*k)=O(N*f(N))

然而,真正的成本是不同的。您需要执行额外的
N*f(N)
操作。根据
f(N)
,使用一个循环而不是两个循环可能会节省一些值得注意的时间,但总体复杂性将保持不变