当我们使用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)。怎么样 ?请解决我的疑问。
答案 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<<
的顺序增长,这是多项式的高阶项。