计算一组数字的可能排列

Jac*_*llo 5 combinations for-loop objective-c combinatorics nsarray

我有一个NSArray,数字为{0,1,2,3}

计算阶乘4(数组的计数),我有24个可能的排列0,1,2,3

我想知道是否有办法计算所有这些可能的排列并将它们放在一个单独的数组中.

例如,给定上面的数字{0,1,2,3},得到的排列将是:

0123, 0132, 0213, 0231, 0312, 0321,
1023, 1032, 1203, 1230, 1302, 1320,
2013, 2031, 2103, 2130, 2301, 2310,
3012, 3021, 3102, 3120, 3201, 3210
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏.非常感谢!

小智 5

我想知道是否有办法计算所有这些可能的排列

当然(虽然它们不是组合而是排列):

unsigned long long factorial(unsigned long long n)
{
    return n > 1 ? n * factorial(n - 1) : 1;
}

unsigned long long perms = factorial(array.count);
Run Code Online (Sandbox Code Playgroud)

并将它们放在一个单独的数组中.

当然,也有很好的排列算法(例如Johnson-Trotter算法).


Jac*_*llo 5

我一直在寻找代码,但是设法弄清楚了:)如果其他人需要它,则代码如下:

static NSMutableArray *results;

void doPermute(NSMutableArray *input, NSMutableArray *output, NSMutableArray *used, int size, int level) {
    if (size == level) {
        NSString *word = [output componentsJoinedByString:@""];
        [results addObject:word];
        return;
    }

    level++;

    for (int i = 0; i < input.count; i++) {
        if ([used[i] boolValue]) {
            continue;
        }

        used[i] = [NSNumber numberWithBool:YES];
        [output addObject:input[i]];
        doPermute(input, output, used, size, level);
        used[i] = [NSNumber numberWithBool:NO];
        [output removeLastObject];
    }
}

NSArray *getPermutations(NSString *input, int size) {
    results = [[NSMutableArray alloc] init];

    NSMutableArray *chars = [[NSMutableArray alloc] init];


    for (int i = 0; i < [input length]; i++) {
        NSString *ichar  = [NSString stringWithFormat:@"%c", [input characterAtIndex:i]];
        [chars addObject:ichar];
    }

    NSMutableArray *output = [[NSMutableArray alloc] init];
    NSMutableArray *used = [[NSMutableArray alloc] init];

    for (int i = 0; i < chars.count; i++) {
        [used addObject:[NSNumber numberWithBool:NO]];
    }

    doPermute(chars, output, used, size, 0);

    return results;
}
Run Code Online (Sandbox Code Playgroud)

使用

getPermutations(输入,大小)

获取带有存储的排列的NSArray。

例如:

NSLog(@"%@", getPermutations(@"0123", 4));

//console log
RESULTS: (
    0123,
    0132,
    0213,
    0231,
    0312,
    0321,
    1023,
    1032,
    1203,
    1230,
    1302,
    1320,
    2013,
    2031,
    2103,
    2130,
    2301,
    2310,
    3012,
    3021,
    3102,
    3120,
    3201,
    3210
)
Run Code Online (Sandbox Code Playgroud)

现在对我来说非常适合:)