【问题标题】:PHP Arrays - OptimizationPHP 数组 - 优化
【发布时间】:2023-03-08 11:28:01
【问题描述】:

对大小为 n 的数组的左旋转操作将数组的每个元素向左移动 1 个单位。例如,如果对数组 [1,2,3,4,5] 执行 2 次左旋转,则数组将变为 [3,4,1,2,3]。 我正在尝试找到解决以下问题的最有效方法。第一行包含两个以空格分隔的整数,分别表示 n(整数个数)和 d(必须执行的左旋转数)的值。 第二行包含 n 个以空格分隔的整数,描述数组初始状态的各个元素。

示例输入:

5 4
1 2 3 4 5

示例输出:

5 1 2 3 4

在大多数情况下,我的以下代码运行良好,但在执行时间方面,似乎还有一些改进空间 - 由于超时,它目前无法通过一个非常大的输入文件(见下文)的测试。

我的问题是,可以做些什么来减少下面这段代码的执行时间?

<?php

$file = file_get_contents ("php://stdin","r");
$file = explode("\n",$file);

$meta = explode(" ", $file[0]);
$rotations = $meta[1];

$nums = explode(" ", $file[1]);

while($rotations > 0) {
    $removed = array_shift($nums);
    $nums[] = $removed;
    --$rotations;
}

echo implode(" ", $nums);

?>

大型输入文件

Input File

【问题讨论】:

  • 您与哪个提议的解决方案进行比较?
  • 谁提出了哪个建议?您指的是您之前的任何问题吗?您问我们“为我优化此代码”是什么?
  • @CodeCaster,见已编辑。
  • 它目前未能通过一项测试 - 它是如何失败的?执行时间,内存耗尽?
  • @RomanPerekhrest,执行时间。它正在使用在线编译器进行测试。我不确定他们设置了什么内存/执行时间限制,但它显示“由于超时而终止”,对于使用原始帖子中的输入文件的测试用例

标签: php arrays algorithm


【解决方案1】:

用户数组切片

array array_slice ( array $array , int $offset [, int $length = NULL [, bool $preserve_keys = false ]] )

伪代码:

// you are given: $array_size, $rotation, $input_array;
$rotation = $rotation % array_size;
$slice_place = $array_size - rotation;

$answer = []
if(rotation>0) {
    $array1 = array_slice($input_array, $slice_place, $rotation)
    $array2 = array_slice($input_array, 0, $slice_place)
    $answer = array_merge($array1, $array2)
}
else {
    $answer = $input_array
}

【讨论】:

  • 这个不回答问题,请解释
  • 感谢您的编辑。您能否解释一下为什么您的代码可以工作以及为什么您提出的实现更有效?
  • @GeorgeCastan100 您的代码复杂度为 O(rotation),每个都包含诸如 array_shift 之类的操作,即 O(size_array)。总共O(rotation*size_array),我的是三个复杂度O(size_array)的操作,所以是O(size_array) =)
  • 谢谢,这很有帮助!
  • @GeorgeCastan100:要执行 r 旋转,他的代码仅使用 1x 时间旋转计算 O(n),但您的代码使用 r 旋转运行,这会导致复杂度 O(n * r)。
猜你喜欢
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 2022-08-11
  • 2011-09-14
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 2019-11-02
相关资源
最近更新 更多