Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 29.10.2016
Сообщений: 6

Экономия памяти

26.03.2018, 20:55. Показов 2250. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые программисты!
Как разместить информацию о числах из массива, используя как можно меньше памяти?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.03.2018, 20:55
Ответы с готовыми решениями:

Экономия памяти
Скажите, будет ли второй вариант кода занимать меньше памяти? 1ый вариант: float a; f(a); 2ый вариант: #define a 5.33 ...

Экономия памяти при упаковке данных
Здравствуйте, уважаемые программисты! Есть такая задача: Задан упорядоченный целочисленный массив длины N = 1000. Значения элементов...

Скорость или экономия памяти - что бы выбрали Вы?
...

20
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
26.03.2018, 23:24
Подробнее опишите проблему.
0
 Аватар для Новичок
1682 / 1098 / 489
Регистрация: 17.07.2012
Сообщений: 5,360
27.03.2018, 04:58
Цитата Сообщение от olivia11 Посмотреть сообщение
Как разместить информацию о числах из массива
Какую информацию? Какую задачу вы решаете(т.е что вы хотите сделать)?
0
0 / 0 / 0
Регистрация: 29.10.2016
Сообщений: 6
27.03.2018, 05:38  [ТС]
Задан упорядоченный массив целых чисел длины N>>1000. Значения элементов массива находятся в числовом интервале [0, 17].
Нужно написать функцию, которая размещает информацию о числах из массива, используя как можно меньше памяти.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
27.03.2018, 12:15
olivia11, что такое >> ?
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
27.03.2018, 12:45
QuakerRUS, много больше, блин! Что непонятного?
А по теме Сожми по хаффману.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
27.03.2018, 12:50
Если массив упорядочен, то его можно представить массивом целых x[18]
x[0] - Количество чисел равных 0
x[1] - Количество чисел равных 1
и так далее до 17 ....
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
27.03.2018, 13:00
Kuzia domovenok, у меня было подозрение, но в C++ этот знак используется для других целей, поэтому решил уточнить.
0
0 / 0 / 0
Регистрация: 29.10.2016
Сообщений: 6
27.03.2018, 13:59  [ТС]
Я не совсем поняла, как это сделать, если заранее количество чисел неизвестно.
Просто, мне кажется, такая упаковка данных займёт куда больше памяти (целых 18 массивов), вместо 1 динамического.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,920
27.03.2018, 14:27
Байт, это не сохранит порядок
olivia11, мы не знаем какую информацию вы хотите потом из сжатого массива получить. А то можно просто упаковать в структуры
C
1
2
3
4
5
6
struct elems{
  int e1:5;
  int e2:5;
  int e3:5;
};
struct elems arr[];
это даст экономию в 1,3 раза без потери информации. Правда разархивировать будет чуть сложнее.
0
0 / 0 / 0
Регистрация: 29.10.2016
Сообщений: 6
27.03.2018, 14:31  [ТС]
Потом мне нужно будет распаковать данные из массива, то есть т.е. по информации, полученной в этом задании, восстанавить исходное состояние массива.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
27.03.2018, 14:34
COKPOWEHEU, только занимать в памяти будет такая структура число байтов, равное разрядности int. Надо тогда уж 10 значений по 5 бит использовать при 32-разрядном int.

Немного оптимальнее по размеру в восемнадцатеричной системе хранить данные в блоках по 36 байт (при 32-разрядном int), но их будет сложнее извлекать и записывать, чем используя битовые поля.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,920
27.03.2018, 15:00
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <stdint.h>
 
struct elems{
  uint16_t e1:5;
  uint16_t e2:5;
  uint16_t e3:5;
};
struct elems arr[10];
int main(){
  printf("%i\n", sizeof(arr));
}
говорит 20 байт, то есть по 2 байта на элемент. Значит все-таки в 1.5 раза экономия места
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
27.03.2018, 15:40
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Байт, это не сохранит порядок
Не понял, о каком порядке речь.
Вот задание
Цитата Сообщение от olivia11 Посмотреть сообщение
Задан упорядоченный массив целых чисел длины N. Значения элементов массива находятся в числовом интервале [0, 17].
Я понял так, что массив представляет что-то в этом роде: 0 0 0 1 1 3 4 5 5 17 17
Упаковывается по моему предложению он так: 3 2 0 1 1 2 0 0 0 ... 0 2
Восстановить исходный массив не составит труда
3 нолика, 2 единички, 1 тройку ...
Может быть условие надо читать как-то иначе, но мне на это ума не хватает
2
27.03.2018, 15:52

Не по теме:

:D Байт оказался самым внимательным из нас. А мы тут уже почти ракету построили, а надо было молоток.

0
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
27.03.2018, 15:59
Тут нужно применить подход из sparse matrix в scipy.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Индекс — значение, значение — кол-во таких
size_t index_ranges[18] = {};
 
// Получаем оригинальное значение из нашего
int get_val(const size_t index)
{
   int ind = 0;
   size_t offset = 0;
   while(offset+index_ranges[ind]<=index)
   {
       offset+=index_ranges[ind++];
       if(ind>=18)
          throw "Error";
   }
   return ind;
}
Добавлено через 1 минуту
Кстати, такой упаковкой мы ещё добились константной вставки в массив!
0
0 / 0 / 0
Регистрация: 29.10.2016
Сообщений: 6
27.03.2018, 16:05  [ТС]
Извините, я не понимаю, как такая упаковка займёт меньше места.. Ведь так получается целых 18 массивов, вместо одного динамического.

Добавлено через 52 секунды
А можно где-то подробнее об этом почитать? Не совсем пока понимаю, что тут у вас происходит.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
27.03.2018, 16:05
olivia11, у вас упорядоченный массив. Вам нужен один массив со счетчиками на 18 элементов. Смотрите сообщение от Байт.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
27.03.2018, 16:13
Цитата Сообщение от olivia11 Посмотреть сообщение
Ведь так получается целых 18 массивов,
Где это, интересно, вы увидели 18 массивов Есть просто 18 чисел и больше ничего. Эти числа - счетчики. И опять же - больше ничего.
Посмотрите внимательно на пост 14. Там приведен правильный пример массива? Если нет, то вы неправильно сформулировали задачу.

Не по теме:

Цитата Сообщение от olivia11 Посмотреть сообщение
А можно где-то подробнее об этом почитать?
Чего тут читать-то? Позовите ежика - он поймет:)

0
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
27.03.2018, 16:16
И даже более навороченный вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
template<int lower_bound = 0, int upper_bound = 18>
class SparceList
{
private:
    constexpr static size_t RANGE_SIZE = upper_bound-lower_bound;
    // Индекс — значение, значение — кол-во таких
    size_t value_sizes[RANGE_SIZE] = {};
public:
    // Получаем оригинальное значение из нашего
    int get_val(const size_t index)
    {
       size_t ind = 0;
       size_t offset = 0;
       while(offset+value_sizes[ind]<=index)
       {
           offset+=value_sizes[ind++];
           if(ind>=RANGE_SIZE)
              throw "Error";
       }
       return (int)ind+lower_bound;
    }
    void add(const int val)
    {
        if (val>=upper_bound || val<lower_bound)
            throw "Error";
        value_sizes[val-lower_bound]++;
    }
};
Цитата Сообщение от olivia11 Посмотреть сообщение
Ведь так получается целых 18 массивов, вместо одного динамического.
Нет, получается 1 массив с 18 элементами вместо 1 массива с огромным количеством.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.03.2018, 16:16
Помогаю со студенческими работами здесь

Экономия памяти или борьба с точками. (что-то типа массива ссылок хотелось бы иметь)
У меня есть объект Point. И есть Объект Grup. В объекте Grup я выделил динамически память под массив объектов типа Point. Чтоб, как бы...

Экономия по времени
Приветствую всех! Как сделать данную программу максимально быстрой, для прохождения теста в олимпиадном программировании. ...

Экономия трафика при передачи последовательности изображений в сети за счет эффективного кодирования
Всем добрый день! Есть такая задачка: мы берем последовательность изображений и передаем в сеть как видео поток. Необходимо сократить...

Выделить в памяти 1024 ячейки по 8 байт и вывести их адреса(МИНИ менеджер памяти))
Вот тут появилась такая интересная задача: требуется сделать программу которая управляет 1024 ячейками памяти по 8 байт каждая. т.е. за...

Можно ли разместить переменную в нужную ячейку памяти и реально ли хранить данные, разбросанными по памяти?
Добрый день. Не могу найти информацию по двум вопросам : 1) могу ли я разместить переменную в нужную ячейку памяти. Например: int a...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru