Это два решения проблемы с лит-кодом под названием «Разрыв слова». По сути, код определяет, может ли данная строка состоять из одного или нескольких слов в словаре.
Эти два решения используют восходящий 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
Попытка понять, почему два похожих решения DP для общей проблемы со строками имеют разные результаты производительности. ⇐ JAVA
Программисты JAVA общаются здесь
1733517978
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[i] = 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];
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79259345/trying-to-understand-why-two-similar-dp-solutions-to-a-common-string-problem-hav[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия