2016-11-26 8 views
0

Я был бы признателен за помощь в эффективной реализации алгоритма сравнения в C++. Моя программа получает вход, состоящий из строк целых последовательностей, и мне нужно найти, какие последовательности являются дубликатами. Но некоторые последовательности могут быть смещены в сторону, и они все равно должны быть равны. С этим я подразумеваю, например, последовательности {0, 1, 22, 5, 9} и {22, 5, 9, 0, 1} должны быть равны. Эти последовательности или количество повторяющихся последовательностей могут иметь размер.C++ эффективное сравнение целых последовательностей (в относительном порядке)

Я, кажется, не думаю о чем-либо, что в некотором роде эффективно (сравнение каждой новой строки со всеми остальными занимает слишком много времени), поэтому я надеюсь, что кто-то может помочь. Заранее спасибо!

+1

Взгляните на [std :: is_permutation] (http://en.cppreference.com/w/cpp/algorithm/is_permutation) –

+0

Перестановки на самом деле не то, что я имел в виду (возможно, я объяснил, что неправильно) Мне нужно числа, которые должны быть в точном orde, с возможностью сдвига. – Sia

+0

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

ответ

2

Решение, которое я могу решить, вычисляет хэш, который не зависит от вращения. Например:

unsigned long long hash(const std::vector<int>& seq) { 
    unsigned long long result; 
    for (int i=0,n=seq.size(),j=n-1; i<n; j=i++) { 
     result ^= seq[i] * 69069ULL + seq[j]; 
    } 
    return result; 
} 

Тогда вы можете создать std::map отображение хэш-код для отображения индексов в последовательности, так что вам нужно сделать полную проверку, только если хэш то же самое.

 Смежные вопросы

  • Нет связанных вопросов^_^