Nano Hash - криптовалюты, майнинг, программирование

Сложность алгоритма разрыва слов

Мой вопрос похож на тот, который задавали о переполнении стека в прошлом http://www.geeksforgeeks.org/dynamic-programming-set-32-word-break-problem/

Решение, которое я написал, я не могу понять, поскольку я не использую DP, но все же как получается, что мой sol решает перекрывающиеся проблемы. Я думаю, что это не так. Может кто-нибудь прояснить? мой словарь, который я использую, это {"cat", "catdog", "dog", "mouse"} и тестовая строка как "catdogmouse". Вот метод, который я написал

public static boolean recursiveWordBreak2(String s, int start) {
    System.out.println("s is:"+s.substring(start));
    if (s.isEmpty() || start >= s.length()) {
        return true;
    }
    for (int i = start; i <= s.length(); i++) {
        String str = s.substring(start, i);
        System.out.println("substr:" + str);
        if (dictSet.contains(str)) {
            return recursiveWordBreak2(s, i);
        }
    }
    return false;
}


Ответы:


1

В вашем решении используется только рекурсия. признание того, что эта проблема связана с DP, позволяет вам ЗАПОМНИТЬ (запомнить) предыдущие результаты, чтобы вы могли повторно использовать их, не выполняя повторную рекурсию.

в предоставленной вами ссылке, если словарь {a,b,c,d,e} и ввод "abcde", вам нужно будет проверить, действительно ли "cde" дважды с рекурсивным кодом, где решение DP будет помнить "cde" действителен и должен проверяться только один раз.

редактировать: словарь {a,b,c,d,e} должен быть {a, ab, cde}, чтобы проиллюстрировать двойную проверку 'cde'

edit2 (см. комментарий к алгоритму, имеющему логическую проблему):

if (dictSet.contains(str)) {
return recursiveWordBreak2(s, i);  
} 

должно быть

if (dictSet.contains(str) && recursiveWordBreak2(s, i)) { return true }

таким образом, если contains = true, но recursiveWB = false, внешний цикл продолжит проверку length+1 вместо возврата false

17.10.2016
  • в моем коде, если происходит то, что вы предлагаете, почему я не вижу подстроку, напечатанную более одного раза. Подстрока cde должна быть напечатана более одного раза. У меня есть отчеты о печати. Так что либо мой алгоритм неверен? или мне не нужна мемоизация в этой и она уже оптимизирована? я не могу увидеть, где происходит повторение, поскольку я не вижу, чтобы какая-либо подстрока повторялась в выводе, когда я печатаю (см. операторы печати в коде) 17.10.2016
  • попробуйте словарь = {a, ab, cde}. я думаю, что ваш алгоритм никогда не пытается сопоставить «ab» 17.10.2016
  • так что теперь я понимаю, что вы подразумеваете, я не вижу перекрывающихся проблем в моем алгоритме, потому что я даже не рассматриваю все подзадачи, и, следовательно, для случая, который вы указали, я получаю вывод как ложный. Не жадничай, но не могли бы вы предложить небольшую настройку, которая может исправить алгоритм? Вы нашли хороший момент. 17.10.2016
  • псевдокод в вашей ссылке на самом деле имеет решение, я воспроизвел его здесь 18.10.2016
  • спасибо, а где ссылка, где вы это воспроизвели? не вижу в твоем посте ссылку, о которой ты говоришь 18.10.2016
  • о понял, что вы имели в виду. И я также понял, в чем проблема с моим кодом. Благодарность 18.10.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..