【发布时间】:2012-08-09 01:37:42
【问题描述】:
我之前在搞乱NSArray 函数,我想我可能遇到了随机化 NSArray 的最简单方法:
NSArray *randomize(NSArray *arr)
{
return [arr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return arc4random_uniform(3) - 1; // one of -1, 0, or 1
}];
}
理论上,这应该彻底随机化 NSArray。然而,经过深思熟虑,我想知道这是否可能是不安全的,理论上会变成一个无限循环,具体取决于 NSArray 使用的排序算法。
我在大小为 10 - 100000 的数组上对此进行了测试,我看到了线性性能差异(大约 N * (log10(N) + 2) 每次随机化比较),这还不错。
但是,是否会出现 NSArray 理论上永远无法自行排序并导致应用程序崩溃的情况?在我看来,这不应该发生,但你永远不知道。
【问题讨论】:
-
对于它的价值,Fisher-Yates shuffle 算法在 O(N) 时间内运行并保证一个真正均匀的随机数组作为输出。你建议的速度更快,真的很容易编码,应该让你所有的烦恼都没有了。也就是说,这是一个非常酷的问题,我肯定会玩弄它!
-
@templatetypedef 但是,它只适用于可变数组。在objective-c中,你必须有一个可变数组的开销,这可以说是相同的性能差异。
-
啊,我不知道Objective-C。感谢您指出了这一点! (也就是说,制作一个可变数组、复制元素、Fisher-Yates 对其进行洗牌、然后将其复制回这么高的成本?)
-
@templatetypedef 在objective-c中,可以。可惜 NSArray 是一个类簇,所以我们没有具体的实现,只能做基准测试
-
@templatetypedef 我编写并分析了这个。结果如下,如果您有兴趣。
标签: algorithm sorting random comparison nsarray