Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.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 是否存在数组搜索比连续数组翻转和直接查找更快的情况?_Php - Fatal编程技术网

Php 是否存在数组搜索比连续数组翻转和直接查找更快的情况?

Php 是否存在数组搜索比连续数组翻转和直接查找更快的情况?,php,Php,假设您要搜索一个由N个元素组成的数组,并对数组值执行Y搜索以找到相应的键;您可以执行Yarray\u search,也可以执行一次array\u flip和Y直接查找。为什么第一种方法比第二种方法慢很多?是否存在第一种方法比第二种方法更快的情况? 您可以假设键和值是唯一的数组键是散列的,因此查找它们只需要调用散列函数并将其索引到散列表中。所以array\u flip()是O(N),查找数组键是O(1),所以Y搜索是O(Y)+O(N) 数组值不是散列的,因此搜索它们需要线性搜索。这是O(N),所以

假设您要搜索一个由N个元素组成的数组,并对数组值执行Y搜索以找到相应的键;您可以执行Y
array\u search
,也可以执行一次
array\u flip
和Y直接查找。为什么第一种方法比第二种方法慢很多?是否存在第一种方法比第二种方法更快的情况?
您可以假设键和值是唯一的

数组键是散列的,因此查找它们只需要调用散列函数并将其索引到散列表中。所以
array\u flip()
是O(N),查找数组键是O(1),所以
Y
搜索是O(Y)+O(N)

数组值不是散列的,因此搜索它们需要线性搜索。这是O(N),所以Y搜索是O(N*Y)

假设要搜索的值在数组中均匀分布,则线性搜索的平均情况必须比较N/2个元素。因此
array\u flip()
大约需要2次
array\u search()
调用,因为它必须检查N个元素


创建哈希表时会有一些额外的开销。但是,PHP使用写时复制,因此它不必在
array\u flip()
期间复制键或值,所以还不错。对于少量查找,第一种方法可能更快。您必须对其进行基准测试,以找到收支平衡点。

这是一个有趣的问题。您是否有任何性能测试证明这一点?此外,你在做这项检查时是否使用了严格选项?@Daryl Gill你为什么编辑我的问题?我实际上是指N次查找和N次搜索,现在如果我将其编辑回原始状态,所有讨论都将无效。我只想说一句:
您可以假设键和值是唯一的
:这非常重要:如果值不是唯一的,在执行
数组\u翻转时
您将丢失一些项目,因为不同的值将在同一个键中结束,因此后一个值将覆盖前一个值。顺便说一句,我认为这是一个非常有趣的问题,不知道为什么有人要关闭它。@Asad Yes。如果你做一个简单的测试,它会显示,速度差距是hugeI。我从来没有完全理解为什么查找数组键是常数时间,但查找数组值是线性的(假设两者都可以散列)?@Asad,因为值不是散列的。您还需要另一个将值映射到值位置的哈希结构。更新了我的答案来解释这一点。@Corbin我想这是有道理的。我想知道是否有任何方法可以拥有并行哈希函数,这样每对中的两个项都可以被视为键或值。谢谢Barmar。您可以编写一个类,其中包含两个在每个方向上映射的关联数组。