Я пытаюсь узнать немного больше об алгоритмах и построил простой, чтобы увидеть, используя грубую силу, можно ли сделать целевое число из сетки случайно созданных чисел. Я сделал достаточно, чтобы проверить, создадут ли вместе пять чисел сетки цель, которой должно быть достаточно для цели, которую я имел в виду, но процесс ОЧЕНЬ медленный, около 11 секунд на симуляторе iOS. Как я могу ускорить процесс здесь? Есть ли более эффективный способ сделать это, чем использовать все циклы, которые я использую? Вот весь мой код, GridNumber
— это простой подкласс NSObject
, который содержит два целых числа, number
и tag
.
- (void)viewDidLoad
{
[super viewDidLoad];
// 0. Set up target number.
int random = arc4random() % 100 + 3;
NSNumber *target = [NSNumber numberWithInt: random];
// 1. Set up array of available numbers.
NSMutableArray *grid = [[NSMutableArray alloc] init];
for (int i = 1; i < 48; i++) {
GridNumber *number = [[GridNumber alloc] initWithRandomIntegerAndTag: i];
[grid addObject: number];
}
if ([self canTarget: target BeMadeFromGrid: grid]) NSLog(@"--- SOLVEABLE!");
else NSLog(@"--- UNSOLVEABLE!");
}
- (BOOL) canTarget: (NSNumber *) target BeMadeFromGrid: (NSArray *) grid
{
NSLog(@"TARGET NUMBER IS: %d", target.intValue);
// 2. See if the target already exists first.
for (GridNumber *firstValue in grid) {
if (firstValue.number == target.intValue) {
NSLog(@"SOLVEABLE IN 1: Grid already contains target!");
return YES;
}
}
// 3. Add elements once, see if any of those give the result.
for (GridNumber *firstValue in grid) {
for (GridNumber *secondValue in grid) {
int result = firstValue.number + secondValue.number;
if (result == target.intValue && firstValue.tag != secondValue.tag) {
NSLog(@"SOLVEABLE IN 2: Adding %d and %d creates target!", firstValue.number, secondValue.number);
return YES;
}
}
}
// 4. Add elements twice, see if any of those give the result.
for (GridNumber *firstValue in grid) {
for (GridNumber *secondValue in grid) {
for (GridNumber *thirdValue in grid) {
int result = firstValue.number + secondValue.number + thirdValue.number;
if (result == target.intValue && firstValue.tag != secondValue.tag && firstValue.tag != thirdValue.tag && secondValue.tag != thirdValue.tag) {
NSLog(@"SOLVEABLE IN 3: Adding %d, %d and %d creates target!", firstValue.number, secondValue.number, thirdValue.number);
return YES;
}
}
}
}
// 5. And three times..
for (GridNumber *firstValue in grid) {
for (GridNumber *secondValue in grid) {
for (GridNumber *thirdValue in grid) {
for (GridNumber *fourthValue in grid) {
int result = firstValue.number + secondValue.number + thirdValue.number + fourthValue.number;
if (result == target.intValue && firstValue.tag != secondValue.tag && firstValue.tag != thirdValue.tag && firstValue.tag != fourthValue.tag &&
secondValue.tag != thirdValue.tag && secondValue.tag != fourthValue.tag && thirdValue.tag != fourthValue.tag) {
NSLog(@"SOLVEABLE IN 4: Adding %d, %d, %d and %d creates target!", firstValue.number, secondValue.number, thirdValue.number, fourthValue.number);
return YES;
}
}
}
}
}
// 6. And four times..
for (GridNumber *firstValue in grid) {
for (GridNumber *secondValue in grid) {
for (GridNumber *thirdValue in grid) {
for (GridNumber *fourthValue in grid) {
for (GridNumber *fifthValue in grid) {
int result = firstValue.number + secondValue.number + thirdValue.number + fourthValue.number + fifthValue.number;
if (result == target.intValue && firstValue.tag != secondValue.tag && firstValue.tag != thirdValue.tag && firstValue.tag != fourthValue.tag &&
firstValue.tag != fifthValue.tag && secondValue.tag != thirdValue.tag && secondValue.tag != fourthValue.tag && secondValue.tag != fifthValue.tag &&
thirdValue.tag != fourthValue.tag && thirdValue.tag != fifthValue.tag && fourthValue.tag != fifthValue.tag) {
NSLog(@"SOLVEABLE IN 5: Adding %d, %d, %d, %d and %d creates target!", firstValue.number, secondValue.number, thirdValue.number, fourthValue.number, fifthValue.number);
return YES;
}
}
}
}
}
}
// 7. This is if it can't be made.
return NO;
}
the big O
(en.wikipedia.org/wiki/Big_O_notation) - person Shark   schedule 16.05.2013grid of 5 elements
первый цикл, равный O(n), выполняется до 5 раз. Во-вторых, O(n^2) выполняется до5*5 = 25
раз... Читателю остается выполнить упражнение, чтобы понять, почему O(n^5) — это плохо. - person Shark   schedule 16.05.2013