Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> расширение строки 
V
    Опции темы
fish9370
Дата 23.4.2013, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: -1
Всего: 1



в астере (asterisk.org, кто не знает), при формировании строки, при заползании за доступное пространство, используется следующая формула для расширения строки:

Код

need += 16 + need / 4;


где need - это пространство необходимое для хранения строки заданной длины

имеется ли математическая база под этой формулой?
какие у вас мысли по этому поводу?


--------------------
undefined
PM MAIL WWW ICQ   Вверх
bsa
Дата 25.4.2013, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



fish9370, для расширения С++ вектора используется формула вида size = size ? size * 2 : 1
Это стандартный метод экспоненциального увеличения. Т.е. чем больше у тебя текущий объем, тем больше резервируется. Причем, тут используется довольно пессимистичный вариант (возможно, для строк он актуален).
PM   Вверх
baldina
Дата 25.4.2013, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



обе формулы  - частные случаи x = k*x + c, поэтому
Цитата(fish9370 @  23.4.2013,  14:32 Найти цитируемый пост)
need += 16 + need / 4;

делает вобщем то же самое что и
Цитата(bsa @  25.4.2013,  12:44 Найти цитируемый пост)
size = size ? size * 2 : 1

только с большей экономией (и потенциально более частой потребностью расширения)

можно взять другие k и c, если есть основания (особенности задачи)

Это сообщение отредактировал(а) baldina - 25.4.2013, 13:26
PM MAIL   Вверх
fish9370
Дата 25.4.2013, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: -1
Всего: 1



я поинтересовался у разработчиков, это писал некий Kevin, говорят он большой мастер работы с памятью, к сожалению с ним мне поговорить так и не удалось..


Цитата(baldina @  25.4.2013,  13:18 Найти цитируемый пост)
обе формулы  - частные случаи x = k*x + c, поэтому


это что та самая формула? линейное уравнение?
но как я полагаю на нее накладываются определенные ограничения, связанные с выравниванием?


--------------------
undefined
PM MAIL WWW ICQ   Вверх
baldina
Дата 25.4.2013, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



выравнивание тут непричем (да и не получается оно по этой формуле)
думаю большой мастер работы с памятью прикинул некий средний случай, его и реализовал (k=1.25). если строки изменяются чаще, а самих строк не так много, лучше подходит k=2 (как в std::vector). в какой-то реализации std::string я вроде бы видел k=1.5
PM MAIL   Вверх
fish9370
Дата 26.4.2013, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: -1
Всего: 1



Цитата(baldina @  25.4.2013,  18:51 Найти цитируемый пост)
его и реализовал (k=1.25)


1.25 тут тоже не получается, просто некий коэффициент.. да и тяжеловато деление, можно было решить все сдвигами.. одни вопросы..


--------------------
undefined
PM MAIL WWW ICQ   Вверх
baldina
Дата 26.4.2013, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(fish9370 @  26.4.2013,  09:35 Найти цитируемый пост)
тяжеловато деление, можно было решить все сдвигами.

компилятор наверняка так и решил))

Цитата(fish9370 @  26.4.2013,  09:35 Найти цитируемый пост)
1.25 тут тоже не получается

почему? x+=x/4+c === x=1.25*x+c

PM MAIL   Вверх
fish9370
Дата 26.4.2013, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: -1
Всего: 1



спасибо всем, baldina особый респект..


--------------------
undefined
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0486 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.