[забыл математику] Оптимизация алгоритма
От: Real 3L0 Россия http://prikhodko.blogspot.com
Дата: 13.09.22 16:32
Оценка:
Приветствую.
Есть работающий код:
public static List<decimal> PricesForBuy(decimal marketBuyPrice, decimal marketSellPrice, decimal officialMinStep, decimal? overwriteMinStep)
{
    var ret = new List<decimal>();
    if (overwriteMinStep == null)
    {
        var mediumPrice = marketBuyPrice;

        do
        {
            ret.Add(mediumPrice);
            mediumPrice += officialMinStep;
        } while (mediumPrice <= marketSellPrice);
    }
    else
    {
        decimal mediumPrice2 = 0;

        do
        {
            mediumPrice2 += overwriteMinStep.Value;
        } while (mediumPrice2 < marketBuyPrice);

        while (mediumPrice2 <= marketSellPrice)
        {
            ret.Add(mediumPrice2);
            mediumPrice2 += overwriteMinStep.Value;
        }
    }

    return ret;
}


Нужно ускорить место:
        decimal mediumPrice2 = 0;

        do
        {
            mediumPrice2 += overwriteMinStep.Value;
        } while (mediumPrice2 < marketBuyPrice);

чтобы не с нуля перебором занимался.
Вселенная бесконечна как вширь, так и вглубь.
Re: [забыл математику] Оптимизация алгоритма
От: Sharov Россия  
Дата: 13.09.22 16:45
Оценка:
Здравствуйте, Real 3L0, Вы писали:

R3>Нужно ускорить место:

R3>
R3>        decimal mediumPrice2 = 0;

R3>        do
R3>        {
R3>            mediumPrice2 += overwriteMinStep.Value;
R3>        } while (mediumPrice2 < marketBuyPrice);
R3>

R3>чтобы не с нуля перебором занимался.

Ну начните с mediumPrice2 = overwriteMinStep.Value;
Кодом людям нужно помогать!
Re: [забыл математику] Оптимизация алгоритма
От: DiPaolo Россия  
Дата: 13.09.22 16:45
Оценка:
R3>Нужно ускорить место:
...
R3>чтобы не с нуля перебором занимался.

R3>
R3>        decimal mediumPrice2 = overwriteMinStep.Value * (marketBuyPrice / overwriteMinStep.Value - 1);

R3>        do
R3>        {
R3>            mediumPrice2 += overwriteMinStep.Value;
R3>        } while (mediumPrice2 < marketBuyPrice);
R3>


Может так? (может там надо где-то приведение типов поставить)
Патриот здравого смысла
Re[2]: [забыл математику] Оптимизация алгоритма
От: Real 3L0 Россия http://prikhodko.blogspot.com
Дата: 13.09.22 16:52
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Ну начните с mediumPrice2 = overwriteMinStep.Value;


Нельзя. Значения должны всегда одни те же возвращать.

Например, если:
marketBuyPrice = 10
marketSellPrice = 20
officialMinStep = 1
overwriteMinStep = 2
То вернутся значения:
10, 12, 14, 16 и т.д.

Если значения
marketBuyPrice = 11
marketSellPrice = 20
officialMinStep = 1
overwriteMinStep = 2
То должны вернуться значения:
12, 14, 16 и т.д.

Т.е. 12, 14, 16 и т.п — должны быть теми же.
Вселенная бесконечна как вширь, так и вглубь.
Re: [забыл математику] Оптимизация алгоритма
От: karbofos42 Россия  
Дата: 13.09.22 16:55
Оценка:
Здравствуйте, Real 3L0, Вы писали:

R3>чтобы не с нуля перебором занимался.


Как-то так вроде, но это не точно:
var n = marketBuyPrice / overwriteMinStep.Value;
var m = decimal.Ceiling(n);
mediumPrice2 = (n == m)
  ? marketBuyPrice
  : m * overwriteMinStep.Value


ну, либо просто:
mediumPrice2 = decimal.Ceiling(marketBuyPrice / overwriteMinStep.Value) * overwriteMinStep.Value

так наверно даже быстрее посчитает, без ветвлений, но суть та же
Отредактировано 13.09.2022 17:19 karbofos42 . Предыдущая версия .
Re: [забыл математику] Оптимизация алгоритма
От: JohnnyJ Германия  
Дата: 13.09.22 17:38
Оценка: 2 (1) +1
Здравствуйте, Real 3L0, Вы писали:

R3>Нужно ускорить место:

R3>
R3>        decimal mediumPrice2 = 0;

R3>        do
R3>        {
R3>            mediumPrice2 += overwriteMinStep.Value;
R3>        } while (mediumPrice2 < marketBuyPrice);
R3>

R3>чтобы не с нуля перебором занимался.

Не совсем понятно, зачем тут вообще подобный перебор, все вроде вычисляется аналитически:

static List<decimal> PricesForBuyOptimized(decimal marketBuyPrice,
                                           decimal marketSellPrice,
                                           decimal officialMinStep,
                                           decimal? overwriteMinStep)
{
    var (start, step) = overwriteMinStep switch
        {
            null => (marketBuyPrice, officialMinStep),
            { } st => (Math.Ceiling(marketBuyPrice / st) * st, st)
        };

    var stepCount = 1 + (int)Math.Floor((marketSellPrice - start) / step);
    
    var ret = Enumerable.Range(0, stepCount).
                         Select(stepNumber => start + step * stepNumber).
                         ToList();

    return ret;
}


Вам стоило бы перевести код в алгоритм на естественном языке и это облегчило бы математику
Зри в корень!
Re[3]: [забыл математику] Оптимизация алгоритма
От: Teolog  
Дата: 13.09.22 18:17
Оценка:

Цикл не нужен, просто надо включить мозг и вспомнить что округлять можно не только до целого, а остаток можно сохранять
Re: [забыл математику] Оптимизация алгоритма
От: xma  
Дата: 13.09.22 18:29
Оценка:
Здравствуйте, Real 3L0, Вы писали:

R3>Нужно ускорить место:

R3>
R3>        decimal mediumPrice2 = 0;

R3>        do
R3>        {
R3>            mediumPrice2 += overwriteMinStep.Value;
R3>        } while (mediumPrice2 < marketBuyPrice);
R3>

R3>чтобы не с нуля перебором занимался.

редкостное говнокодище конечно ..

учись у "бога программирования",

  небольшой факапчик в "устном счёте"
decimal mediumPrice2 = overwriteMinStep.Value; 
var size = marketBuyPrice - mediumPrice2; 

if (size > 0 && overwriteMinStep.Value > 0)
     mediumPrice2 += overwriteMinStep.Value * decimal.Ceiling (size / overwriteMinStep.Value);


(вроде верно)


верный алгоритм тут, (на этот раз точно)
https://rsdn.org/forum/dotnet/8361668?tree=tree
Автор: xma
Дата: 15.09.22


в твоём же коде вообще, если overwriteMinStep.Value <= 0, то твой код уйдёт в бесконечный цикл (если в первый раз сработает условие while) ..
Отредактировано 15.09.2022 15:05 xma . Предыдущая версия . Еще …
Отредактировано 15.09.2022 14:36 xma . Предыдущая версия .
Отредактировано 15.09.2022 13:13 xma . Предыдущая версия .
Отредактировано 15.09.2022 11:52 xma . Предыдущая версия .
Отредактировано 15.09.2022 11:51 xma . Предыдущая версия .
Re: [забыл математику] Оптимизация алгоритма
От: Xander Zerge Россия www.zerge.com
Дата: 14.09.22 17:44
Оценка: 4 (1)
Здравствуйте, Real 3L0, Вы писали:

R3>public static List<decimal> PricesForBuy(decimal marketBuyPrice, decimal marketSellPrice, decimal officialMinStep, decimal? overwriteMinStep)

R3>чтобы не с нуля перебором занимался.

Я бы сделал как-то так:
https://dotnetfiddle.net/6sHILF

var imax = (int)(marketSellPrice / minStep);

var imin = (int)(marketBuyPrice / minStep);
if (minStep * imin < marketBuyPrice)
    ++imin;

return MakePriceRange_V3(imin, imax, minStep);


Математика на decimal медленная, при работе с ценами всегда стараюсь оперировать целыми числами шагов.
Поэтому дал три варианта заполнения списка, попробуй, какой будет быстрее.
Ну и шаг на входе один — официальный или произвольный, разницы практически никакой, чтобы городить лишний код.
Серёжа Новиков,
программист
Отредактировано 14.09.2022 17:51 Xander Zerge . Предыдущая версия .
Re[2]: [забыл математику] Оптимизация алгоритма
От: Real 3L0 Россия http://prikhodko.blogspot.com
Дата: 15.09.22 10:48
Оценка:
Здравствуйте, DiPaolo, Вы писали:

DP>Может так? (может там надо где-то приведение типов поставить)


Не совпадает.
Вселенная бесконечна как вширь, так и вглубь.
Re[2]: [забыл математику] Оптимизация алгоритма
От: Real 3L0 Россия http://prikhodko.blogspot.com
Дата: 15.09.22 10:55
Оценка:
Здравствуйте, karbofos42, Вы писали:

K>
K>var n = marketBuyPrice / overwriteMinStep.Value;
K>var m = decimal.Ceiling(n);
K>mediumPrice2 = (n == m)
K>  ? marketBuyPrice
K>  : m * overwriteMinStep.Value
K>


Не всегда совпадает.

K>ну, либо просто:

K>
K>mediumPrice2 = decimal.Ceiling(marketBuyPrice / overwriteMinStep.Value) * overwriteMinStep.Value
K>

K>так наверно даже быстрее посчитает, без ветвлений, но суть та же
K>

Аналогично.
Но оба варианта — близко.
Вселенная бесконечна как вширь, так и вглубь.
Re[4]: [забыл математику] Оптимизация алгоритма
От: Real 3L0 Россия http://prikhodko.blogspot.com
Дата: 15.09.22 10:56
Оценка:
Здравствуйте, Teolog, Вы писали:

T>

T>Цикл не нужен, просто надо включить мозг и вспомнить что округлять можно не только до целого, а остаток можно сохранять

+1. Но чот не включается.
Вселенная бесконечна как вширь, так и вглубь.
Re[2]: [забыл математику] Оптимизация алгоритма
От: Real 3L0 Россия http://prikhodko.blogspot.com
Дата: 15.09.22 11:01
Оценка:
Здравствуйте, xma, Вы писали:

xma>редкостное говнокодище конечно ..


+1. Вначале тему по другому назвал, но меня тогда забанили бы.

xma>const decimal size = marketBuyPrice — mediumPrice2;


Ругается на const.

xma>(вроде верно)


Часто не совпадает.

xma>в твоём же коде вообще, если overwriteMinStep.Value <= 0, то твой код уйдёт в бесконечный цикл (если в первый раз сработает условие while) ..


Там не может быть отрицательное значение. Ну, теоретически.
Вселенная бесконечна как вширь, так и вглубь.
Отредактировано 15.09.2022 11:01 Real 3L0 . Предыдущая версия .
Re[3]: [забыл математику] Оптимизация алгоритма
От: xma  
Дата: 15.09.22 12:05
Оценка: +2
Здравствуйте, Real 3L0, Вы писали:

xma>>const decimal size = marketBuyPrice — mediumPrice2;

R3>Ругается на const.

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

xma>>(вроде верно)

R3>Часто не совпадает.

ну главное то — идея

залей на dotnetfiddle.net — твой оригинал, и мой код .. посмотрим где не совпадает, и тогда понятно станет — как исправить .. (да, будь я сварщиком — меня бы давно уже убило) ..

xma>>в твоём же коде вообще, если overwriteMinStep.Value <= 0, то твой код уйдёт в бесконечный цикл (если в первый раз сработает условие while) ..

R3>Там не может быть отрицательное значение. Ну, теоретически.

где написано, на заборе ? ну и золотое правило — если не хочешь проблем, то обрабатывай все случаи (напр., на время отладки — можно бросать exception'ы, в случае неправильных данных .. ну или если уверен в поставляемых в метод данных, то заглушка — как у меня, всё равно не помешает)

R3>Там не может быть отрицательное значение. Ну, теоретически.

там подходит только (строго) overwriteMinStep > 0, если даже ноль — то твой оригинальный код при marketBuyPrice > 0, уйдёт в бесконечный цикл ..
Отредактировано 15.09.2022 14:30 xma . Предыдущая версия . Еще …
Отредактировано 15.09.2022 13:10 xma . Предыдущая версия .
Отредактировано 15.09.2022 13:09 xma . Предыдущая версия .
Отредактировано 15.09.2022 13:06 xma . Предыдущая версия .
Отредактировано 15.09.2022 12:51 xma . Предыдущая версия .
Отредактировано 15.09.2022 12:50 xma . Предыдущая версия .
Отредактировано 15.09.2022 12:48 xma . Предыдущая версия .
Отредактировано 15.09.2022 12:46 xma . Предыдущая версия .
Отредактировано 15.09.2022 12:06 xma . Предыдущая версия .
Re[3]: [забыл математику] Оптимизация алгоритма
От: xma  
Дата: 15.09.22 14:59
Оценка: 4 (1)
Здравствуйте, Real 3L0, Вы писали:

R3>Часто не совпадает.


во, сделал — наслаждайся

  Скрытый текст
проверяй тут,
https://dotnetfiddle.net/

using System;
                    
public class Program
{
    public static void Main()
    {
        Console.WriteLine("Hello World");
        
        decimal marketBuyPrice = 90m, overwriteMinStep = 0.2m;
        
        var ret = test_original(marketBuyPrice, overwriteMinStep);
        Console.WriteLine("ret = " + ret);
        
        var ret_opt = test_optimal(marketBuyPrice, overwriteMinStep);
        Console.WriteLine("ret_opt = " + ret_opt);
        
        var ret_opt2 = test_optimal2(marketBuyPrice, overwriteMinStep);
        Console.WriteLine("ret_opt2 = " + ret_opt2);
    }
    
    public static decimal test_original(decimal marketBuyPrice, decimal overwriteMinStep)
    {        
        decimal mediumPrice2 = 0;

        do
        {
            mediumPrice2 += overwriteMinStep;
        } while (mediumPrice2 < marketBuyPrice);
        
        return mediumPrice2;
    }
    
    public static decimal test_optimal(decimal marketBuyPrice, decimal overwriteMinStep)
    {
        if (decimal.Zero == marketBuyPrice) // == 0
            return overwriteMinStep;
        
        decimal temp_remainder = marketBuyPrice % overwriteMinStep;
        
        if (decimal.Zero == temp_remainder) // == 0
            return marketBuyPrice;
        
        decimal mediumPrice2 = (decimal.Floor(marketBuyPrice / overwriteMinStep) + 1) * overwriteMinStep;
        return mediumPrice2;
    }
    
    public static decimal test_optimal2(decimal marketBuyPrice, decimal overwriteMinStep)
    {        
        if (decimal.Zero == marketBuyPrice) // == 0
            return overwriteMinStep;

        decimal mediumPrice2 = (decimal.Floor(marketBuyPrice / overwriteMinStep) + 1) * overwriteMinStep;
        
        if ( mediumPrice2 == marketBuyPrice + overwriteMinStep )
            mediumPrice2 -= overwriteMinStep;
            
        return mediumPrice2;
    }
}


R3>Там не может быть отрицательное значение. Ну, теоретически.


проверял для overwriteMinStep > 0 и marketBuyPrice >= 0
Отредактировано 15.09.2022 15:02 xma . Предыдущая версия .
Re[2]: [забыл математику] Оптимизация алгоритма
От: Real 3L0 Россия http://prikhodko.blogspot.com
Дата: 16.09.22 15:43
Оценка:
Здравствуйте, Xander Zerge, Вы писали:

XZ>Математика на decimal медленная, при работе с ценами всегда стараюсь оперировать целыми числами шагов.


Нее, только decimal. Там после запятой много цифр может быть.
Вселенная бесконечна как вширь, так и вглубь.
Re[4]: [забыл математику] Оптимизация алгоритма
От: Real 3L0 Россия http://prikhodko.blogspot.com
Дата: 16.09.22 16:41
Оценка:
Здравствуйте, xma, Вы писали:

xma>тебе шашечки или ехать ? просил накатать общую идею исправленного алгоритма — я тебе дал,


Согласен. Просто возможности нет глубоко погрузиться в течение дня, поэтому быстро проверил и отписался. Тут уже много идей накидали.

xma> если ругается на const — значит убери его .. (я же не профи в синтаксисе всех возможных языках программирования)


Убрал, конечно.

xma>залей на dotnetfiddle.net — твой оригинал, и мой код .. посмотрим где не совпадает, и тогда понятно станет — как исправить .. (да, будь я сварщиком — меня бы давно уже убило) ..


Я так понял, уже не надо? В следующих версиях всё работает?

xma>где написано, на заборе ? ну и золотое правило — если не хочешь проблем, то обрабатывай все случаи (напр., на время отладки — можно бросать exception'ы, в случае неправильных данных .. ну или если уверен в поставляемых в метод данных, то заглушка — как у меня, всё равно не помешает)

xma>там подходит только (строго) overwriteMinStep > 0, если даже ноль — то твой оригинальный код при marketBuyPrice > 0, уйдёт в бесконечный цикл ..

Да, > 0. Но с тобой согласен.
Вселенная бесконечна как вширь, так и вглубь.
Re[5]: [забыл математику] Оптимизация алгоритма
От: xma  
Дата: 16.09.22 16:48
Оценка:
Здравствуйте, Real 3L0, Вы писали:

R3>Я так понял, уже не надо? В следующих версиях всё работает?


проверял ? (code
Автор: xma
Дата: 15.09.22
)

(там аж две версии на выбор),

P.S.:

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

а после запуска — всё становится очевидным .. (но вообще конечно, в идеале — надо вваливать рандомом по ограниченным диапазонам), с потенциальным выводом (в консоль) только там где если "есть несовпадения" ..
Отредактировано 16.09.2022 16:59 xma . Предыдущая версия .
Re[2]: [забыл математику] Оптимизация алгоритма
От: Real 3L0 Россия http://prikhodko.blogspot.com
Дата: 16.09.22 17:02
Оценка:
Здравствуйте, Xander Zerge, Вы писали:

XZ>Поэтому дал три варианта заполнения списка, попробуй, какой будет быстрее.


Проверил первый — работает.

XZ>Ну и шаг на входе один — официальный или произвольный, разницы практически никакой, чтобы городить лишний код.


+1
Вселенная бесконечна как вширь, так и вглубь.
Re[4]: [забыл математику] Оптимизация алгоритма
От: Real 3L0 Россия http://prikhodko.blogspot.com
Дата: 16.09.22 17:24
Оценка:
Здравствуйте, xma, Вы писали:

xma> public static decimal test_optimal(decimal marketBuyPrice, decimal overwriteMinStep)


Не всегда совпадает.

xma> public static decimal test_optimal2(decimal marketBuyPrice, decimal overwriteMinStep)


Тоже не всегда совпадает.

Забей. Вон рабочий вариант: http://rsdn.org/forum/dotnet/8360983.1
Автор: Xander Zerge
Дата: 14.09.22
Вселенная бесконечна как вширь, так и вглубь.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.