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

 
Petros Shatakhtsyan:

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

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



Извинтиляюсь, как прописать 100 и более массивов с известными элементами в этот код?

 
Timur1988:

Извинтиляюсь, как прописать 100 и более массивов с известными элементами в этот код?

Объект динамического массива

int src[][15], num=MathRand()%1000+1;;

for(int i=0; i<num; i++)
   if(ArrayResize(src, i+1)
      ArrayFill(src[i],0,15,1);
 
Timur1988:

Извинтиляюсь, как прописать 100 и более массивов с известными элементами в этот код?


А откуда и каким образом они получаются ?  Их можно и не хранить. После формирования очередной комбинации надо просто вызвать Count.

 
Petros Shatakhtsyan:

А откуда и каким образом они получаются ?  Их можно и не хранить. После формирования очередной комбинации надо просто вызвать Count.

я дико извиняюсь, что не въезжаю!) есть 100 массивов с известными элементами
m3_1[15]={2,3,1,2,1,3,1,1,1,2,2,2,1,3,3}, 

m3_2[15]={1,2,3,3,3,1,2,2,2,1,1,1,2,3,2},

...

m3_100[15]={3,2,2,2,3,3,1,2,1,1,2,1,1,1,1};

как программа их будет распознавать??? и как их забить?

 
Timur1988:

я дико извиняюсь, что не въезжаю!) есть 100 массивов с известными элементами
m3_1[15]={2,3,1,2,1,3,1,1,1,2,2,2,1,3,3}, 

m3_2[15]={1,2,3,3,3,1,2,2,2,1,1,1,2,3,2},

...

m3_100[15]={3,2,2,2,3,3,1,2,1,1,2,1,1,1,1};

как программа их будет распознавать??? и как их забить?

Зачем плодить переменные если проще пройти через многомерный массив.

int m3[100][15] ={
                    {2,3,1,2,1,3,1,1,1,2,2,2,1,3,3},   // 1й массив
                    {1,2,3,3,3,1,2,2,2,1,1,1,2,3,2},   // 2й массив
                    ...                                // Nй массив
                    {3,2,2,2,3,3,1,2,1,1,2,1,1,1,1}    // 100й массив
                 };

int m = m3[54][12];
 

Реализация в лоб: обычным перебором проверить все варианты, сравнить можно пирсоном. Начальная и конечная граница проверяемого массива - переменные.
Шаг 2 - подумать над возможной оптимизацией.

Задача тривиальная.

 

А вообще может код выложите в студию и подробнее опишите что вам надо, а то гадаем на кофейной гуще.

Правильно заданный вопрос - половина ответа

Я например иногда прохожу через такую конструкцию.

struct SSrc{ int src[15]; }; SSrc src[100]; // так проще использовать int num[15]={2,3,1,2,1,3,1,1,1,2,2,2,1,3,3}; ArrayCopy(src[0].src, num); ArrayCopy(src[54].src, num); int n = ArrayCompare(src[0].src, src[54].src, 0, 15);

 
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 будет показывать какая комбинация сколько раз была.  Это самый быстрый способ без сравнения и без поиска.


Действительно единствено простое и тривиальное решение.

создаете массив m10[14358907],

oбнуляете, 

проходите все свои комбинации и преобразовываете комбинацию в индекс. прибавляете единицу к значению массива по индексу.

в конце прохода всех комбинаций имеете накопленную статистику в м10.

Чудно, что тема продолжает обсуждаться...

 
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% массивов), и есть ли алгоритм поиска таких структур?

Весело, как раз такой заказ надо доделать, только там паттерны на барах )) Мысли повторяются.

Чего там сложного-то? Задаешь максимальную длину паттерна, например 10. Идешь по массиву, паттерны пишешь в класс. Классы в хеш-таблицу, в качестве ключа надо придумать хеш-функцию, чтобы быстрее искалось. Если есть повтор паттерна, новый экземпляр класса не создаем, в специальные поля класса пишем нужные вычисляемые значения, например, количество повторов.

Хеш-таблицы есть в кодобазе, аж 2 варианта.

 
Mikhail Dovbakh:

Действительно единствено простое и тривиальное решение.

создаете массив m10[14358907],

oбнуляете, 

проходите все свои комбинации и преобразовываете комбинацию в индекс. прибавляете единицу к значению массива по индексу.

в конце прохода всех комбинаций имеете накопленную статистику в м10.

Чудно, что тема продолжает обсуждаться...


Тут периодически важно и долго обсуждают, как открыть ордер ))