Как упростить алгоритм заполнения одномерного массива?

Здравствуйте, помогите, пожалуйста, попроще решить одну задачку, может, я что-то пропустил.

Имеется пустой одномерный массив.

Необходимо при заполнении ячейки массива (a) убедиться, что из ближайших к нему n ячеек заполнено не более m.

Банальнее всего пройтись циклом:
$result = true;
for($i=$a-$n;$i<=$a+n;$i++)
{
 $c = 0;
 for($j=$i;$j<=$i+n;$j++)
 {
  if($arr[$j]==true)
  {
   $c++;
  }
 }
 if($c>$m)
 {
  $result = false;
  return $result;
 }
}


Есть идеи, как упростить алгоритм?
Может, вообще php заранее решил проблему, и есть готовая функция?
  • Вопрос задан
  • 2674 просмотра
Пригласить эксперта
Ответы на вопрос 3
@Vampiro
Вы правы, эту задачу действительно уже давно упростили:
хранят расписание в базе данных, а количество занятий узнают запросом вида
select count(id) as 'ok' from tableName where `owner`=:ownerId and (`date` between :lowDate and :hiDate)
Ответ написан
demolishka
@demolishka
Заведите второй массив, в котором, при записи на k-ый день, прибавляйте единичку на отрезке [k-n;k+n]. Теперь ваша задача свелась к проверке того, что значение в k-ой ячейке второго массива не больше m-1. Осталось научиться быстро прибавлять на отрезке и запрашивать значение k-го элемента.
Один из вариантов - дерево отрезков. Умеет выполнять операции прибавления на отрезке и запроса суммы на отрезке за O(log(n)).

И да, для вашей исходной, а не обобщенной, задачи реализация моего решения не прибавит скорости.
Ответ написан
@Snewer
Ваш код достаточно производителен
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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