Как я нахожу ближайшее простое число?

Ключ, который заставил мое использование ORM действительно полететь, был генерацией кода. Я соглашаюсь, что маршрут ORM не является самым быстрым в терминах производительности кода. Но когда у Вас есть средняя и крупная команда, DB изменяет быстро способность повторно создать классы и отображения от DB, поскольку часть процесса сборки является чем-то блестящим для созерцания, особенно при использовании CI. Таким образом, Ваш код не может быть самым быстрым, но Ваше кодирование будет - я знаю, который я взял бы в большинстве проектов.

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

Другая мысль, кэширование, созданное в, в спящем режиме, может часто делать крупные повышения производительности, если используется правильным способом. Больше никакого возвращения к DB к данным считанной ссылки.

14
задан Marty 15 October 2009 в 21:12
поделиться

9 ответов

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

Я думаю, что 100-е простое число - это примерно 541. Все, что нужно, - это массив из 270 [маленьких] целых чисел.

Этот подход особенно эффективен, учитывая относительную величину высокая плотность простых чисел (в частности, относительно нечетных чисел) в диапазоне менее 1000. (Поскольку это влияет на размер двоичного дерева)

18
ответ дан 1 December 2019 в 06:24
поделиться

Таблица поиска размером 100 байт; (беззнаковые символы) Округлить действительное число и использовать справочную таблицу.

0
ответ дан 1 December 2019 в 06:24
поделиться

Если решение с массивом не подходит для вас (оно лучше всего подходит для вашего сценария), вы можете попробовать приведенный ниже код. После случая «2 или 3» он будет проверять каждое нечетное число от начального значения до тех пор, пока не найдет простое число.


static int NearestPrime(double original)
{
    int above = (int)Math.Ceiling(original);
    int below = (int)Math.Floor(original);

    if (above <= 2)
    {
        return 2;
    }

    if (below == 2)
    {
        return (original - 2 < 0.5) ? 2 : 3;
    }

    if (below % 2 == 0) below -= 1;
    if (above % 2 == 0) above += 1;

    double diffBelow = double.MaxValue, diffAbove = double.MaxValue;

    for (; ; above += 2, below -= 2)
    {
        if (IsPrime(below))
        {
            diffBelow = original - below;
        }

        if (IsPrime(above))
        {
            diffAbove = above - original;
        }

        if (diffAbove != double.MaxValue || diffBelow != double.MaxValue)
        {
            break;
        }
    }

    //edit to your liking for midpoint cases (4.0, 6.0, 9.0, etc)
    return (int) (diffAbove < diffBelow ? above : below);
}

static bool IsPrime(int p)  //intentionally incomplete due to checks in NearestPrime
{
    for (int i = 3; i < Math.Sqrt(p); i += 2)
    {
        if (p % i == 0)
            return false;
    }

    return true;
}
0
ответ дан 1 December 2019 в 06:24
поделиться

Answers so far are rather complicated, given the task in hand. The first hundred primes are all less then 600. I would create an array of size 600 and place in each the value of the nearest prime to that number. Then, given a number to test, I would round it both up and down using the floor and ceil functions to get one or two candidate answers. A simple comparison with the distances to these numbers will give you a very fast answer.

8
ответ дан 1 December 2019 в 06:24
поделиться

If you want to write an algorithm, A Wikipedia search for prime number led me to another article on the Sieve of Eratosthenes. The algorithm looks a bit simple and I'm thinking a recursive function would suit it well imo. (I could be wrong about that.)

0
ответ дан 1 December 2019 в 06:24
поделиться

Вы должны отсортировать свой номер в массиве, тогда вы можете использовать двоичный поиск . Этот алгоритм имеет производительность O (log n) в худшем случае.

2
ответ дан 1 December 2019 в 06:24
поделиться

Самый быстрый алгоритм? Создайте таблицу поиска с элементами p [100] = 541 и верните результат для floor (x) со специальной логикой для x на [2,3]. Это будет O (1).

3
ответ дан 1 December 2019 в 06:24
поделиться

Простейшим подходом было бы сохранение простых чисел в отсортированном списке и изменение вашего алгоритма для выполнения двоичного поиска.

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

3
ответ дан 1 December 2019 в 06:24
поделиться

If you only need to search in the first 100 primes or so, just create a sorted table of those primes, and do a binary search. This will either get you to one prime number, or a spot between two, and you check which of those is closer.

Edit: Given the distribution of primes in that range, you could probably speed things up (a tiny bit) by using an interpolation search -- instead of always starting at the middle of the table, use linear interpolation to guess at a more accurate starting point. The 100th prime number should be somewhere around 250 or so (at a guess -- I haven't checked), so if (for example) you wanted the one closest to 50, you'd start about 1/5th of the way into the array instead of halfway. You can pretty much treat the primes as starting at 1, so just divide the number you want by the largest in your range to get a guess at the starting point.

11
ответ дан 1 December 2019 в 06:24
поделиться
Другие вопросы по тегам:

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