Учитывая 2d массив ( массив может быть больше чем 10k * 10k ) с целочисленными значениями, как быстрее найти данную последовательность чисел в массиве?
Предположим, что двумерный массив, который находится в файле, читается в большой 1d вектор и доступен как big_matrix (строка * x + ширина).Есть 3 типа поиска, которые я хотел бы сделать в одном и том же массиве.Это поиск по заказу, поиск по порядку, поиск лучшего соответствия.Вот мой подход к каждой из функций поиска.
Упорядоченный поиск : Эта функция находит все строки, в которых присутствует данная числовая последовательность (порядок чисел имеет значение).Вот метод KMP для поиска заданной числовой последовательности, которую я реализовал:
void searchPattern(std::vector<int> const &pattern, std::vector<int> const &big_matrix, int begin, int finish,
int width, std::vector<int> &searchResult) {
auto M = (int) pattern.size();
auto N = width; // size of one row
while (begin < finish) {
int i = 0;
int j = 0;
while (i < N) {
if (pattern[j] == big_matrix[(begin * width) + i]) {
j++;
i++;
}
if (j == M) {
searchResult[begin] = begin;
begin++;
break;
} else if (i < N && pattern[j] != big_matrix[(begin * width) + i]) {
if (j != 0)
j = lps[j - 1]; // lookup table as in KMP
else
i = i + 1;
}
}
if (j != M) {
searchResult[begin] = -1;
begin++;
}
}
}
Сложность: O (m * n);m - количество строк, n - количество столбцов
Поиск неупорядоченных / Поиск наилучшего совпадения : эта функция находит все строки, в которых присутствует заданная числовая последовательность (порядок чисел нене имеет значения).Здесь я изначально сортирую большой массив и просто сортирую только входной массив во время поиска.
void SearchUnordered/BestMatch(std::vector<int> const &match, std::vector<int> const &big_matrix_sorted, int begin, int finish,
int width, std::vector<int> &searchResult) {
std::vector<int>::iterator it;
std::vector<int> v(match.size() + width);
while (begin < finish) {
it = std::set_intersection(match.begin(), match.end(), big_matrix_sorted.begin() + begin * width,
big_matrix_sorted.begin() + begin * width + width, v.begin());
v.resize(it - v.begin());
if (v.size() == subseq.size())
searchResult[begin] = begin;
else
searchResult[begin] = -1;
begin++;
/* For search best match the last few lines will change as follows:
searchResult[begin] = (int) v.size();
begin++; and largest in searchResult will be the result */
}
}
Сложность: O (m * (l + n));l - длина шаблона, m - количество строк, n - количество столбцов.
Предварительная обработка big_matrix (Построение таблицы поиска, сохранение отсортированной версии.разрешено выполнять любые предварительные операции.) не учитывается .Как я могу улучшить сложность (до O (log (m * n) )) этих функций поиска?