【问题标题】:Using values as keys in arrays to reduce complexity when searching for items使用值作为数组中的键以降低搜索项目时的复杂性
【发布时间】:2015-08-31 00:05:33
【问题描述】:

有时我在 PHP 中做了很多工作。大海捞针。

$names = [
    'Mike',
    'John',
    'Dave',
    'Tony'
];

$gotDave = in_array('Dave', $names);

in_array 的运行时间是 O(n),其中 n 是元素的数量。

我经常将我的查找数据结构设置为如下所示。

$names = [
    'Mike' => true,
    'John' => true,
    'Dave' => true,
    'Tony' => true
];

$gotDave = isset($names['Dave']);

运行时间是 O(1),因为在 php 中关联数组是一个哈希图。

一些问题:

  • 我应该这样做吗?这是一种好的做法吗?
  • 右手骑行是否更划算

【问题讨论】:

  • 就我个人而言,这不能怪..
  • 只是出于好奇:“in_array 的运行时间是O(n)”是什么意思? O 代表什么?
  • @D4V1D 它叫大哦符号。你可以用谷歌搜索更多信息。
  • 请注意,这并不是真正的一对一,因为您无法从 ['Mike', 'Mike'] 创建第二个数组
  • @Uchiha 是什么意思?是的,它比编写文字要慢一些,但我认为与键查找相比,数组初始化很少发生。

标签: php arrays


【解决方案1】:

您可以使用array_key_exists() 检查数组的键,这与检查值的in_array 不同

在您的情况下,您必须使用 array_key_exists() 而不是 isset()

【讨论】:

    【解决方案2】:

    是的,这是一个很好的解决方案。事实上,这就是 Set 在大多数编程语言的核心库中实现的方式——在我的脑海中,Python、Ruby 和 Java 都是这样实现的。 Go 语言不提供 Set,只是告诉你做你已经做过的事情。

    我想不出任何理由使用除 true ```true`` 之外的任何值。这很有意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      相关资源
      最近更新 更多