Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 数组\u唯一与数组\u翻转_Php_Big O_Array Unique_Array Flip - Fatal编程技术网

Php 数组\u唯一与数组\u翻转

Php 数组\u唯一与数组\u翻转,php,big-o,array-unique,array-flip,Php,Big O,Array Unique,Array Flip,如果我有一个有符号整数数组,例如: Array ( [0] => -3 [1] => 1 [2] => 2 [3] => 3 [4] => 3 ) 为了获得唯一的值,我会本能地使用array\u unique,但经过考虑后,我可以执行array\u flip两次,这会产生相同的效果,而且我认为会更快 数组\u唯一O(n log n),因为它使用排序操作 数组翻转O(n) 我的假设正确吗 更新/示例: $intArray1 =

如果我有一个有符号整数数组,例如:

Array
(
    [0] => -3
    [1] => 1
    [2] => 2
    [3] => 3
    [4] => 3
)
为了获得唯一的值,我会本能地使用
array\u unique
,但经过考虑后,我可以执行
array\u flip
两次,这会产生相同的效果,而且我认为会更快

数组\u唯一
O(n log n),因为它使用排序操作

数组翻转
O(n)

我的假设正确吗

更新/示例:

$intArray1 = array(-4,1,2,3);
print_r($intArray1);
$intArray1 = array_flip($intArray1);
print_r($intArray1);
$intArray1 = array_flip($intArray1);
print_r($intArray1);

Array
(
    [0] => -3
    [1] => 1
    [2] => 2
    [3] => 3
    [4] => 3
)
Array
(
    [-3] => 0
    [1] => 1
    [2] => 2
    [3] => 4
)
Array
(
    [0] => -3
    [1] => 1
    [2] => 2
    [4] => 3
)
你必须使用

array_keys( array_flip( $array ) );
这需要更多的时间


我会选择
array\u unique
。它还有解释发生了什么的额外好处。

没有什么比运行自己的基准更好的了

➜  8321620  cat first.php
<?php

$arr = array(-3, 1, 2, 3, 3);

for($i = 0; $i <= 1000000; $i++) {
    array_unique($arr);
}
➜  8321620  time php first.php
php first.php  3.24s user 0.01s system 99% cpu 3.251 total
➜  8321620  cat second.php
<?php

$arr = array(-3, 1, 2, 3, 3);

for($i = 0; $i <= 1000000; $i++) {
    array_flip(array_flip($arr));
}
➜  8321620  time php second.php
php second.php  1.50s user 0.01s system 99% cpu 1.514 total
➜  8321620 cat first.php

我为您设定了基准:

你的直觉是正确的

$test=array();
for($run=0; $run<1000; $run++)
$test[]=rand(0,100);

$time=microtime(true);

for($run=0; $run<100; $run++)
$out=array_unique($test);

$time=microtime(true)-$time;
echo 'Array Unique: '.$time."\n";

$time=microtime(true);

for($run=0; $run<100; $run++)
$out=array_keys(array_flip($test));

$time=microtime(true)-$time;
echo 'Keys Flip: '.$time."\n";

$time=microtime(true);

for($run=0; $run<100; $run++)
$out=array_flip(array_flip($test));

$time=microtime(true)-$time;
echo 'Flip Flip: '.$time."\n";

请注意,
array\u key(array\u flip($array))
将按顺序给出一个新的键值,在许多情况下,这可能是您想要的(除了比
array\u value(array\u unique($array))快得多之外,与
array\u flip(array\u flip($array))相同(除了比
array\u unique($array快得多之外)
其中键保持不变。

注意:此技术不是array_unique()的替代品。它仅适用于值为有效键的数组。(例如:string、integer、things可以转换为int)。而且对于对象数组肯定不起作用

$input = [true, false, 1, 0, 1.2, "1", "two", "0"];
var_export(array_unique($input));
array (
  0 => true,
  1 => false,
  3 => 0,
  4 => 1.2,
  6 => 'two',
)
vs:


array\u key
不也是
O(n)
?我的观点是你必须使用2个函数,而不是1个。这将花费更多的时间,也会混淆代码。我已经给出了一个我的数组翻转代码示例,数组翻转键不需要。好吧,现在您正在使用
array\u flip
twice@Galen,两次O(n)比一次O(n log n)快得多。还有
array\u键(array\u count\u value($array))
-请参见@Leith,
array\u键(array\u count\u value(
的速度永远不能超过
数组\u键(数组\u翻转)(
但结果总是一样的。@阿拉斯代尔,你为什么这么说?我在上一篇评论中链接的修改后的代码板基准表明了一个显著的改进。@Leith,是的,你是对的。你的基准确实说它更快。这很有趣。是数组吗或者更好的?这不是一个真正的答案,但节省了我一些时间,所以谢谢!
Array Unique: 1.1829199790955
Keys Flip: 0.0084578990936279
Flip Flip: 0.0083951950073242
$input = [true, false, 1, 0, 1.2, "1", "two", "0"];
var_export(array_unique($input));
array (
  0 => true,
  1 => false,
  3 => 0,
  4 => 1.2,
  6 => 'two',
)
var_export(array_keys(array_flip($input)));

PHP Warning:  array_flip(): Can only flip STRING and INTEGER values! 
in php shell code on line 1

array (
  0 => 1,
  1 => 0,
  2 => 'two',
)