Shabunoff
@Shabunoff

Как сравнить несколько последовательностей цифр между собой?

Есть набор (например 5000 штук) последовательностей из 15 цифр. Эти цифры 1, 2 или 3. Например:
121231321223212

Нужно сравнить каждую из последовательностей с каждой и "запомнить" количество совпадений между ними.

Например последовательности:
111111111111121
111111111111112
Имеют 13 совпадений.

Пробовал и перебор массива (каждая цифра - отдельный элемент) и библиотеку fuzzywuzzy.

Хотелось бы побыстрее, очень медленно.

Снова вернулся к решению данного вопроса:

diff=2
matrix = [[0] * len(list) for i in range(len(list))]
for i in range(len(list)):
for j in range(i, len(list)):
dis = distance.hamming(list[i], list[j])
if dis < diff:
matrix[i][j] = 1
matrix[j][i] = 1

Кусок кода сравнивает каждую строку списка list типа '111132123123213' друг с другом, и строит квадратную матрицу,
в пересечении строк и столбцов которой записывается 1 (если строки отличаются меньше чем на заданное количество (diff) отличий), либо 0 (если наоборот).

Задача ускорить данный кусок кода.
При такой реализации при списке из 1340 строк он выполняется на моем ПК за 2,5 секунд, а хотелось бы работать со списками от 20000 до 100000 строк.
  • Вопрос задан
  • 484 просмотра
Пригласить эксперта
Ответы на вопрос 4
longclaps
@longclaps
Зачем "запоминать количество совпадений между ними", когда его можно мгновенно вычислить:
>>> import operator
>>> sum(map(operator.eq,'111111111111121','111111111111112'))
13
Ответ написан
dimonchik2013
@dimonchik2013
non progredi est regredi
hamming distance чем меньше, тем больше совпадений
Ответ написан
Комментировать
trapwalker
@trapwalker
Программист, энтузиаст
А какие конкретно у вас пожелания на счет скорости? У вас сложность квадратичная, 25 миллионов сравнений. Ну можно бинарные операции подключить, можно последовательности как-то обрабатывать, например сортировать. Однако в этой формулировке не ясно что не так и какие у вас получились скорости. От чего-то ж надо отталкиваться. Покажите код и вам его здесь пооптимизируют.
А сейчас задача выглядит как "пойди туда - не знаю куда".
Так-то можно упороться и на шейдерах это решать за счет видеокарты. Вопрос только в том, для чего все эти извращения. Если простая учебная задача - то на то она и задача, чтобы самому решать, а не на Q&A, а если практическая, то попахивает проблемами в архитектуре на более ранних этапах. Не ясна причина почему нужно быстрее, это часто повторяющаяся задача? Если так, то, быть может, имеет смысл изначально оптимизировать? Эта задача инициируется пользователем? Так может имеет смысл прибегнуть к ленивым вычислениям или посчитать заранее,чтобы не фризить интерфейсы?
Короче, нужно больше подробностей.
Ответ написан
Комментировать
@Android_Developer
I am Java Developer
int n, max, a, b;

cout<<"n=";cin>>n;
cin>>a;
cin>>b;
max = a + b;

for(int i =3;i <= n;i++){
cin>>a;
if(max < a + b){
max = a + b;
}
b = a;
}
cout<<"max="<
Рад помоч !
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы