Bogdan1111
@Bogdan1111

Как работать со строковыми матрицами?

Не могу понять, как проверить для каждой строки матрицы А, можно ли перестановкой ее символов получить последовательность символ, записанных в строках матрицы B.
  • Вопрос задан
  • 155 просмотров
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Простейший способ — отсортировать каждую строку обеих матриц. Строки, изначально являвшиеся анаграммами, будут совпадать, и теперь уже можно выяснять, что с чем совпадает. Сложность O(w·(hA+hB)·max{hA+hB, log w})

Более сложный (лучше асимптотическая оценка). После того, как отсортировали каждую строку, строки матрицы B дополнительно переупорядочиваем в лексикографическом порядке (ААА < ААБ <…< ААЯ < АБА). Для поиска совпадений пользуемся двоичным поиском. Сложность O(w·(hA+hB)·log max{w, hA, hB}).

Можно также каждой строчке матрицы B посчитать хэши и запомнить в какой-то структуре данных: хэш не совпал ни с чем — полное сравнение не проводится. Не улучшает оценки в худшем случае, но улучшает в среднем.

Офтоп. Было дело, я оптимизировал WAD’ы Doom’а по размеру (формат позволял нескольким блокам ссылаться на один и тот же участок файла, а во многих модах — и даже в самом Doom’е — были повторы). Обошёлся хэшированием, и хэшем был размер + несколько байт из середины блока.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Bogdan1111
@Bogdan1111 Автор вопроса
Ваш ответ на вопрос

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

Похожие вопросы