Как определить длину массива эффективным образом?Алгоритм определения размера массива
Если вы ищете способ получить размер массива или глобального в кэше Intersystems, я начал думать о том, как определить размер массива. С тех пор я нашел решение моей исходной задачи, но загадка определения размера эффективно массива до сих пор давало мне покоя, так вот что я придумал до сих пор:
- Начать индекс 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 - тот же размер, с которым увеличился массив.
Для довольно небольшого массива я могу считать, что стук, который я принимаю в последних нескольких циклах, является почти приемлемым, даже если длина массива только одна меньше, чем сила двух, но что произойдет, если я использую очень большие массив, скажем, с элементами 2097152 (2^21 - 1)? Это означает, что я нажму первый «over» в 21 итерации, доведю индекс до 1572864 и начну ОЧЕНЬ ДЛИННУЮ ЛОП (1572864 итераций). В этом примере я не совсем «выигрываю» все это.
Теперь я могу оптомизировать это, еще раз увеличив индекс по степеням двух, но все это заставило меня задуматься: есть ли лучший способ сделать это? Я даже дистанционно на правильном пути? Будет ли я лучше просто использовать статический размер увеличения?
какой язык? на некотором языке используется структура, которая явно хранит размер массива, поэтому всегда является операцией чтения значений. – LeleDumbo
Да, это было бы идеальным решением, так как нет итерации. Я просто задаюсь вопросом о хорошем алгоритме в целом, поэтому для аргумента предположим, что мы не можем просто сохранить размер массива. :) – NotMyName
Если у вас нет размера массива, как вы знаете, где находится последний элемент? Ваш пример * задает вопрос * - вы не можете уйти с предположением, что размер массива равен 52, а затем получить алгоритм для нахождения этого размера. Вы должны начать с предположения, что вы (и ваш алгоритм) не знаете размер массива. –