У меня есть несколько строк, и символы не будут повторяться в одной строке. например: «AABC» невозможно.кластерные строки - какой алгоритм подходит?
Я хочу сгруппировать их в множествами своими общими подстроками. например: «ABC, CDF, GHP» будет кластеризоваться в два набора {ABC, CDF}, {GHP}.
несколько строк с одной или несколькими общими строками будут в одном наборе. Строка, которая не имеет общей подстроки с любыми другими строками, будет сама по себе. , так что держите количество наименьших наборов.
например: 1. «ABC, AHD, AKJ, LAN, WER» будет состоять из двух наборов {ABC, AHD, AKJ, LAN}, {WER}. 2. «ABC, BDF, HLK, YHT, PX» будет 3 набора {ABC, BDF}. {HLK, YHT}, {PX}.
Нахождение струны, которая не имеет ничего общего с другими, легко, я думаю;
for(i=0; i< strings.num; i++)
{ str1 = strings[i];
bool m_com=false;
for(j=0;j < strings.num; j++)
{
str2=strings[j];
if(hascommon(str1,str2))
m_com=true;
}
if(!m_com)
{
str1 has no common substring with any string,
}
}
сейчас я думаю о других, как их классифицировать, есть ли подходящий для этого алгоритм?
Input: строки (символы не будут повторяться)
выход: наборов (сохранить количество наборов как можно меньше)
Я знаю, что это связанно с нахождением общей проблемы подстроки и кластеризации , , но я не знаком с методами кластеризации, поэтому я надеюсь, что какой-то один может порекомендовать мне такой алгоритм.
пока я ищу хорошие способы сделать это, я также ценю предложения от других.
Совет: на самом деле эти строки являются простыми путями между двумя точками графика. Я хочу найти край, удаление которого разрешает все эти пути. число таких ребер должно быть минимальным. поэтому для AB, BC, CD это означает, что существует единственный путь ABCD. и я записываю алгоритм поиска общих подстрок в моем случае (мой случай намного проще). Я думаю, что я мог бы использовать этот алгоритм во время кластеризации для измерения сходства.
Возможно, у меня есть два пути, {ABC, ADC}, оба удаления A или удаления B могут разделить пути. , или я мог бы иметь {ABC, ADC, HG}, поэтому все действия удаляются {A, H} или {CH}, {CG} или {AG}.
Я думал, что смогу это решить, найдя общие подстроки, затем я решаю, где удалить края.
Если в кластер A помещена строка S, означает ли это, что существует СУЩЕСТВУЕТ другую строку S 'в кластере A, которая имеет общую подстроку с S или это означает, что ВСЕ другие строки A [0], A [1] ... имеют общие подстроки с S. Конкретный случай: AB, BC, CD. AB и BC помещаются в один кластер. Что происходит с CD? –
все строки в одном кластере разделяют одну или несколько общих подстрок. на самом деле эти строки являются простыми путями между двумя точками. Я хочу найти край, удаление которого разрешает все эти пути. такое ребро должно быть наименьшим. поэтому для AB, BC, CD это означает один путь ABCD :). Я думал, что смогу решить это, найдя общие части путей. – arslan
Итак, если я правильно понимаю, у вас есть вершины A, B, C и т. Д., А AB - это край между A и B. Вы хотите найти набор ребер, удалив их, ваш график больше не будет связан. Таким образом, вы в основном хотите узнать граничную связность графика, что может быть сделано путем нахождения максимального потока. См. «Вычислительные аспекты» на этой странице: https://en.wikipedia.org/wiki/K-edge-connected_graph –