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

Определение промежутков в массиве - C++

Восстановить пароль Регистрация
 
ustus_alex
6 / 6 / 1
Регистрация: 22.11.2013
Сообщений: 100
22.11.2013, 17:52     Определение промежутков в массиве #1
Доброго дня,

весь день ломаю голову и никак не могу решить возникшую перед самим собой задачу.

Имеется у меня в наличие массив размерности 378000 строк.
В массив занесены значения событий, принимающие значения 1, если событие есть и 0, если события нет.

Нужно определить как часто меняются события между собой.

Вот пример массива:
1 1 1 1 0 0 1 1 0 1 1 1 0 0 0 1 1 , где количество промежутков с единицами = 4, с нулями = 3

Меня интересует определение количества промежутков,которые содержат единицы.

Очень надеюсь на Вашу помощь
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2013, 17:52     Определение промежутков в массиве
Посмотрите здесь:

Определение количества цифры Х в одномерном массиве!? C++
определение кол-ва участков м массиве C++
C++ определение неотрицательных элементов и их индексов в одномерном массиве(не найду ошибку)
Определение количества элементов в динамическом массиве оператором sizeof() C++
определение сколько символов/чисел в массиве C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
22.11.2013, 18:41     Определение промежутков в массиве #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <vector>
#include <algorithm>
 
int main()
{
   std::vector<int> v {1,1,1,1,0,0,1,1,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,1};
   v.erase(std::unique(v.begin(), v.end()), v.end());
   std::cout << "1: " << std::count(v.begin(), v.end(), 1) << std::endl;
   std::cout << "0: " << std::count(v.begin(), v.end(), 0) << std::endl;
 
   return 0;
}
ustus_alex
6 / 6 / 1
Регистрация: 22.11.2013
Сообщений: 100
22.11.2013, 18:51  [ТС]     Определение промежутков в массиве #3
Цитата Сообщение от DiffEreD Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <vector>
#include <algorithm>
 
int main()
{
   std::vector<int> v {1,1,1,1,0,0,1,1,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,1};
   v.erase(std::unique(v.begin(), v.end()), v.end());
   std::cout << "1: " << std::count(v.begin(), v.end(), 1) << std::endl;
   std::cout << "0: " << std::count(v.begin(), v.end(), 0) << std::endl;
 
   return 0;
}
К сожалению, так мне не подойдет, так как нужно будет алгоритм портировать и в матлаб, где будет считаться мой mat file. Мне бы алгоритм доступный без спец. средств. Хотя бы логику понять
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
22.11.2013, 19:17     Определение промежутков в массиве #4
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
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
 
namespace my
{
template<class ForwardIt>
ForwardIt unique(ForwardIt first, ForwardIt last)
{
    if (first == last)
        return last;
 
    ForwardIt result = first;
    while (++first != last) {
        if (!(*result == *first)) {
            *(++result) = *first;
        }
    }
    return ++result;
}
 
template<class InputIt, class T>
int count(InputIt first, InputIt last, const T& value)
{
    int ret = 0;
    for (; first != last; ++first) {
        if (*first == value) {
            ret++;
        }
    }
    return ret;
}
}
 
int main()
{
   int a[] {1,1,1,1,0,0,1,1,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,1};
   int* p = my::unique(&a[0], &a[sizeof(a) / sizeof(a[0])]);
   std::cout << "1: " << my::count(&a[0], p, 1) << std::endl;
   std::cout << "0: " << my::count(&a[0], p, 0) << std::endl;
 
   return 0;
}
ustus_alex
6 / 6 / 1
Регистрация: 22.11.2013
Сообщений: 100
22.11.2013, 19:34  [ТС]     Определение промежутков в массиве #5
Цитата Сообщение от DiffEreD Посмотреть сообщение
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
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
 
namespace my
{
template<class ForwardIt>
ForwardIt unique(ForwardIt first, ForwardIt last)
{
    if (first == last)
        return last;
 
    ForwardIt result = first;
    while (++first != last) {
        if (!(*result == *first)) {
            *(++result) = *first;
        }
    }
    return ++result;
}
 
template<class InputIt, class T>
int count(InputIt first, InputIt last, const T& value)
{
    int ret = 0;
    for (; first != last; ++first) {
        if (*first == value) {
            ret++;
        }
    }
    return ret;
}
}
 
int main()
{
   int a[] {1,1,1,1,0,0,1,1,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,1};
   int* p = my::unique(&a[0], &a[sizeof(a) / sizeof(a[0])]);
   std::cout << "1: " << my::count(&a[0], p, 1) << std::endl;
   std::cout << "0: " << my::count(&a[0], p, 0) << std::endl;
 
   return 0;
}
Спасибо Вам огромное мне конечно, как новичку в с++ сложно так сразу понять логику, но я разберусь.

А, что и как нужно изменить в коде, чтобы проделать это с другим массивом вида:
{ 0, 0, 0, 0, 55, 56, 67, 83, 1, 0, 0, 0, 5, 7, 9, 0}
т.е задача сводится к тому, чтобы опредилить число интервалов отличных от нуля в данном случае их 2
Yandex
Объявления
22.11.2013, 19:34     Определение промежутков в массиве
Ответ Создать тему
Опции темы

Текущее время: 21:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru