Если вы думаете о том, что вы делаете, вы можете себе представить, что вы выполняете поиск в ширину по графику с n + 1 узлами (все натуральные числа от 0 до n включительно) и некоторым числомребра м, которые мы определим позже.Ваш график в основном представлен в виде списка смежности, так как в каждой точке вы перебираете все исходящие ребра (квадраты меньше или равны вашему числу) и останавливаетесь, как только вы считаете слишком большой квадрат.В результате время выполнения будет O (n + m), и все, что нам теперь нужно сделать, это выяснить, что такое m.
(здесь есть еще одна стоимость в вычислении всех квадратных корней до и включаяn, но это занимает время O (n 1/2 ), в котором преобладает член O (n).)
Если подумать, то количество исходящих ребер изкаждое число k будет определяться числом совершенных квадратов, меньшим или равным k.Это значение равно ⌊√k⌋ (проверьте это на нескольких примерах - это работает!).Это означает, что общее число ребер ограничено сверху как
√0 + √1 + √2 + ... + √n
Мы можем показать, чтоэта сумма равна Θ (n 3/2 ).Во-первых, мы ограничим эту сумму сверху в O (n 3/2 ), что мы можем сделать, отметив, что
√0 + √1 + √2 +... + √n
≤ √n + √n + √ n + ... + √n (n + 1) раз
= (n +1) √n
= O (n 3/2 ).
Чтобы ограничить это в Ω (n 3/2 ), обратите внимание, что
√0 + √1 + √2 + ... + √n
≥ √ (n / 2) + √ (n / 2 +1) + ... + √ (n) * (исключить первую половину терминов)
≥ √ (n / 2) + √ (n / 2) + ... + √ (n /2)
= (n / 2) √ (n / 2)
= Ω (n 3/2 ).
Таким образом, в целом, число ребер равно Θ (n 3/2 ), поэтому, используя регулярный анализ поиска в ширину, мы можем увидеть, что время выполнения будет O (n 3/2 ).
Эта граница, вероятно, не жесткая, потому что это предполагает, что вы посещаете каждый отдельный узел и каждое ребро, чего не произойдет.Тем не менее, я не уверен, как ужесточить ситуацию намного дальше этого.
Как примечание - это было бы отличное место для использования поиска A * вместо поиска в ширину, так какВы можете довольно легко придумать эвристику, чтобы недооценить оставшееся общее расстояние (скажем, взять число и разделить его на наибольший идеальный квадрат меньше его).Это заставило бы поиск сосредоточиться на чрезвычайно многообещающих путях, которые быстро переходят к 0, а не на менее удачные пути, как, например, всегда предпринимаются шаги первого размера.
Надеюсь, это поможет!