0

是否有类似以下功能的类(功能、方法等或任何功能)?

受孕的例子)

一个使所有案例组合的类。

    NSString *sourceString = [[NSString alloc] initWithString:@"ABC"];
    NSArray *sourceArray = [[NSArray alloc] initWithObjects:@"A", @"B", @"C"];

    someClass *someClass1 = [[someClass alloc] init];

    NSString *caseResultAsString = [someClass1 makeAllCaseCombinationToStr:sourceString pair:2];
    NSArray *caseResultAsArray = [someClass1 makeAllCaseCombinationToArray:sourceArray pair:2];

caseResultAsString 的值为“AA AB AC BA BB BC CA CB CC”(对参数为 2)

caseResultAsArray 的值为 {"AA", "AB", "AC", "BA", "BB", "BC", "CA", "CB", "CC"}

如果输入源和输出结果是任何类型或任何方式,都没有关系。

我想知道是否有一个具有上述概念特征的类。

4

1 回答 1

0

这是一个非常简单的NSSet类别:

@interface NSSet(Permutations)

-(NSSet *) setWithPermuations:(int) n;

@end

@implementation NSSet(Permutations)

// data should be NULL the first time through
static void for_loop(int count, int levels, void (^block)(int *levels), int *data)
{
    int freeData = 0;
    if (!data)
    {
        data = malloc(sizeof(int) * levels);
        freeData = 1;
    }

    for (int i = 0; i < count; i++) {
        data[levels - 1] = i;

        if (levels)
            for_loop(count, levels - 1, block, data);
        else {
            if (block)
                block(data);
        }
    }

    if (freeData)
        free(data);
}

-(NSSet *) setWithPermuations:(int)n
{
    NSMutableArray *returnArray = [NSMutableArray array];
    NSArray *thisArray = [self allObjects];

    for_loop(thisArray.count, n, ^(int *levels) {
        NSMutableString *concat = [NSMutableString string];

        for (int i = 0; i < n; i++) {
            [concat appendFormat:@"%@", [thisArray objectAtIndex:levels[i]]];
        }

        [returnArray addObject:concat];

    }, NULL);

    return [NSSet setWithArray:returnArray];
}

@end

显然,该算法的时间是O((N^T) + O(N)),其中N是集合中的元素,T是每次渗透的对象数。如果您愿意,可以轻松地将其更改为具有 NSArrays 的 NSSet,但目前这仅使用一个字符串。

于 2012-04-22T17:22:44.557 回答