当我们使用for循环** ex.for(i = 1; i< = n; i ++)**进行n个数的和时

时间:2016-05-06 05:53:00

标签: algorithm

当我们使用for循环 (void)locationManager:(CLLocationManager *)manager didFailWithError: (NSError *)error { NSLog(@"didFailWithError: %@", error); } - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { NSLog(@"didUpdateToLocation: %@", newLocation); CLLocation *currentLocation = newLocation; if (currentLocation != nil) { NSLog(@"%@",[NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude]); NSLog(@"%@",[NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude]); // [mkMapView setCenterCoordinate:mkMapView.userLocation.location.coordinate animated:YES]; } } -(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation { MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 150, 150); [mkMapView setRegion:[mkMapView regionThatFits:region] animated:YES]; } 进行n数字的总和时,这是 O(n)的复杂度,但是如果我们使用公式算术/几何级数系列for(i=1;i<=n;i++)如果我们计算时间复杂度,那么它的 O(n ^ 2)。怎么样 ?请解决我的疑问。

2 个答案:

答案 0 :(得分:2)

您对数字的代表感到困惑。

当我们谈论复杂性时,基本上我们正在计算步骤的数量。

n(n+1)/2是Summation(1..n)的答案,这是正确的,但不同的方式采用不同的步骤来计算它,我们正在计算这些步骤的数量。

比较以下内容:

int ans = 0;
for(int i=1; i<=n;i++) ans += i;
// this use n steps only

int ans2 = 0;
ans2 = n*(n+1)/2;
// this use 1 step!!

int ans3 = 0;
for(int i=1, mx = n*(n+1)/2; i<=mx; i++) ans3++;
// this takes n*(n+1)/2 step
// You were thinking the formula would look like this when translated into code!

所有三个答案都给出了相同的价值!

所以,你只能看到第一种方法&amp;第三种方法(当然根本不实用)受n的影响,不同的n将导致它们采取不同的步骤,而使用该公式的第二种方法,无论如何都要采取一步什么是n

话说回来,如果事先知道公式,那么直接用公式计算答案总是最好的

答案 1 :(得分:1)

您的第二个公式具有O(1)复杂度,即它以恒定时间运行,与n无关。

没有矛盾。复杂性衡量算法运行的时间。不同的算法可以以不同的速度计算相同的结果。

[BTW正确的公式为n*(n+1)/2。]

编辑:也许您的混淆与采用n*(n+1)/2步骤的算法有关,这是(n^2 + n)/2步骤。我们称之为O(n^2),因为当n^2变大时,n基本上(渐近地)增长为n^2。也就是说,它按 operator<<的顺序增长,这是多项式的高阶项。