Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
130 / 25 / 12
Регистрация: 12.08.2015
Сообщений: 221

Скоростная реализация перевода символьной строки в численные массивы

11.10.2015, 16:42. Показов 2237. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Недавно загорелся идеей создать свой собственный класс больших чисел (с десятичной дробью)
Для этого я буду использовать два целочисленных массива (целая и дробная часть числа), каждый элемент которых будет не более 1 байта размером, и одни флажок bool для "означивания" числа положительное\отрицательное.

Разумеется, чтобы вводить такое длинное число, я решил использовать строку, вводимую пользователем.
Внимание, вопрос:
Представим, что человек ввел 500 000 символов. Возможна ли проверка введенного числа на корректность, и его разбор + раскидывание по массивам менее, чем за 0,5 секунды?
Если да, то какими приемами тут лучше пользоваться? У меня есть немного оформившиеся планы, но они немного мутноватые.
Ах, да, забыл сказать, что лучше не ограничивать человека в вводимой строке, кроме как в совсем очевидных случаях (если две разделительные запятые, или два знака, или буквенный символ) например, функция должна понять эти строки одинаково и не сообщать об ошибке.
C++
1
2
3
4
5
6
""
"     "
"00000"
"0"
"0.0"
"+0.0"
И так далее. Разумеется, необходима хорошая скорость распознавания, а то иначе это никому не нужно будет. На что мне следует сейчас ориентироваться?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.10.2015, 16:42
Ответы с готовыми решениями:

реализация (строки и массивы)
Собсно, можете подсказать реализацию на ассамблере вот таких задач: как найти в матрице, разбитой на четверти (если какая либо из...

Существует ли метод/функция перевода значения символьной переменной в int
Хотел спросить, существует ли метод/функция перевода значения символьной ПЕРЕМЕННОЙ в int?

Написать программу удаления из текстового файла символов перевода строки ‘\n’ и перевода каретки ‘\r’
Здравствуйте,помогите написать программу на подобии этой,только не подсчета,а удаления.Заранее благодарен! #include <stdio.h> int...

26
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 минут
Цитата Сообщение от nmcf Посмотреть сообщение
1. Впустую расходуется память. И не мало.

Увы! чем-то надо жертвовать... Я выбрал скорость и пожертвовал памятью. Чуть выше пост, там написано, почему динамические массивы - не лучшая вещь, если я в чем-то не прав, помогите мне это понять, осознать, потому что решения вышеозначенной проблемы в динамике я не вижу. Это очень отрицател
ьно скажется на скорости выполнения кода в угоду экономии места в оперативной памяти.

Цитата Сообщение от nmcf Посмотреть сообщение
Усложняется индексация при работе с числом.
Абсолютно с Вами согласен, усложняется! Очень усложняется!

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

Добавлено через 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  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Даже используя массив фиксированной длины проще хранить от младшего к старшему с нулевого индекса - индексация в циклах проще. Как скорость стала ниже в таком варианте, мне не ясно.
- Слушайте, а ведь и правда! Я могу так же избавиться от лишней операции вычитания в цикле во время итераций раскидывания по массивам, что даст еще прирост в скорости при расшифровке строки!

нет, нет, я про падение скорости говорю только в случае динамического выделения.

Цитата Сообщение от nmcf Посмотреть сообщение
У тебя сто чисел - уже 200 мегабайт. И они должны быть динамическими в любом случае, т. к. в стек столько не влезет. Ну если только глобальные.
Да - это проблема! Но и гибкий размер массивов - тоже не сахар.
Вот и вопрос, что выбирать... минимум -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  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
После выделения памяти динамический массив работает с той же скоростью, что и статический. Ну вектор, может быть, чуть медленнее - никак не на 30%.
Проблема в том, что если мои прогнозы разойдутся с результатами, и я зарезервирую лишние разряды, то:

1. Надо посмотреть, сколько же реально используется разрядов, то есть необходим анализ числа
2. Надо создать новый динамический массив с инициализацией, подходящий по фактическому размеру числа.
3. Надо скопировать полезные разряды из старого массива в новый.
4. Надо освободить память по старому адресу.
5. Надо перекинуть указатель на новый адрес.

Не знаю как последние две операции, но первые три - точно трудоемкие.

Добавлено через 19 секунд
Цитата Сообщение от nmcf Посмотреть сообщение
Используй vector.
ОК!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.10.2015, 16:36

Строки. Удалить часть символьной строки,заключенной в скобки (вместе со скобками)
Удалить часть символьной строки,заключенной в скобки(вместе со скобками).

Вырезать два первых символа символьной строки и поместить их в конец строки
Помоги те пожалуйста, решите сколько сможете. Задачи на строки. 2. Вырежьте два первых символа символьной строки и поместите их в...

Вырезать два первых символа символьной строки и поместить их в конец данной строки
Вырезать два первых символа символьной строки и поместить их в конец данной строки.

Какая СУБД самая скоростная?
Доброго времени суток. Занимаюсь разработкой одной очень важной автономной системы(большего сказать не могу(не хочу харакири:D)). Так вот...

Моя реализация функции перевода string в int
#include <iostream> #include <string> using namespace std; int str_to_int(string a); int main() { string s =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
Оказывается, 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,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru