私はアルゴリズムについてもう少し学ぼうとしており、ランダムに作成された数値のグリッドからターゲット数値を作成できるかどうかをブルートフォースを使用して確認するための簡単なアルゴリズムを作成しました。合計した 5 つのグリッド番号がターゲットを作成するかどうかを確認するのに十分な作業を行いました。これは、念頭に置いていた目的には十分なはずですが、プロセスは非常に遅く、iOS シミュレーターで約 11 秒です。ここで物事をスピードアップするにはどうすればよいですか? 私が使用しているすべてのループを使用するよりも効率的な方法はありますか? これが私のすべてのコードです.2つの整数を含む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;
}