我不确定是否存在问题,所以我要将其写下来。我使用Swift和Xcode 7.2,在iPhone 5s上开发。使用NSDate.timeIntervalSinceReferenceDate()
计算执行时间。
我创建了两个数组,一个有200,000个元素,另一个只有20个元素,并尝试随机访问它们的元素。访问大数组的元素几乎慢了55倍!我知道它更大,但这不是O(1)吗?
我在Java上也尝试了相同的操作,大数组和小数组的访问速度是相同的。
从苹果文档的CFArrayheader
中,我发现了这个:
在数组中访问特定索引处的任何值最坏情况下是O(log n),但通常应该是O(1)。
但是,根据我测试的数字,我认为这不可能是真的。
我知道我没有进行大规模测试或任何特殊的操作,但事实上它并不起作用,这真的让我感到困扰!我需要这个东西来完成我的工作。算法在Swift和iOS上不起作用,但在Java和Android上起作用。
let bigSize:Int = 200000
var bigArray = [Int](count:bigSize,repeatedValue:0)
let smallSize:Int = 20
var smallArray = [Int](count:smallSize,repeatedValue:0)
for i in 0..<bigSize
{
bigArray[i] = i + 8 * i
}
for i in 0..<smallSize
{
smallArray[i] = i + 9 * i
}
let indexBig = Int(arc4random_uniform(UInt32(bigSize)) % UInt32(bigSize))
let indexSmall = Int(arc4random_uniform(UInt32(smallSize)) % UInt32(smallSize))
var a = NSDate.timeIntervalSinceReferenceDate()
print(bigArray[indexBig])
var b = NSDate.timeIntervalSinceReferenceDate()
print(b-a) \\prints 0.000888049602508545
a = NSDate.timeIntervalSinceReferenceDate()
print(smallArray[indexSmall])
b = NSDate.timeIntervalSinceReferenceDate()
print(b-a) \\prints 6.90221786499023e-05
Java: 在Java上,访问一个元素非常快,并且在电脑上也是如此,因此我可以访问更多的元素,但是两个数组上的元素数量相同。
int bigSize = 200000;
int[] bigArray = new int[bigSize];
Random rand = new Random();
int smallSize = 20;
int[] smallArray = new int[smallSize];
for(int i = 0;i < bigSize;i++)
bigArray[i] = i + i * 8;
for(int i = 0;i < smallSize;i++)
smallArray[i] = i + i * 8;
int smallIndex = rand.nextInt(smallSize);
int bigIndex = rand.nextInt(bigSize);
int sum = 0;
long a = System.currentTimeMillis();
for(int i = 0;i < 10000;i++)
{
sum += bigArray[rand.nextInt(bigSize)];
}
System.out.println(sum);
long b = System.currentTimeMillis();
System.out.println(b-a); //prints 2
a = System.currentTimeMillis();
sum = 0;
for(int i = 0; i < 10000;i++)
{
sum += smallArray[rand.nextInt(smallSize)];
}
System.out.println(sum);
b = System.currentTimeMillis();
System.out.println(b - a); //prints 1