Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
ramezz
0 / 0 / 0
Регистрация: 22.09.2010
Сообщений: 3
#1

"Сжатие" массива - C++

22.09.2010, 16:34. Просмотров 1242. Ответов 6
Метки нет (Все метки)

Натолкнулся на проблему, помогите, пожалуйста разобраться.
Допустим у нас есть массив из 100 элементов. Чтобы "сжать" его в массив из 50 элементов, достаточно брать среднее арифм. каждых двух подряд идущих чисел и записывать в новый массив. А как поступить, если нужно массив из 100 "сжать" в массив, например, из 70 элементов?
(например из 10 20 30 получить 13.66 и 26.33)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2010, 16:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос "Сжатие" массива (C++):

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно". Я так...

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

Создать класс "Вентилятор" содержащий в себе классы: "Двигатель", "Контроллер", "Пульт управления" - C++
Помогите с кодом написания задачи, не понимаю как написать классы в классе. Нужно создать класс "вентилятор" содержащий в себе классы:...

Создать абстрактный класс "Издание" и производные классы "Книга", "Статья", "Электронный ресурс" - C++
1. Создать абстрактный класс Издание с методами, позволяющими вывести на экран информацию об издании, а также определить является ли данное...

Создать класс "Книга" с полями "название книги", "количество страниц", "год издания" - C++
Создать класс Книга поля: название книги,количество страниц,год издания методы: вычислить сколько лет книге и количество дней прошедших...

Определить тип данных "Запись", имеющий поля "Фамилия", "Пол", "Зарплата" - C++
определить тип данных запись имеющий поля фамилия пол зарплата. определить массив из 10 записей. в программе ввести в массив данные и...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
22.09.2010, 16:41 #2
Алгоритм "сжимания" должен быть прописан в условии задачи.
Нет такого общепринятого понятия.
ramezz
0 / 0 / 0
Регистрация: 22.09.2010
Сообщений: 3
22.09.2010, 17:37  [ТС] #3
ну допустим есть 10 элементов. Берем среднее арифметическое каждых 2-х подряд идущих. Получаем массив из 5 элементов. А если нужно получить на выходе массив из 7 элементов, то непонятно как брать эти самые средние арифметические каждых 1.42 идущих подряд чисел.
Если представить, что массив - это график функции y = x, то по сути нужно получить график, подобный исходному, только с меньшим числом аргументов.
LineStown
66 / 66 / 3
Регистрация: 04.08.2010
Сообщений: 420
Завершенные тесты: 1
22.09.2010, 17:43 #4
ИМХО:Если использовать такую теорию, то "сжимать" нужно так
брать равномерно среднее арифметическое сколько раз, на сколько нужно урезать массив.
Пример: массив 10 символов. Урезать до 7. то нужно взять ср.ариф 10-7=3 раза. 10/3=3.3, в среднем каждые 3 элемента (3 с 4,6 с 7,9 с 10) Ну примерно так.....
Нужно график нарисовать и посмотреть (y=значение х=номер элемента в массиве)
(результат нужно тестить, сча какую то прогу сваяю, посмотрим)
silent_1991
Эксперт С++
4963 / 3039 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
22.09.2010, 17:47 #5
А если, например, брать средние арифметические только до тех пор, пока они нужны?
ramezz
0 / 0 / 0
Регистрация: 22.09.2010
Сообщений: 3
22.09.2010, 18:11  [ТС] #6
Цитата Сообщение от silent_1991 Посмотреть сообщение
А если, например, брать средние арифметические только до тех пор, пока они нужны?
нене, вот немного подробнее написал:

допустим есть 2 массива а и b одинаковой длины по 100 элементов. мне нужно их сложить, но не поэлементно, а с учетом каллибровки.
Т.е. если 1-ый массив по существу хранит значения по равномерной шкале от 10 до 40 кг (т.е. элементу а[0] соответствует - кол-во предметов весом 10кг, элементу а[1] - кол-во предметов весом 13,33 кг и т.д. элементу а[99] - кол-во предметов весом 40 кг), а 2-ой массив также хранит значения кол-ва предметов определенного веса, но по равномерной шкале от 1 до 100 кг. Повторюсь, количесвто элементов в массивах одинаково
Очевидно, что поэлементное сложение лишает задачу смысла. А нужно 100 элементов массива а добавить в нужный промежуток из 40 элементов массива b. Так вот я и спрашиваю, как бы сжать 1-ый массив для добавления его в отрезок из 2-го

Добавлено через 5 минут
Цитата Сообщение от LineStown Посмотреть сообщение
брать равномерно среднее арифметическое сколько раз, на сколько нужно урезать массив.
получить нужно 7-ми элементный, то есть урезать на 3. и соот-но среднее арифм. брать 7 раз.
т.е. если это числа 4 9 3 1 4 10 3 6 7 2
то первым числом выходного массива будет 4*(7/7) + 9*(3/7) = 55/7
Nick Alte
Эксперт С++
1636 / 1008 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
22.09.2010, 19:25 #7
Наиболее очевидный ответ - линейная интерполяция. Формула взвешенного среднего a и b с коэффициентом k выглядит как a*(1-k) + b*k. В данном случае k, который всегда находится в интервале от 0 до 1 - показатель "близости" к a или b: 0 соответствует нахождению в a, 1 соответствует b, а 0.5 - на полпути между ними.
Допустим, нам надо перегнать массив размером 17 в массив с размером 11.
Остаётся перекалибровать шкалу индексов: спроецируем новый интервал от 0 до 6 на старый, от 0 до 9. Обозначив старый индекс как i', а новый как i, получим i' = i*16/10 (заметим, что здесь мы пользуемся размерами массивов, уменьшенными на 1, при этом крайние элементы в исходном и результирующем массивах будут совпадать).
Рассмотрим на примере элемента нового массива с индексом 4: i' = 4*16/10 = 6.4
Получается, что в новый массив под индексом 4 мы занесём взвешенную сумму элементов 6 и 7 с коэффициентом 0.4
Таким образом массивы можно как сжимать, так и расширять (однако когда мы сжимаем в 2 и более раз, понадобятся дополнительные ухищрения).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2010, 19:25
Привет! Вот еще темы с ответами:

В одномерном массиве состоящим из "N" вещественных элементов вычислить сумму элемента массива с не четными "N" - C++
Помогите решить задачу плизз... В одномерном массиве состоящим из "N" вещественных элементов вычислить сумму элемента массива с не...

Для массива из 10 чисел проверить, есть ли в нем два одинаковых числа и напечатать "да" или "нет" - C++
void check_same(const int* a) { for (const int* p = a; p < a + 9; p++) for (const int* q = p+1; q < a + 10; q++) ...

по строкам.замените в слове сочетание "му" на "а" , а букву "ы" на "ца". очень нужно - C++
замените в слове сочетание "му" на "а" , а букву "ы" на "ца". очень нужно Добавлено через 21 час 4 минуты неужели никто не знает...

Создать иерархию классов "Фирма", "Бухгалтер", "Сотрудник", "Зарплата" - C++
Само по себе понятие "зарплата" не особенно конкретное: оно включает и почасовую, и ставочную зарплату, и комиссионные, и процент с продаж....


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.09.2010, 19:25
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru