如何以有效的方式确定数组的长度?
在寻找一种在 Intersystems Cache 中获取数组或全局大小的方法时,我开始考虑如何实际确定数组大小。从那以后,我找到了解决我最初问题的方法,但是有效地确定数组大小的难题仍然困扰着我,所以这是我到目前为止想出的:
- 从索引 1 开始。
- 测试当前索引处的值。
- 如果找到一个值,则将索引加倍。
- 如果没有找到值,则减去使用的倒数第二个索引。
- 继续第 4 步,在每次迭代中将减去的值减半,直到索引小到足以再次找到值为止。
- 将索引加一,直到找不到值。
- 倒数第二个索引将是大小。
例如,让我们采用一个大小为 52 的数组:
1 - OK
2 - OK
4 - OK
8 - OK
16 - OK
32 - OK
64 - OVER
48 - OK (64-16)
49 - OK
50 - OK
51 - OK
52 - OK
53 - OVER
这看起来很公平,因为我在 13 次迭代中获得了数组的长度,但是,如果我的数组大小增加到 63,它将增加 10 次迭代——与数组增加的大小相同。
对于一个相当小的数组,我可以认为我对最后几个循环的敲击几乎是可以接受的,即使数组长度只是小于 2 的幂,但是如果我使用一个非常大的数组会发生什么,比如说2097152 (2^21 - 1) 个元素?这意味着我将在 21 次迭代中达到第一个“结束”,将索引降低到 1572864 并开始一个非常长的循环(1572864 次迭代)。在这个例子中,我并没有完全“赢得”那么多。
现在我可以通过再次增加指数为 2 来优化这一点,但这一切都让我想知道:有没有更好的方法呢?我什至在正确的轨道上吗?简单地使用静态增加尺寸会更好吗?