Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> алгоритм/оптимизация
Por$h  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Абориген
*****

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 203
Пользователь №: 23341
На форуме: 6 лет, 4 месяца, 2 дня
Карма:




Привет.
Есть простой рабочий код,
который проходится циклом определенное кол-во итераций. Проблема когда число итераций ооочень большое (например 1 000 000 000) и когда это занимает больше некоторого времени(минуту например) то всё падает. настройка тайм-аутов и др не нужно, нужно какой-то алгоритм для более быстрого подсчета что ли.


public $interest = null;

public function __construct($sum, $days)
{
$this->sum = $sum;
$this->days = $days;
}


public function calculateInterest()
{
$totalInterest = 0;
for ($i = 1; $i <= $this->days; $i++) {
if ($i % 3 == 0 && $i % 5 == 0) {
$dailyPercent = 0.03;
} elseif ($i % 3 == 0) {
$dailyPercent = 0.01;
} elseif ($i % 5 == 0) {
$dailyPercent = 0.02;
} else {
$dailyPercent = 0.04;
}
$dailyInterest = round($this->sum * $dailyPercent, 2);
$totalInterest += $dailyInterest;
}
$this->interest = $totalInterest;
}
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
redreem  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 4258
Пользователь №: 29002
На форуме: 5 лет, 4 месяца, 5 дней
Карма: 147




выполни вот этот код, возможно наведет на мысли:

код
class test {
public $interest = null;

public function __construct($sum, $days)
{
$this->sum = $sum;
$this->days = $days;
}


public function calculateInterest()
{
$totalInterest = 0;
for ($i = 1; $i <= $this->days; $i++) {
if ($i % 3 == 0 && $i % 5 == 0) {
$dailyPercent = 0.03;
} elseif ($i % 3 == 0) {
$dailyPercent = 0.01;
} elseif ($i % 5 == 0) {
$dailyPercent = 0.02;
} else {
$dailyPercent = 0.04;
}
$dailyInterest = round($this->sum * $dailyPercent, 2);
$cols=array(
1 => '#faa',
2 => '#afa',
3 => '#aaf',
4 => '#aff',
5 => '#faf',
6 => '#ffa',
7 => '#00f',
8 => '#0f0',
9 => '#f00'
);
$br = (($dailyInterest == 3) ? '<br>' : '');
echo '<span style="background:' .$cols[$dailyInterest] . '">' . $dailyInterest . '</span>' . $br;
$totalInterest += $dailyInterest;
}
$this->interest = $totalInterest;
}
}


$t = new test(100,1000);
$t->calculateInterest();


в зависимости от входной суммы получаются повторяющиеся блоки. можно например формировать такой блок, а строку $dailyInterest = round($this->sum * $dailyPercent, 2); переделать в формулу, принимающую такой блок и вычисляющую сразу результат для блока. тогда цикл уменьшится раз в 10-20. можно будет сделать шаг = длине блока.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Guest  
[x] Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









Количество числ из диапазона 1..N делящихся нацело на какое-то число можно вычислить по формуле. Можете в этом убедиться:
function getNumbersCountByFormula($n, $div) {
return floor(($n - 1 + $div) / $div) - 1;
}

function getNumbersCountByLoop($max, $div) {
$c = 0;
for ($i=1; $i<=$max; $i++) {
if ($i % $div == 0) $c++;
}
return $c;
}

// test
for ($i=0; $i<10; $i++) {
$n = 1000 + mt_rand(0, 1000000);
$div = mt_rand(1, 100);
echo getNumbersCountByFormula($n, $div) . ' / ' . getNumbersCountByLoop($n, $div) . PHP_EOL;
}


Дальше думаю должно быть понятно как посчитать.
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса