gpt4 book ai didi

perl - Perl 中哈希变量的 Foreach

转载 作者:行者123 更新时间:2023-12-03 18:17:54 24 4
gpt4 key购买 nike

我是 Perl 脚本的新手,对 foreach 有疑问关于哈希变量。我想打印散列的所有值。这是一个程序:

%colors = (a => 1, b=>2, c=>3, d=>4, e=>5);
foreach $colors(keys %colors)
{
print "$colors{%colors} \n";
}

输出是:
5
3
1
2
4

为什么这些值是随机排序的?或者这种随机性背后的逻辑是什么?请澄清我的疑问。

最佳答案

我认为您的困惑在于不确切知道哈希是什么。大多数语言都有类似于键值存储的东西,在 Ruby 和 Perl 中它们被称为哈希,在 Java Maps 中,在 Python 字典中,等等......

它们本质上都是一样的,你将一个带有唯一键的值插入到一些底层数据结构中,以牺牲内存为代价获得对它的直接访问。

那么当你向散列添加一个键和一个值时实际会发生什么呢?

哈希是围绕 hash functions 的想法构建的将一些值作为输入计算唯一的输出(理想情况下每个输入都有自己唯一的输出)。如果两个输入都映射到相同的输出,则称为碰撞。

现在我们需要讨论哈希是如何实现的,两个经典示例是使用单个数组或链表数组。我将在下面展示数组示例。

大批

在简单数组的情况下,哈希底层的数据结构只是一个具有一定大小的数组。散列函数用于计算该数组的索引。如果我们假设一个简单的散列算法

h(x) = length(x) % ARRAY_SIZE

这里 x是一个字符串和 ARRAY_SIZE是我们底层数组的大小,此语句将确保所有值 x将落在 0..ARRAY_SIZE - 1 范围内

看一个直观的例子,考虑一个大小为 5 的数组:
   0     1     2     3     4
------------------------------
| | | | | |
------------------------------

并假设我们正在尝试存储值 5使用 key abcd ,根据我们的哈希算法
h('abcd') = length('abcd') % ARRAY_SIZE
= 4 % 5
= 4

所以值 5将存储在索引 4 :
   0     1     2     3     4
------------------------------
| | | | | 5 |
------------------------------

现在,如果我们尝试存储值 3 会发生什么?使用 key dcba ,这两个键不一样吧?他们应该映射到不同的地方。
h('dcba') = length('dcba') % ARRAY_SIZE
= 4 % 5
= 4

哎呀!此键也映射到索引 4那么我们现在要做什么?好吧,我们不能只是扔掉键值对,因为程序员显然需要/希望在他们的 Hash 中进行这种配对,所以我们需要决定在发生冲突时该怎么做。有很多算法可以做到这一点,但最简单的一种是在数组中寻找下一个空位并存储 3他们的。所以现在我们的数组看起来像:
   0     1     2     3     4
------------------------------
| 3 | | | | 5 |
------------------------------

这不是一个非常深入的解释,但希望它能深入了解为什么从 Hashes 中检索值似乎是随机的,这是因为底层数据结构不断变化,如果你现在从你的 Hash 中请求键,你会可能会回来 (3, 5) ,即使您插入了 5首先,只因为 3首先出现在数组中。

希望这是有帮助的。

关于perl - Perl 中哈希变量的 Foreach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17855301/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com