Я извиняюсь сейчас, потому что эти вопросы звучат глупо в моей голове, и я, вероятно, не замечаю что-то очень очевидное. В любом случае ...Эффективный алгоритм поиска строк?
Хорошо, поэтому я учу себя scala и как упражнение для обучения, я решил реализовать метод, который определяет, содержит ли одна строка другую меньшую строку. Первое, что я сделал, это использовать наивную версию, где я перехожу к каждой букве строки и начинаю проверять вперед, чтобы увидеть, соответствует ли каждый символ. Все прошло хорошо. Тогда я решил реализовать более эффективный способ, и это то, что я придумал (никаких особых случаев не входит в комплект):
// return true if a is a substring of b
def is_sub(a: String, b: String) : Boolean = {
for(i <- 0 until b.length-a.length) { // O(n-m)
if(a.hashCode == b.substring(i,a.length+i).hashCode) return true // O(1) + O(1) + O(1)
}
return false
}
Во-первых, кто-то может проверить мою работу и убедитесь, что я прав. Я склонен к глупым ошибкам. Во-вторых, можете ли вы проверить, насколько точны мои временные сложности. Предполагая, что первые 2 - это то, что я думаю, почему они не упомянуты на странице wikipedia для string searching algorithms? Теоретически это должно быть O (n-m) без необходимого пространства для предварительной обработки.
Где я напортачил свой анализ этой проблемы?
Считаете ли вы временную сложность хеширования? –
@ alex23 - Подстрока O (1) в java/scala. Диод - Я думал, что временная сложность хеширования была постоянным временем, но я думаю, что я был неправ. –
user439299
@ user439299 - Подстрока * была * O (1) в java, но с обновления 7 для Java 7 предпочтение - сделать копию - в O (n). См. Http://mail.openjdk.java.net/pipermail/core-libs-dev/2012-May/010257.html. –