Когда вы говорите о размерах ввода с верхней границей чего-то вроде 50 символов юникода (и я предполагаю, что ваш средний случай намного меньше), тогда выходит много алгоритмических опций. Обычно мы смотрим на голые металлические микро-оптимизации. При таких минимальных размерах ввода пузырь-сортировка может фактически превосходить quicksort.
Если мы пытаемся вычислить объединение между двумя строками из 8 символов, например, стоимость создания вспомогательной структуры или выполнения сортировки «на лету», вероятно, потребует больше времени, чем она экономит против простое решение грубой силы, которое даже имеет квадратичную сложность. Я думаю, что это может быть правдой, даже если вам удастся повторно использовать одну и ту же структуру данных только по причинам, связанным с памятью/кэшем.
Если вы можете предварительно отсортировать обе строки заранее (например: уже хранить отсортированные строки в вашем файле), то вы, вероятно, сможете улучшить, так как объединение одного из двух отсортированных строк можно найти в одном линейном проходе (просто используйте два указателя/индексы). Это предполагает, что вы можете отсортировать все это заранее за пределами этого критического цикла.
В противном случае вы, вероятно, смотрите на микро-оптимизации и хотите захватить профайлер здесь. Наивысший приоритет среди них может быть связан с памятью, учитывая относительный коэффициент усилия/вознаграждения. Например, вы не хотите постоянно выделять и освобождать строковые объекты (и, возможно, больше других промахов в кэше, в зависимости от того, что вы делаете после этого), чтобы сделать это, и хотите повторно использовать одни и те же буферы, если только ваши строки не выделены на аппаратное обеспечение стек (в этом случае распределение/освобождение вообще дешево).
Далее может быть многопоточность, но для этого маршрута вам, вероятно, нужна дополнительная работа для каждого потока, чем вычисление соединения между двумя подростковыми строками. Накладные расходы на планирование, вероятно, перевесят преимущества здесь, поэтому вы хотите, чтобы каждая нить/параллельная итерация вычисляла объединения нескольких (возможно, довольно многих, например, сотен) строк.
'copyrep' имеет р в нем в два раза, что предназначено? Если да, то каковы правила этого союза? – harold
Непонятно, моя ошибка – ElevenFortyOne
Что вы хотите делать с такими странностями, как сочетание диакритических знаков, маркер слева направо, пространство с нулевой шириной, это может быть червями? – harold