|
130 / 25 / 12
Регистрация: 12.08.2015
Сообщений: 221
|
||||||
Скоростная реализация перевода символьной строки в численные массивы11.10.2015, 16:42. Показов 2366. Ответов 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 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store.
И так:
1. Скачиваем с. . .
|
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге).
Задача:
Программно добавить префикс в нумерацию документов.
Решение:
В модуле объекта. . .
|
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
|
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него.
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952
Инструкция внутри.
https:/ / youtu. be/ VpfFZSUDGnQ. . .
|
|
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности.
Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
|
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version
Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
|
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер
На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
|
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/
TL DR
Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
|