Как исследовать массив? - страница 2

 
Timur1988:
Друзья! Буду благодарен за любую информацию.
Тема такая: есть массив, состоящий из 15 элементов. Каждый элемент может принимать только одно из трех числовых значений: 1,2 или 3. Причем значение присваивается случайно.
Например: {1,1,3,1,3,2,1,3,3,3,2,2,3,2,1}. Количество таких массивов N. 
Вопрос: как исследовать эти массивы, есть ли какая-нибудь закономерность у них? Есть ли среди них повторяющиеся шаблоны(например, допустим, что структура {...3,3,2,2...} повторяется у 70% массивов), и есть ли алгоритм поиска таких структур?

Сделайте фильтр.

Например:

int Filter[3] = {1,2,3};
//-------------------------

for(int a1 = 0; a1 < size; a1++)
  {
   if(
         Combination[a1]     == Filter[0]
      && Combination[a1 + 1] == Filter[1]
      && Combination[a1 + 2] == Filter[2]
     )
     {
      Print("Proper combination found!");
      break;
     }
  }
 
Timur1988:
Друзья! Буду благодарен за любую информацию.
Тема такая: есть массив, состоящий из 15 элементов. Каждый элемент может принимать только одно из трех числовых значений: 1,2 или 3. Причем значение присваивается случайно.
Например: {1,1,3,1,3,2,1,3,3,3,2,2,3,2,1}. Количество таких массивов N. 
Вопрос: как исследовать эти массивы, есть ли какая-нибудь закономерность у них? Есть ли среди них повторяющиеся шаблоны(например, допустим, что структура {...3,3,2,2...} повторяется у 70% массивов), и есть ли алгоритм поиска таких структур?

Вам нужно знать какая комбинация сколько раз встречалась ?

Если да, то это простая комбинаторная задача.

 
Petros Shatakhtsyan:

Вам нужно знать какая комбинация сколько раз встречалась ?

Если да, то это простая комбинаторная задача.


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

 
Timur1988:

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


Комбинация естественно не известно. Но если она состоит жестко из 15-и элементов и каждый элемент может принимать только значения 1,2,3, то у меня такой вопрос к вам:

Вы умеете преобразовать цифры из двоичных систем в десятичную  ?   Если да, то считайте что вместо двоичной системы имеете троичную 15-и разрядную систему:  от 000000000000000 до 222222222222222. Количество их будет  К=3^15= 14348907


Так вот, объявляете массив из К элементов, например так int m10[14348907]={0};  Можно брать short int, чтобы сэкономить память.

Берете еще один массив м3[15] для хранения приходящих элементов со значениями 1, 2 или 3  (для троичной системы они будут 0, 1 или 2);

Надо преобразовать содержание м3 в десятичную цифру. Его будем хранить в поле с названием index. И делаете последний шаг:  м10[index]++; 

Каждый элемент массива м10 будет показывать какая комбинация сколько раз была.  Это самый быстрый способ без сравнения и без поиска.

 
Petros Shatakhtsyan:

Комбинация естественно не известно. Но если она состоит жестко из 15-и элементов и каждый элемент может принимать только значения 1,2,3, то у меня такой вопрос к вам:

Вы умеете преобразовать цифры из двоичных систем в десятичную  ?   Если да, то считайте что вместо двоичной системы имеете троичную 15-и разрядную систему:  от 000000000000000 до 222222222222222. Количество их будет  К=3^15= 14348907


Так вот, объявляете массив из К элементов, например так int m10[14348907]={0};  Можно брать short int, чтобы сэкономить память.

Берете еще один массив м3[15] для хранения приходящих элементов со значениями 1, 2 или 3  (для троичной системы они будут 0, 1 или 2);

Надо преобразовать содержание м3 в десятичную цифру. Его будем хранить в поле с названием index. И делаете последний шаг:  м10[index]++; 

Каждый элемент массива м10 будет показывать какая комбинация сколько раз была.  Это самый быстрый способ без сравнения и без поиска.


Круто!

 
Petros Shatakhtsyan:

Комбинация естественно не известно. Но если она состоит жестко из 15-и элементов и каждый элемент может принимать только значения 1,2,3, то у меня такой вопрос к вам:

Вы умеете преобразовать цифры из двоичных систем в десятичную  ?   Если да, то считайте что вместо двоичной системы имеете троичную 15-и разрядную систему:  от 000000000000000 до 222222222222222. Количество их будет  К=3^15= 14348907


Так вот, объявляете массив из К элементов, например так int m10[14348907]={0};  Можно брать short int, чтобы сэкономить память.

Берете еще один массив м3[15] для хранения приходящих элементов со значениями 1, 2 или 3  (для троичной системы они будут 0, 1 или 2);

Надо преобразовать содержание м3 в десятичную цифру. Его будем хранить в поле с названием index. И делаете последний шаг:  м10[index]++; 

Каждый элемент массива м10 будет показывать какая комбинация сколько раз была.  Это самый быстрый способ без сравнения и без поиска.

Классный вариант, очень быстрый. Только он не различает разную длину вектора, например 1123(0012) будет так же как и 111123(000012). В скобках указано ваше кодирование в троичной системе счисления, видно, что они будут давать один и тот же индекс.
 
Aliaksandr Hryshyn:
Классный вариант, очень быстрый. Только он не различает разную длину вектора, например 1123(0012) будет так же как и 111123(000012). В скобках указано ваше кодирование в троичной системе счисления, видно, что они будут давать один и тот же индекс.

Умничать не надо. Все это учтены и поэтому уточнил, как он и хотел:  Но если она состоит жестко из 15-и элементов и каждый элемент может принимать только значения 1,2,3, то...

Естественно можно сделать универсальный вариант, с учетом размерности. Это же частный случай. И реализация его будет легко. Код будет небольшой, наверно 10-15 строк.

И еще размер можно фиксировать а пустые разряды заполнить нулями.  В программировании надо взвешивать:  универсальность или простое решение. Вот моё решение можно реализовать за 10 минут. 

 
Petros Shatakhtsyan:

Умничать не надо. Все это учтены и поэтому уточнил, как он и хотел:  Но если она состоит жестко из 15-и элементов и каждый элемент может принимать только значения 1,2,3, то...

Естественно можно сделать универсальный вариант, с учетом размерности. Это же частный случай. И реализация его будет легко. Код будет небольшой, наверно 10-15 строк.

И еще размер можно фиксировать а пустые разряды заполнить нулями.  В программировании надо взвешивать:  универсальность или простое решение. Вот моё решение можно реализовать за 10 минут. 


А можно в виде кода, а то я не совсем понял, пжлста!

 
Timur1988:

А можно в виде кода, а то я не совсем понял, пжлста!

В массиве m3 будет формироваться очередная порция из чисел 1,2,3. После чего каждый раз надо вызвать функцию Count.

А в m10 будут собираться количество одинаковых комбинаций.  Но чтобы увидеть какая комбинация сколько раз повторяется надо и еще сделать обратное преобразование, т.е соответствующий индекс массива m10 преобразовать 15 разрядную троичную систему.


#define k 14348907
   int m10[k]={0};
   int m3[15]={ 1,1,1,1,1,1,1,1,1,1,1,3,2,1,3 };
   int index;
   int  n=15;
void OnInit()
{
   Count();
}
void Count()
{
   index=0;
   for (int i=0; i<n; i++)
   {
       index+= (m3[i]-1) * (int) pow(3, n-i-1);
   }
   m10[index]++; 
}
 
Timur1988:
Друзья! Буду благодарен за любую информацию.
Тема такая: есть массив, состоящий из 15 элементов. Каждый элемент может принимать только одно из трех числовых значений: 1,2 или 3. Причем значение присваивается случайно.
Например: {1,1,3,1,3,2,1,3,3,3,2,2,3,2,1}. Количество таких массивов N. 
Вопрос: как исследовать эти массивы, есть ли какая-нибудь закономерность у них? Есть ли среди них повторяющиеся шаблоны(например, допустим, что структура {...3,3,2,2...} повторяется у 70% массивов), и есть ли алгоритм поиска таких структур?

Телепатическим путем думаю подойдет ArrayCompare