LINUX.ORG.RU

Величина growth factor для динамических массивов

 ,


0

2

Во сколько раз нужно увеличивать вместимость массива? Может просто в 2 раза? Где золотая середина между space complexity и avg case performance? Интересует наиболее общий случай.

// псевдокод
def resize(array, size)
    new_size = size * growth_factor
    new_array = new Array[new_size]
    for i in (0, size):
        new_array[i] = array[i]
    return (new_array, new_size)
// growth_factor = ?



Последнее исправление: nerdogeek (всего исправлений: 4)
Ответ на: комментарий от Deleted

Добавил псевдокод, надеюсь разъяснит суть вопроса

nerdogeek
() автор топика

В описаниях хеш таблиц обычно такой анализ участвует. Можно подсмотреть там.

fmap
()

Посмтори в stl ghttp://stackoverflow.com/questions/5232198/about-vectors-growth, если, конечно, вопрос правтический.

anonymous
()
Ответ на: комментарий от anonymous

А stl vector увеличивает на 1.5. Просто например хэш таблицу удобно увеличивать почти в 2 раза (ближайшее простое число, почти кратное степени 2).

nerdogeek
() автор топика

В общем случае, зависит от задачи, но если вы не можете предсказать с какой скоростью там будут расти объемы данных, то увеличивайте в два или полтора раза. Всякие анализы в таком случае будут слишком сложны.

buddhist ★★★★★
()

Динамическим называется массив, размер которого может меняться во время исполнения программы. Для изменения размера динамического массива язык программирования, поддерживающий такие массивы, должен предоставлять встроенную функцию или оператор. Динамические массивы дают возможность более гибкой работы с данными, так как позволяют не прогнозировать хранимые объёмы данных, а регулировать размер массива в соответствии с реально необходимыми объёмами. В отличие от динамических массивов существуют статические массивы и массивы переменной длины. Размер статического массива определяется на момент компиляции программы. Размер массива переменной длины определяется во время выполнения программы. Отличием динамического массива от массива переменной длинны является автоматическое изменение размеров, что не трудно реализуется в случаях его отсутствия, поэтому часто не различают массивы переменной длины с динамическими массивами.

Deleted
()

Не актуально на amd64. 32битных х86 не актуальны, остальные скоро перейдут, либо уже перешли на 64битную адресацию.

Юзай что-то типа оверкоммита в своём коде - считай сколько у тебя осталось виртадресов и бери N страниц. Свободны терабайты адресного пространства - бери сотни гигбайт. Свободны гигабайты - бери сотни мегабайт.

В дефолтном 64битном х86 с нормально ОС ты можешь сразу new_size делать на миллиарды елементов.

Твой код дефрагментирует память так, что уже после 10-го юза на 32битном х86 второй массив у тебя просто никуда не влезет, а куча твоя умрёт. Работает это у вас лишь потому, что с большими данными вы никогда не работаете, а когда ваяете свои «массивы» разглагольствуйте о терабайтах.

osh5pntp8
()

Насколько я помню, в std::string в этом случае происходит увеличение размера в 2 раза. А STL - уже вполне себе проверенная временем штука

PatrickKilpatrick
()

Насколько я помню курс алг. дат, то да, в 2 раза.

invy ★★★★★
()

Увеличивай в random раз, так ты внесешь элемент непредсказуемости в последующую отладку программы.

anonymous
()

Просто используйте массив из блоков, с эмуляцией непрерывного доступа.

AIv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.