равный переход между числами в двух массивах

#c #arrays

#c #массивы

Вопрос:

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

Например, если у меня есть

 arr1 = 2,1,4,2,8,3
sub= 1,2,3
 

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

 arr1 = 2,1,5,2,1,2,3
sub= 1,2,3
 

Я хочу, чтобы моя функция возвращала 0, потому что минимальный разрыв между 1,2,3 в arr1 равен 0

Вот код, который я пытаюсь сделать: Мой код всегда возвращает 0 можете ли вы помочь мне понять, почему и как я могу это решить.

      int gap(int* arr, int* sub, int sizeArr, int sizeSub)
{
    int index = 0; int gap = 0; bool flag = true;
    int i = -1;
    for (int jump = 1; jump < sizeArr / sizeSub; jump  )
    {
        index = 0;
        for (i = i  1; i < sizeArr; i  )
        {
            if (sub[index] == arr[i])
            {
                for (int j = i   jump, index = 1; j < sizeArr; j = j   jump, index  )
                {
                    if (arr[j] != sub[index]) { flag = false; break; }
                    else if (arr[j] == sub[index] amp;amp; index == sizeSub) { flag = true; break; }
                }
            }
            if (!flag) { break; }
            else { gap = jump; break; }
        }
    }
    return gap;
}
 

Комментарии:

1. Поскольку вы пытаетесь найти минимальный скачок, я бы написал код примерно так int gap(int* arr1, int* sub, int sizearr1, int sizesub) { for (int jump = 1; jump <= sizearr1/sizesub; jump) ... , т.е. Начните искать скачок первого размера, если вы его не найдете, тогда ищите скачок второго размера и т. Д. Возможно, что-то более сложное было бы более эффективным, но именно с этого я бы начал.

2. Я понимаю, что вы хотите, чтобы я делал. Но я понятия не имею, как реализовать это с двумя массивами. И почему ваш цикл до sizearr1 / sizesub

3. Итак, пробел — это самая длинная последовательность чисел, которые не являются частью второго массива? Я бы сказал, что это почти совпадает, но из двух примеров трудно сказать. Кстати: является ли ваш второй массив набором? В этом случае элементы уникальны, и их порядок не имеет значения. В любом случае, что касается вашего фактического вопроса, используйте отладчик для пошагового просмотра кода, чтобы выяснить, где именно он идет не так.

Ответ №1:

Изначально вы взяли gap одинаково 0 , но я думаю, что больше подходит не хранить gap и начинать итерацию jump 0 . И возвращайте переход сразу после того, как вы обнаружили, что он подходит.

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

 int a[] = { 2,1,4,4,2,8,5,3 };
int s[] = { 1,2,3 };
 

Я думаю, вам следует объявить переменную как можно скорее, иначе возникнут нежелательные побочные эффекты.

Таким образом, ваш код может быть переписан как

 int gap(int *arr, int *sub, int sizeArr, int sizeSub)
{
    for (int jump = 0; 1   (jump   1) * (sizeSub - 1) <= sizeArr; jump  ) {
        for (int start_index = 0; start_index   (jump   1) * (sizeSub - 1) < sizeArr; start_index  ) {
            bool flag = true;
            for (int index = 0; index < sizeSub;   index) {
                if (arr[start_index   index * (jump   1)] != sub[index]) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                return jump;
            }
        }
    }
    return -1; //or some value that indicate that there is no answer
}
 

Комментарии:

1. Спасибо вам. Можете ли вы объяснить, какова ваша логика в коде и что делает ваш вложенный цикл, и что это значит 1 (jump 1) * (sizeSub — 1) <= sizeArr

2. Сначала я перебираю переход, когда пытаюсь найти позицию, в которой подмассив появляется в массиве с учетом пробелов, поэтому в int a[] = { 2,8,1,4,2,5,3 }; int s[] = { 1,2,3 }; начальной позиции, когда jump=1 равно 2. И третий цикл проверяет, действительно ли подмножество отображается в этой позиции. 1 (jump 1) * (sizeSub - 1) <= sizeArr проверяет, что, по крайней мере, теоретически мы можем поместить наш подмассив в массив с gap=jump