Категорический список шаблонов разработки существуют? [закрытый]

Функция isPrime() вызывается слишком много раз в primefactors. Например, i == 2 и в n имеется много дивизоров 2. Верхний вызов (isPrime(i)) в порядке. Однако внутри цикла while (n % i == 0) вы проверяете isPrime(n) после каждого деления n /= 2;. Итак, если начальный n равен 100, функция isPrime() вызывается для 50 и следующего цикла для 25. В этом нет смысла. Я думаю, что это самая большая проблема здесь, так как даже если isPrime работает в линейном режиме, слишком много можно называть его много раз во внутреннем цикле.

Можно выйти из цикла для i в двух случаях: n равно 1 после делений или n для уверенного простого, если i больше sqrt(n).

public String primefactors(int n) {
    String factors = "";
    int max_divisor = sqrt(n);
    for (int i = 2; i <= max_divisor; i++) {
        if (isPrime(i)) {
            while (n % i == 0) {
                n /= i;
                if (n == 1)
                    factors = factors + Integer.valueOf(i).toString();
                else
                    factors = factors + Integer.valueOf(i).toString() + "*";
            }
            max_divisor = sqrt(n);
        }
    }
    // check for the last prime divisor
    if (n != 1)
        factors = factors + Integer.valueOf(n).toString();

    return factors;
}

Даже после этого улучшения (и sqrt(n) как максимальный предел в isPrime()), ваш алгоритм будет иметь линейную сложность O(n), так как для i существует не более sqrt(n) петель, а максимальное число зондов для prime в isPrime равно также sqrt(n).


Да, это можно сделать лучше, выбрав лучшие алгоритмы для isPrime(). Даже если вам не разрешено использовать жестко заданную таблицу простых чисел, можно создать такую ​​таблицу поиска во время выполнения (если памяти достаточно). Таким образом, можно использовать автоматически сгенерированный список простых чисел, организованных в порядке возрастания, чтобы исследовать заданное число до sqrt(n). Если i становится больше, чем sqrt(n), это означает, что следующее простое число найдено, и оно должно быть добавлено к таблице поиска, а isPrime() должно возвращать true.

Пример

Предположим, что isPrime вызывается для 113. В этот момент таблица поиска имеет список предыдущих простых чисел: 2,3,5,7,11,13.... Итак, мы пытаемся разделить 113 на элементы из этого списка до sqrt(113) (while (i <= 10)). После попытки 2,3,5,7 следующий элемент в списке 11 слишком велик, поэтому 113 добавляется в список простых чисел, а функция возвращает true.


Другие алгоритмы может дать лучшую производительность в худшем случае. Например, сито Эратосфена или сито Аткина можно использовать для эффективного предкомпьютерного списка простых чисел до заданного n с наилучшей сложностью O(n) для наилучшей реализации. Здесь вам нужно найти все простые числа до sqrt(n), поэтому для создания такого списка требуется O(sqrt(n)). После создания такого списка вам нужно попытаться разделить ваш ввод по номерам, это список, который занимает не более sqrt(n) зондов. Таким образом, сложность алгоритма - O(sqrt(n)). Однако предположим, что ваш вход 1024 равен 2 мощности 10. В этом случае первый алгоритм будет лучше, так как он не перейдет к простым числам, большим 2.


Вам действительно нужна функция isPrime ()?

С гибким мышлением Если мы посмотрим поближе, кажется, вам не нужно искать все простые числа в некотором диапазоне. Вам нужно было найти все простые делители одного заданного целого числа. Однако, если мы попытаемся разделить n на все целые числа в диапазоне до sqrt(n), что также является хорошим решением. Даже если такое целое число не является простым, оно будет пропущено из-за условия n % i == 0, так как все простые числа, меньшие, чем тестируемое целое число, уже удалены из n, так что простое модульное деление здесь совпадает с isPrime(). Полное решение с O(sqrt(n)) сложностью:

public String primefactors(int n) {
    String factors = "";
    int max_divisor = sqrt(n);
    for (int i = 2; i <= max_divisor; i++) {
        while (n % i == 0) {
            n /= i;
            max_divisor = sqrt(n);
            if (n == 1)
                factors = factors + Integer.valueOf(i).toString();
            else
                factors = factors + Integer.valueOf(i).toString() + "*";
        }
    }
    // check for the last prime divisor
    if (n != 1)
        factors = factors + Integer.valueOf(n).toString();

    return factors;
}

Также возможно разделить функцию, чтобы избежать проверки if (n == 1) во внутреннем цикле, однако это не меняет сложность алгоритма.

42
задан minty 26 September 2008 в 08:52
поделиться

12 ответов

Я думаю, что существует основной "жизненный цикл шаблона разработки"

  1. записи Автора о шаблоне разработки в книге.
  2. Книга становится хорошо чтением, возможно бестселлер
  3. , Шаблон разработки вводит сознательную общественность, доля завоеванного внимания усилений.
  4. Шаблон разработки привыкает. Это работает хорошо. шаблон разработки получает больше доли завоеванного внимания
  5. , Шаблон разработки становится панацеей, злоупотребляется.
  6. Различный Шаблон разработки "записей Автора, Продуманный Вредный"
  7. , Шаблон разработки становится Анти-Шаблон
  8. , Различный Автор становится известным, книга записей, полная новых шаблонов разработки...
67
ответ дан Ryan 4 August 2019 в 19:04
поделиться

Большинство людей указало бы на "Банда Четыре" (Erich Gamma, Richard Helm, Ralph Johnson и John Vlissides), кто записал книгу Шаблоны разработки: Элементы Допускающего повторное использование Объектно-ориентированного программного обеспечения . Нет никакого реального категорического списка, поскольку полезные шаблоны разработки, конечно, обнаруживаются все время.

24
ответ дан pix0r 4 August 2019 в 19:04
поделиться

Википедия имеет хороший список. http://en.wikipedia.org/wiki/Design_pattern_ (computer_science)

Большинство согласием сообщества (что сообщество, являющееся людей, которые прочитали шаблоны разработки или кодируют завершенный:/)

12
ответ дан Darren Kopp 4 August 2019 в 19:04
поделиться

Короткий ответ: Нет.

ответ Long: С тех пор, если кто-то разрабатывает что-то, и это имеет тенденцию быть снова использованным другими, новый "шаблон разработки" будет просто создан (или обнаружен??)

На самом деле количество шаблонов разработки в существующих приложениях могло бы быть огромным, но ни один еще не классифицировал их.

я добавил бы предыдущие ссылки эти два:

http://martinfowler.com/eaaCatalog/

http://c2.com/ppr/

8
ответ дан OscarRyz 4 August 2019 в 19:04
поделиться

Может также быть полезно распознать антишаблоны .

4
ответ дан Kris Kumler 4 August 2019 в 19:04
поделиться

Нет никакого категорического списка. Шаблоны обнаружены, не изобретены, таким образом, нет никакой организации, которая может заявить, что "это - шаблон" и "это не шаблон". Даже если бы было один, это не было бы полезно ни для кого.

Несмотря на это, "известные" шаблоны - те описанные в Шаблонах разработки или книге GOF.

4
ответ дан Pablo Fernandez 4 August 2019 в 19:04
поделиться

Идея Шаблонов разработки была выдумана Christopher Alexander при записи об архитектурных шаблонах в рамках зданий и городов. Точно так же шаблоны появились, поскольку инженеры получили больше опыта с методологиями объектно-ориентированного проектирования.

нет одного официального консорциума, который определяет то, что является шаблоном и что не является шаблоном. Однако шаблоны обычно имеют долгий жизненный цикл, прежде чем они будут общепринятыми. Сообщество разработчиков начинает участвовать в вещах как БУЛЬКАНИЕ (Языки шаблона Программ) и их ежегодная конференция: Конференция 2008 года , которые фокусируются на авторах шаблона и энтузиастах для затрагивания темы шаблонов и новой разработки шаблона.

4
ответ дан SaaS Developer 4 August 2019 в 19:04
поделиться

Это - хороший список шаблонов (от Шаблоны Архитектуры приложений для предприятия книга):

http://martinfowler.com/eaaCatalog/

4
ответ дан Brannon 4 August 2019 в 19:04
поделиться

Существует каноническая книга: Гамма, Руль, Johnson, Vlissides: "Шаблоны Dessign - Элементы Reusable Object-Oriented Software", которая запустила все это. Это содержит 23 шаблона.

0
ответ дан danatel 4 August 2019 в 19:04
поделиться

Я сказал бы, что Объединение списка в Банде Четыре заказывает, и Шаблоны Fowler Предприятия Arhitecture дадут Вам 99% того, что необходимо было бы когда-либо знать.

1
ответ дан Charles Graham 4 August 2019 в 19:04
поделиться

Не может быть категорического списка. Когда-либо.

, Если Вы видите некоторые решения проблемы, которые - Вам - имеют шаблон, который может быть ясно сформулирован, Вы обнаружили шаблон разработки. Можно всегда продолжать делать это.

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

человеческий мозг может найти шаблоны в [почти 111] чем-либо . Это - вещь, мы обходимся без размышления об этом.

0
ответ дан S.Lott 4 August 2019 в 19:04
поделиться

Нет никакого категорического списка - для там, чтобы быть можно было бы, скорее всего, потребовать, чтобы некоторые полномочия объявили, является ли шаблон шаблоном или просто... что-то еще.

Некоторые шаблоны имеют смысл только в подмножестве языков - каноническое книжные концентраты GOF на Java (или он C++? Книга по моему столу в офисе), и некоторые описанные шаблоны не очень релевантны в, например, Ruby или VB6. И наоборот конечно.

3
ответ дан Mike Woodhouse 4 August 2019 в 19:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: