加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Foreach on Perl中的哈希变量

发布时间:2020-12-15 23:29:46 所属栏目:大数据 来源:网络整理
导读:我是Perl脚本的新手,对于散列变量的foreach有疑问.我想打印哈希值的所有值.这是一个程序: %colors = (a = 1,b=2,c=3,d=4,e=5);foreach $colors(keys %colors){ print "$colors{%colors} n";} 输出是: 53124 为什么值随机排序?或者这种随机性背后的逻辑是
我是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

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

解决方法

我认为你的困惑在于不知道Hash究竟是什么.大多数语言都有类似于键值存储的东西,在Ruby和Perl中它们被称为Hashes,在Java地图中,在Python字典中等等……

它们本质上是一回事,您将一个带有唯一键的值插入到某个底层数据结构中,以便以内存为代价直接访问它.

那么当你向哈希添加一个键和一个值时会发生什么?

哈希是围绕hash functions的思想构建的,当输入计算出一个独特的输出时(理想情况下每个输入都有自己独特的输出).如果两个输入都映射到同一输出,则称为冲突.

现在,我们需要讨论如何实现Hash,两个经典示例是使用单个数组或链接列表数组.我将在下面展示数组示例.

排列

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

h(x) = length(x) % ARRAY_SIZE

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

要查看可视化示例,请考虑大小为5的数组:

0     1     2     3     4
 ------------------------------
|     |     |     |     |      |
 ------------------------------

并假设我们正在尝试使用密钥abcd存储值5,根据我们的哈希算法

h('abcd') = length('abcd') % ARRAY_SIZE
          =      4         %      5
          =      4

所以值5将存储在索引4处:

0     1     2     3     4
 ------------------------------
|     |     |     |     |   5  |
 ------------------------------

现在如果我们尝试使用密钥dcba存储值3会发生什么,两个密钥是不同的吗?他们应该映射到不同的地方.

h('dcba') = length('dcba') % ARRAY_SIZE
          =      4         %      5
          =      4

哎呀!这个键也映射到索引4,那么我们现在要做什么呢?好吧,我们不能只丢掉键值对,因为程序员显然需要/想要在Hash中进行这种配对,所以我们需要决定在发生碰撞时该怎么做.有许多算法可以做到这一点,但最简单的算法是在数组中查找下一个打开的插槽并存储3个.所以现在我们的数组看起来像:

0     1     2     3     4
 ------------------------------
|   3  |     |     |     |  5  |
 ------------------------------

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

希望这有用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读