首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何检查SplFixedArray是否包含值?

如何检查SplFixedArray是否包含值?
EN

Stack Overflow用户
提问于 2020-05-16 19:59:15
回答 1查看 133关注 0票数 0

对于普通的数组,我们可以使用in_array(),但in_array不支持SplFixedArray,而且我也找不到任何与splFixedArray in_array()等效的函数,我可以像这样自己执行循环

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function spl_in_array(\SplFixedArray &$arr, $value): bool
{
    foreach ($arr as $val) {
        if ($val === $value) {
            return true;
        }
    }
    return false;
}

但这似乎比in_array()慢了大约14-17倍,而且由于SplFixedArray的重点是性能和内存使用(我认为?)...使用此基准测试代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
declare(strict_types = 1);

$check_iterations = 100;
$nbr_array_values = 100000;
$lookup_value = round($nbr_array_values / 2);

function format(float $f): string
{
    return number_format($f, 6);
}

function spl_in_array(\SplFixedArray &$arr, $value): bool
{
    foreach ($arr as $val) {
        if ($val === $value) {
            return true;
        }
    }
    return false;
}

$arr = [];
for ($i = 0; $i < $nbr_array_values; ++ $i) {
    $arr[] = $i;
}
$splArr = SplFixedArray::fromArray($arr);
$results = [];
$start = microtime(true);
for ($i = 0; $i < $check_iterations; ++ $i) {
    in_array($lookup_value, $arr, true);
}
$end = microtime(true);
$results["in_array"] = $end - $start;
$start = microtime(true);
for ($i = 0; $i < $check_iterations; ++ $i) {
    spl_in_array($splArr, $lookup_value);
}
$end = microtime(true);
$results["spl_in_array"] = ($end - $start);

$results["in_array/spl_in_array"] = $results["in_array"] / $results["spl_in_array"];
$results["spl_in_array/in_array"] = $results["spl_in_array"] / $results["in_array"];
$fastest = ($results["in_array"] > $results["spl_in_array"]) ? "spl_in_array" : "in_array";
foreach ($results as &$result) {
    $result = format($result);
}
$results["fastest"] = $fastest;
print_r($results);

我得到了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Array
(
    [in_array] => 0.001330
    [spl_in_array] => 0.019912
    [in_array/spl_in_array] => 0.066801
    [spl_in_array/in_array] => 14.969887
    [fastest] => in_array
)
Array
(
    [in_array] => 0.001024
    [spl_in_array] => 0.015516
    [in_array/spl_in_array] => 0.065997
    [spl_in_array/in_array] => 15.152270
    [fastest] => in_array
)
Array
(
    [in_array] => 0.001124
    [spl_in_array] => 0.015159
    [in_array/spl_in_array] => 0.074140
    [spl_in_array/in_array] => 13.487908
    [fastest] => in_array
)
Array
(
    [in_array] => 0.000838
    [spl_in_array] => 0.013853
    [in_array/spl_in_array] => 0.060495
    [spl_in_array/in_array] => 16.530299
    [fastest] => in_array
)
Array
(
    [in_array] => 0.000960
    [spl_in_array] => 0.014201
    [in_array/spl_in_array] => 0.067609
    [spl_in_array/in_array] => 14.790911
    [fastest] => in_array
)
Array
(
    [in_array] => 0.000865
    [spl_in_array] => 0.015183
    [in_array/spl_in_array] => 0.056970
    [spl_in_array/in_array] => 17.553197
    [fastest] => in_array
)

因此,使用foreach()手动执行此操作显然不是一种特别有效的方法。

因此出现了这样一个问题:我应该如何检查SplFixedArray是否包含某些内容?in_array()的SplFixedArray等价物是什么?

EN

回答 1

Stack Overflow用户

发布于 2020-05-16 20:53:21

如果使用->toArray()方法将spl数组转换为标准PHP array,然后使用in_array(),则可以极大地减少时间

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$check_iterations = 100;
$nbr_array_values = 100000;
$lookup_value = round($nbr_array_values / 2);

function format(float $f): string
{
    return number_format($f, 6);
}

function spl_in_array(\SplFixedArray &$arr, $value): bool
{
    foreach ($arr as $val) {
        if ($val === $value) {
            return true;
        }
    }
    return false;
}

function new_spl_in_array(\SplFixedArray &$arr, $value): bool
{
    $a = $arr->toArray();
    return in_array($value, $a);
}

$arr = [];
for ($i = 0; $i < $nbr_array_values; ++ $i) {
    $arr[] = $i;
}
$splArr = SplFixedArray::fromArray($arr);
$results = [];
$start = microtime(true);
for ($i = 0; $i < $check_iterations; ++ $i) {
    in_array($lookup_value, $arr, true);
}
$end = microtime(true);
$results["in_array"] = $end - $start;
$start = microtime(true);
for ($i = 0; $i < $check_iterations; ++ $i) {
    spl_in_array($splArr, $lookup_value);
}
$end = microtime(true);
$results["spl_in_array"] = ($end - $start);

$start = microtime(true);
for ($i = 0; $i < $check_iterations; ++ $i) {
    new_spl_in_array($splArr, $lookup_value);
}
$end = microtime(true);
$results["spl_in_array_new"] = ($end - $start);

$results["in_array/spl_in_array"] = $results["in_array"] / $results["spl_in_array"];
$results["spl_in_array/in_array"] = $results["spl_in_array"] / $results["in_array"];
$fastest = ($results["in_array"] > $results["spl_in_array"]) ? "spl_in_array" : "in_array";
foreach ($results as &$result) {
    $result = format($result);
}
$results["fastest"] = $fastest;
print_r($results);

结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Array
(
    [in_array] => 0.011569
    [spl_in_array] => 1.094222
    [spl_in_array_new] => 0.157041      // < Using ->toArray()
    [in_array/spl_in_array] => 0.010573
    [spl_in_array/in_array] => 94.583991
    [fastest] => in_array
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61842807

复制
相关文章
重温数据结构:哈希 哈希函数 哈希表
该文介绍了计算机科学中的哈希表(Hash Table)及其在编程中的应用。哈希表是一种数据结构,可以高效地完成查找、插入、删除等操作。文章还介绍了哈希函数、哈希冲突、拉链法等概念。
张拭心 shixinzhang
2018/01/05
2.6K1
重温数据结构:哈希 哈希函数 哈希表
数据结构 Hash表(哈希表)
参考链接:数据结构(严蔚敏) 文章发布很久了,具体细节已经不清晰了,不再回复各种问题 文章整理自严蔚敏公开课视频 可以参考 https://www.bilibili.com/video/av22258871/ 如果链接失效 可以自行搜索 数据结构严蔚敏视频 @2021/07/12
全栈程序员站长
2022/09/15
1.2K0
数据结构——哈希表
因为该字符串只包含小写字母,即只存在a-z 26个小写字母,我们将其a-z对应到数组0-25索引的位置,出现一次,index+1
Java架构师必看
2021/05/14
4930
数据结构——哈希表
哈希表、哈希冲突
哈希表 1.哈希表是一种以键值key存储数据value的结构,以key作为标识值存储value值;只要输入待查找的key,即可获取其对应的value值。当按照键值查询元素时,使用相同的hash函数将key转换为数组下标,从数组中按照下标对应的位置获取数据。它实际上是数组的一种扩展,数组+链表+红黑树。 2.哈希表的设计 哈希函数的设计首先不能过于复杂,复杂的哈希函数会间接的影响hash表的性能;其次要求哈希值应该尽可能随机且均匀分布,避免或者减少哈希冲突的数量,使每个桶中存储的数据比较平均。
全栈程序员站长
2022/06/25
7920
[数据结构与算法] 哈希表
如下图,定义了16个数组,每个数组用来存放一条链表. 在插入数据时, 首先会通过将元素值对数组个数取模来找到该元素位于哪个链表(数组), 然后再按照链表的插入方式插入
时间静止不是简史
2020/07/25
7560
哈希表
散列表(Hash table哈希表),是根据关键码值(key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,可以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
JusterZhu
2022/12/07
4230
哈希表
在cuda中使用哈希表
获取GPU卡信息 这也是任何cuda程序的第一步,检查有没有卡,以及卡的计算能力等;使用cudaGetDeviceCount() cudaGetDeviceProperties()等API来获取信息
零式的天空
2022/03/14
1.1K0
数据结构哈希表例题_数据结构哈希算法
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170983.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/23
2070
数据结构哈希表例题_数据结构哈希算法
哈希表
哈希表结合了顺序表和链表两者的优势,顺序表随机访问快,链表插入删除元素快。那么怎么将两者结合呢? 首先想要随机访问速度快,必须用顺序表,试想一下一个场景: 1.场景一 A往数组里填充了几个元素:4,2,66,89,1 将这个数组交给了B B拿到数组后,想要获取元素:1,但是B不知道元素1具体在哪个索引下,所以B只能遍历数组,从而获取到了元素:1 时间复杂度 O(n) n为数组大小
aruba
2021/07/27
6520
哈希表
哈希表是一种数据结构。它通过哈希函数把数据和位置进行映射,来实现快速的寻找、插入和删除操作。
code-child
2023/05/30
2770
哈希表
哈希表
哈希表,又叫散列表,是数据结构的一种。 散列表用途很广泛,比如一个电话薄,每一个姓名对应一个电话号码。姓名与电话号码呈映射关系。假如要创建一个电话薄,可以使用 JavaScript 对象来实现。
多云转晴
2019/10/30
8710
哈希表
哈希表
哈希表是种数据结构,它可以提供快速的插入操作和查找操作。第一次接触哈希表时,它的优点多得让人难以置信。不论哈希表中有多少数据,插入和删除(有时包括侧除)只需要接近常量的时间即0(1)的时间级。实际上,这只需要几条机器指令。   对哈希表的使用者一一人来说,这是一瞬间的事。哈希表运算得非常快,在计算机程序中,如果需要在一秒种内查找上千条记录通常使用哈希表(例如拼写检查器)哈希表的速度明显比树快,树的操作通常需要O(N)的时间级。哈希表不仅速度快,编程实现也相对容易。   哈希表也有一些缺点它是基于数组的,数组
java达人
2018/01/31
7970
哈希表
哈希表
\texttt{hashtable}[\operatorname{hash}(key)] = \texttt{value}
Clouder0
2022/09/23
1.3K0
哈希表
哈希表的英文叫 “Hash Table”,我们平时也叫它 “散列表” 或者 “Hash 表”。
硬件开源小站
2023/04/07
1.1K0
哈希表
哈希表
要查一个数在数组中的位置,那可是太费劲了,只能从头开始一个个的比较,直到找到相等的才算完事。
武师叔
2022/09/26
4550
哈希表
数据结构之哈希表
哈希表的英文叫“Hash Table”,我们平时也叫它“散列表”或者“Hash 表”,是一种常用的数据结构。Java中的HashMap、HashTable就是基于哈希表实现的。
端碗吹水
2021/01/22
6990
数据结构 哈希表设计
程序的功能是对一批关键字集合采用除留余数法和线性探测再散列的方法解决冲突来建立相应的哈希表和完成查找过程及平均查找长度的计算。
全栈程序员站长
2022/07/25
2810
哈希表的认识
将要查询的key使用哈希函数计算出哈希值,进行mod运算,得出的结果即当前要查询key在数组中的的下标,通过下标访问即可获取存储的元素,取出对应的值。
神奇的程序员
2022/04/10
3800
哈希表的认识
数据结构篇——哈希表
数据结构篇——哈希表 本次我们介绍数据结构中的哈希表,我们会从下面几个角度来介绍: 哈希表介绍 例题模拟散列表的两种方法 字符串前缀哈希法 哈希表介绍 首先我们先来简单介绍一下哈希表: 哈希表主要负责将空间较大的离散的数压缩为空间较小的数 例如我们将10-9~109之间的离散数可以压缩到10^5数组中 我们哈希表的主要算法为: 将x mod 10^5 得出余数,按照余数放在压缩后的数组中去 如果遇到冲突问题,我们采用两种方法来解决:拉链法和开放寻址法 我们给出两种解决方式: 拉链法:整个数组额外创建e[n
秋落雨微凉
2022/11/22
2870
哈希函数和哈希表
笔者在读研刚开始的时候,偶尔看面经,有这样一个问题:只用2GB内存在20亿个整数中找到出现次数最多的数,当时的我一脸懵逼,怎么去思考,20亿个数?What The Fuck! 但是,看完今天的文章,你或许就会觉得原来也不过如此啊!其核心就是哈希函数和哈希表的应用!
算法工程师之路
2019/08/05
1.5K0

相似问题

哈希表使用的哈希?

27

MySQL表关系与md5哈希的使用

10

哈希映射的哈希表通常使用什么数据结构?

11

从哈希表中的哈希表访问数据的PowerShell

112

哈希表数据排序

32
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文