在目标c中生成组合的有效方法[重复]
Posted
技术标签:
【中文标题】在目标c中生成组合的有效方法[重复]【英文标题】:Efficient way of generating combinations in objective c [duplicate] 【发布时间】:2013-06-25 05:58:59 【问题描述】:我正在寻找一种从一组给定对象顺序生成对象组合的方法,这并不重要(不是排列而是组合),例如。说。我有一个 A、B、C、D 的列表,我需要从中选择 3 个.. 然后我应该得到一个列表
ABC ACD BCD
在目标 C 中是否有有效的逻辑来执行此操作?
【问题讨论】:
您在发帖前是否使用了搜索工具? (例如"generating combinations") ***.com/q/15738807/1468406 看到这个...***.com/questions/6617253/… 是的,确实使用了搜索,但在 ios 5.1 的目标 C.. 中没有找到任何有效的解决方案,因此它不能进行密集处理。并且需要生成组合而不是排列。这些都没有回答我的问题 @inforeqd 再看一遍,我列出的那个是组合。到底什么才算“高效”? 【参考方案1】:这里的关键在于技术。我在评论中链接的问题有依据。算法如下:
1) 从前 n 个元素开始 2) 递增最终元素,直到它位于最终位置 3) 将前一个元素向前移动一位,并将最后一个元素重置为前一个元素之后的位置 4)重复第2步和第3步,直到前一个元素和最后一个元素都在最后两个位置 5)将previous-previous元素向前移动1,并将末尾的两个元素重置为previous-previous元素之后的位置 6)重复这个过程,直到所有元素都在末尾p>
简化成这样:
当组合数组的第一个元素小于原始数组和组合数组之间的差时,请执行以下操作:
当组合数组的最后一个元素小于原始数组的计数长度时,递增最后一个元素并从原始数组中获取结果索引
之后,检查前一个元素。如果它小于 lastElement -1 则递增它并将 lastElement 设置为前一个元素 + 1 并重复上述步骤。如果不是,则检查前一个元素,依此类推。如果它们都是连续的,那么你就完成了。
为了帮助这个算法,我建议创建一个与您的组合大小相匹配的索引数组。假设您想要 5 元素数组的 3 元素组合。制作一个包含第一个索引的 3 元素数组:
[0,1,2]
首先应用上面的算法,你会增加最后一个元素直到结束 [0,1,3] [0,1,4]
然后,增加前一个并重置最后一个 [0,2,3]
重复以上步骤,直到最后两个在最终位置[0,2,4] [0,3,4]
沿着 [1,2,3] [1,2,4] [1,3,4] [2,3,4] 线向下移动,现在所有索引都在最后的位置,你就完成了。
不过,我不打算在 Objective-C 中写出来,因为实现算法是每个程序员都需要做的事情。我认为这些信息足以让您成功。
【讨论】:
【参考方案2】:是的,你有。 这并不难,但很长。 只是您必须使用 for 循环来计算字符数。 请看下面的代码。
NSMutableArray *arr_Combinations = [[NSMutableArray alloc] init];
NSString *str_First;
NSString *str_Second;
NSString *str_Third;
for (NSInteger firCount = 0; firCount < 4; firCount++)
NSMutableArray *arr_First = [NSMutableArray arrayWithObjects:@"A", @"B", @"C", @"D", nil];
str_First = [arr_First objectAtIndex:firCount];
[arr_First removeObjectAtIndex:firCount];
for (NSInteger secCount = 0; secCount < [arr_First count]; secCount++)
NSMutableArray *arr_Second = [[NSMutableArray alloc] initWithArray:arr_First];
str_Second = [str_First stringByAppendingString:[arr_Second objectAtIndex:secCount]];
[arr_Second removeObjectAtIndex:secCount];
for (NSInteger thirCount = 0; thirCount < [arr_Second count]; thirCount++)
NSMutableArray *arr_Third = [[NSMutableArray alloc] initWithArray:arr_Second];
str_Third = [str_Second stringByAppendingString:[arr_Third objectAtIndex:thirCount]];
[arr_Third removeObjectAtIndex:thirCount];
for (NSInteger fothCount = 0; fothCount < [arr_Third count]; fothCount++)
NSString *str_Final = [str_Third stringByAppendingString:[arr_Third objectAtIndex:fothCount]];
NSLog(@"%@", str_Final);
[arr_Combinations addObject:str_Final];
NSLog(@"%d", [arr_Combinations count]);
【讨论】:
以上是关于在目标c中生成组合的有效方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章