У меня в настоящее время есть решение, но я чувствую, что это не так эффективно, как это может быть для этой проблемы, поэтому я хочу посмотреть, есть ли более быстрый метод для это.Наиболее эффективный способ найти индекс совпадающих значений в двух отсортированных массивах с использованием C++
У меня есть два массива (например, std :: векторы). Оба массива содержат только уникальные целочисленные значения, которые сортируются, но являются разреженными по значению, то есть: 1,4,12,13 ... Что я хочу спросить, так это быстрый способ найти INDEX для одного из массивов, где значения одинаковы. Например, массив 1 имеет значения 1,4,12,13, а array2 имеет значения 2,12,14,16. Первый индекс совпадающего значения равен 1 в массиве2. Индекс в массив - это то, что важно, поскольку у меня есть другие массивы, содержащие данные, которые будут использовать этот индекс, который «соответствует».
Я не ограничены использованием массивов, возможны карты. Я только сравниваю два массива один раз. Они не будут повторно использоваться повторно после первого совпадения. В любом массиве может быть небольшое или большое количество значений (300 000+), но НЕ всегда иметь одинаковое количество значений (что значительно упростило бы работу)
Худший случай - линейный поиск O (N^2). Использование карты поможет мне лучше O (log N), но я бы все же преобразовал массив в карту значений, пары индексов.
То, что я в настоящее время не должен делать, конвертирует тип контейнера. Перемещайтесь по меньшему из двух массивов. Сравните текущий элемент малого массива (array1) с текущим элементом большого массива (array2). Если значение элемента array1 больше, чем значение элемента array2, увеличьте индекс для массива2 до тех пор, пока он больше не будет больше значения элемента array1 (while loop). Затем, если значение элемента array1 меньше, чем элемент array2, перейдите к следующей итерации цикла и начните снова. В противном случае они должны быть равны, и у меня есть индекс для массивов соответствующего значения.
Итак, в этом цикле я в лучшем случае O (N), если все значения имеют совпадения и хуже O (2N), если они не совпадают. Поэтому мне интересно, есть ли что-то быстрее? Трудно точно знать, как часто будут совпадать два массива, но я бы предпочел бы больше ориентироваться на большинство массивов, в основном будет иметь совпадения, чем нет.
Надеюсь, я достаточно хорошо объяснил проблему, и я ценю любые отзывы или советы по улучшению этого.
Пример кода:
std::vector<int> array1 = {4,6,12,34};
std::vector<int> array2 = {1,3,6,34,40};
for(unsigned int i=0, z=0; i < array1.size(); i++)
{
int value1 = array1[i];
while(value1 > array2[z] && z < array2.size())
z++;
if (z >= array2.size())
break; // reached end of array2
if (value1 < array2[z])
continue;
// we have a match, i and z indices have same value
}
Результат будет соответствие индексов для array1 = [1,3], а для массив2 = [2,3]
Где мой код? – Christophe
Добавлен пример кода текущего решения – scottiedoo
Мне любопытно, в каком контексте вам нужен этот алгоритм? – user2079303