Попытка понять, почему два похожих решения DP для общей проблемы со строками имеют разные результаты производительности.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Попытка понять, почему два похожих решения DP для общей проблемы со строками имеют разные результаты производительности.

Сообщение Anonymous »

Это два решения проблемы с лит-кодом под названием «Разрыв слова». По сути, код определяет, может ли данная строка состоять из одного или нескольких слов в словаре.
Эти два решения используют восходящий DP для построения таблицы dp и получения решения. Один сканирует строку вперед, другой — назад. Я расположил код так, чтобы самый затратный вызов, s.substring, не происходил до самого последнего момента. Насколько я могу судить, оба из них имеют временную сложность O (длина строки * размер dict).
При их сравнительном тестировании решение, которое сканирует строку вперед, постоянно составляет от 1,8 до 2x. быстрее, чем решение, которое сканирует строку назад. Я знаю, что микробенчмаркинг может быть минным полем, но я почти уверен, что с методологией все в порядке.
Медленнее, сканирование назад:
public boolean wordBreak(String s, List wordDict) {
boolean[] dp = new boolean[s.length() + 1];
dp[s.length()] = true; // Base case

for (int i = s.length() - 1; i >= 0; i--) {
for (String word : wordDict) {
if (i + word.length() > s.length()) continue;
if (dp[i + word.length()] && s.substring(i, i + word.length()).equals(word)) {
dp = true;
break;
}
}
}
return dp[0];
}

Быстрее, сканирование вперед:
public boolean wordBreak(String s, List wordDict) {
boolean[] dp = new boolean[s.length()];
for (int substringEnd = 0; substringEnd < s.length(); substringEnd++) {
for (String word : wordDict) {
if (substringEnd < word.length() - 1) {
continue;
}
// substringEnd at initial boundary or true for prior substring
if (substringEnd == word.length() - 1 || dp[substringEnd - word.length()]) {
if (s.substring(substringEnd - word.length() + 1, substringEnd + 1).equals(word)) {
dp[substringEnd] = true;
break;
}
}
}
}
return dp[s.length() - 1];
}


Подробнее здесь: https://stackoverflow.com/questions/792 ... roblem-hav
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»