|
130 / 25 / 12
Регистрация: 12.08.2015
Сообщений: 221
|
||||||
Скоростная реализация перевода символьной строки в численные массивы11.10.2015, 16:42. Показов 2237. Ответов 26
Метки нет (Все метки)
Здравствуйте! Недавно загорелся идеей создать свой собственный класс больших чисел (с десятичной дробью)
Для этого я буду использовать два целочисленных массива (целая и дробная часть числа), каждый элемент которых будет не более 1 байта размером, и одни флажок bool для "означивания" числа положительное\отрицательное. Разумеется, чтобы вводить такое длинное число, я решил использовать строку, вводимую пользователем. Внимание, вопрос: Представим, что человек ввел 500 000 символов. Возможна ли проверка введенного числа на корректность, и его разбор + раскидывание по массивам менее, чем за 0,5 секунды? Если да, то какими приемами тут лучше пользоваться? У меня есть немного оформившиеся планы, но они немного мутноватые. Ах, да, забыл сказать, что лучше не ограничивать человека в вводимой строке, кроме как в совсем очевидных случаях (если две разделительные запятые, или два знака, или буквенный символ) например, функция должна понять эти строки одинаково и не сообщать об ошибке.
0
|
||||||
| 11.10.2015, 16:42 | |
|
Ответы с готовыми решениями:
26
реализация (строки и массивы) Существует ли метод/функция перевода значения символьной переменной в int Написать программу удаления из текстового файла символов перевода строки ‘\n’ и перевода каретки ‘\r’ |
|
130 / 25 / 12
Регистрация: 12.08.2015
Сообщений: 221
|
||||
| 12.10.2015, 16:02 [ТС] | ||||
|
Динамика плоха тем, что мне необходимо зарезервировать место под какое-то определенное количество элементов, которое получится после математической операции.
А количество резервируемых разрядов мне совершенно неизвестно до тех пор, пока я не посчитаю. Допустим, я выделил для умножения чисел 30*3 (2*2) разряда (это по максимуму, вдруг мы умножаем 99 на 99 и нам потребуется 4 разряда, мы не провидцы и не можем предсказать, сколько именно разрядов нам понадобится резервировать). Так, я выделил на два разряда больше. Потом проанализировал число и заставил гонять алгоритм, чтобы удалить из динамического массива два ненужных ноля. а теперь представьте, что я не умножаю, а возвожу в степень или делю? Если для умножения я могу еще хоть как-то подобрать резервируемое место, то для более сложных операций это непредсказуемо вовсе. А теперь представьте, что я для выражения 2^1 зарезервировал, на всякий случай, 100 000 разрядов, ведь и такая вещь может случиться. Что тогда? удалять лишние разряды, снова ужимая массив? Тогда мы получим ухудшение производительности вычислений не менее, чем процентов эдак на... 40.. Не хило, верно? )))Ну и зачем это мне нужно, в таком случае?))) Можно, конечно, возразить, что ужимать массивы не надо, и так далее, но вот представьте, что человек выполнил 20 математических операций. Программа на всякий случай зарезервировала при каждом действии много разрядов. Логика программа допускает что если у числа есть разряды, то все они являются полезными, и зарезервирует для следующего результата еще больше никому не нужных разрядов. Таким образом у нас образуется неконтролируемая "утечка" разрядов...)))) Нет, конечно, можно написать программу, которая устраняет эти проблемы и строго контролирует нужные разряды. Но если у меня будет такой алгоритм, то динамика мне ВООБЩЕ не нужна будет, понимаете в чем проблема? То есть динамка тут как табурету пятая ножка нужна))) Добавлено через 6 минут Увы! чем-то надо жертвовать... Я выбрал скорость и пожертвовал памятью. Чуть выше пост, там написано, почему динамические массивы - не лучшая вещь, если я в чем-то не прав, помогите мне это понять, осознать, потому что решения вышеозначенной проблемы в динамике я не вижу. Это очень отрицател ьно скажется на скорости выполнения кода в угоду экономии места в оперативной памяти.
Добавлено через 2 минуты На самом деле, использовать вектор - это свежая мысль для меня. Я должен это обдумать. Спасибо за подсказку Просто появляется ряд ограничений, и если их обойти- это будет лучшим выходом.
0
|
||||
|
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
|
|
| 12.10.2015, 16:06 | |
|
Даже используя массив фиксированной длины проще хранить от младшего к старшему с нулевого индекса - индексация в циклах проще. Как скорость стала ниже в таком варианте, мне не ясно.
У тебя сто чисел - уже 200 мегабайт. И они должны быть динамическими в любом случае, т. к. в стек столько не влезет. Ну если только глобальные.
0
|
|
|
130 / 25 / 12
Регистрация: 12.08.2015
Сообщений: 221
|
|||
| 12.10.2015, 16:23 [ТС] | |||
|
нет, нет, я про падение скорости говорю только в случае динамического выделения. Вот и вопрос, что выбирать... минимум -33% к скорости или же забитая оперативка...
0
|
|||
|
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
|
|
| 12.10.2015, 16:27 | |
|
После выделения памяти динамический массив работает с той же скоростью, что и статический. Ну вектор, может быть, чуть медленнее - никак не на 30%.
0
|
|
|
130 / 25 / 12
Регистрация: 12.08.2015
Сообщений: 221
|
|
| 12.10.2015, 16:27 [ТС] | |
|
Есть еще другая тема, как снизить количество места, занимаемое в оперативке.
сделать разряды числа, равные не 10, а скажем.. 127. Тогда число, занимающее такой же объем информации займет в 12 раз меньше места. Но это уже из разряда фантазий. Жаль, я не могу контролировать биты, а не байты. Все было бы проще.
0
|
|
|
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
|
|
| 12.10.2015, 16:29 | |
|
В 2 раза меньше, существенно не поможет. Используй vector.
0
|
|
|
130 / 25 / 12
Регистрация: 12.08.2015
Сообщений: 221
|
|||
| 12.10.2015, 16:36 [ТС] | |||
|
1. Надо посмотреть, сколько же реально используется разрядов, то есть необходим анализ числа 2. Надо создать новый динамический массив с инициализацией, подходящий по фактическому размеру числа. 3. Надо скопировать полезные разряды из старого массива в новый. 4. Надо освободить память по старому адресу. 5. Надо перекинуть указатель на новый адрес. Не знаю как последние две операции, но первые три - точно трудоемкие. Добавлено через 19 секунд
0
|
|||
| 12.10.2015, 16:36 | |
|
Строки. Удалить часть символьной строки,заключенной в скобки (вместе со скобками)
Вырезать два первых символа символьной строки и поместить их в конец данной строки Какая СУБД самая скоростная? Моя реализация функции перевода string в int Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
|
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было
ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась.
Первый вариант. . .
|
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2.
Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки
Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
|