从哈希结构去理解PHP数组
2016-04-21 21:59
127 查看
php的数组实际上就是hash_table,无论是 数字索引数组array(1, 2, 3) 还是关联数组array(1 => 2, 2=> 4)等等。
一,这里的hash_table有几个特殊的地方:
1. 遍历的时候的顺序和插入的顺序一致,也就是如果你插入的时候顺序是:
那么它foreach的遍历顺序还是3, 2, 1。我们可以利用这个特殊的性质,如果开始的时候,插入的顺序是有序的,那么foreach也是有序的,这个是很方便的。
2. 插入和删除都是O(1)的复杂度,特别是删除,比较方便。
3. 遍历的效率低于一般的数组,因为数据不是连续的。
二,PHP采用了DJBX33A(time33)哈希函数,哈希函数将两个不同的key映射到同一个索引的情况,出现哈希冲突。解决哈希冲突的方法有链接法和开放寻址法,PHP采用链接法。
链接法:链接法通过使用一个链表来保存slot值的方式来解决冲突,也就是当不同的key映射到一个槽中的时候使用链表来保存这些值。 所以使用链接法是在最坏的情况下,也就是所有的key都映射到同一个槽中了,操作链表的时间复杂度为O(n)。 所以选择一个合适的哈希函数是最为关键的。目前PHP中HashTable的实现就是采用这种方式来解决冲突的。
开放寻址法:通常还有另外一种解决冲突的方法:开放寻址法。使用开放寻址法是槽本身直接存放数据, 在插入数据时如果key所映射到的索引已经有数据了,这说明发生了冲突,这是会寻找下一个槽, 如果该槽也被占用了则继续寻找下一个槽,直到寻找到没有被占用的槽,在查找时也使用同样的策律来进行。
三,PHP中哈希表结构
假定向PHP数组中插入三个元素分别为Bucket1,Bucket2,Bucket3,其中Bucket1和Bucket2的key具有相同的哈希值。其在哈希表中存储如图所示:
从上图可知,(1)哈希表中同一个哈希值对应元素存储在双向链表中。(2)PHP数组<key,value>,将key代入哈希函数,很快获得哈希值。然后遍历此哈希值对应链表,获取链表中某个属性是key的节点,此节点的值是value。PHP数组中获取key的速率高于value,可以利用此优势。
一,这里的hash_table有几个特殊的地方:
1. 遍历的时候的顺序和插入的顺序一致,也就是如果你插入的时候顺序是:
$a = array(); $a[3] = 3; $a[2] = 2; $a[1] = 1;
那么它foreach的遍历顺序还是3, 2, 1。我们可以利用这个特殊的性质,如果开始的时候,插入的顺序是有序的,那么foreach也是有序的,这个是很方便的。
2. 插入和删除都是O(1)的复杂度,特别是删除,比较方便。
3. 遍历的效率低于一般的数组,因为数据不是连续的。
二,PHP采用了DJBX33A(time33)哈希函数,哈希函数将两个不同的key映射到同一个索引的情况,出现哈希冲突。解决哈希冲突的方法有链接法和开放寻址法,PHP采用链接法。
链接法:链接法通过使用一个链表来保存slot值的方式来解决冲突,也就是当不同的key映射到一个槽中的时候使用链表来保存这些值。 所以使用链接法是在最坏的情况下,也就是所有的key都映射到同一个槽中了,操作链表的时间复杂度为O(n)。 所以选择一个合适的哈希函数是最为关键的。目前PHP中HashTable的实现就是采用这种方式来解决冲突的。
开放寻址法:通常还有另外一种解决冲突的方法:开放寻址法。使用开放寻址法是槽本身直接存放数据, 在插入数据时如果key所映射到的索引已经有数据了,这说明发生了冲突,这是会寻找下一个槽, 如果该槽也被占用了则继续寻找下一个槽,直到寻找到没有被占用的槽,在查找时也使用同样的策律来进行。
三,PHP中哈希表结构
假定向PHP数组中插入三个元素分别为Bucket1,Bucket2,Bucket3,其中Bucket1和Bucket2的key具有相同的哈希值。其在哈希表中存储如图所示:
从上图可知,(1)哈希表中同一个哈希值对应元素存储在双向链表中。(2)PHP数组<key,value>,将key代入哈希函数,很快获得哈希值。然后遍历此哈希值对应链表,获取链表中某个属性是key的节点,此节点的值是value。PHP数组中获取key的速率高于value,可以利用此优势。
相关文章推荐
- laravel belongsTo()&hasOne()用法详解
- ftp服务器、 Samba服务器、NFS服务器的区别
- yii2 GridView 下拉搜索实现案例教程
- yii2 GridView常见操作
- PHP中的验证码类(验证码功能设计之二)
- 一个自己开发的简单,快速,方便,小巧的php web框架
- PHP中的验证码类(验证码功能设计之一)
- PHPExcel读取excel文件示例
- getAttribute()与getParameter的区别
- PHP中的验证码类(准备篇)
- php干不了的活
- PHP中使用GD库方式画时钟
- PHP封装的图片大小调整类
- PHP等比例缩放图片
- OutputFormats
- fck配置图片上传(php版)
- PhpStorm 10.0注册
- PHP两个日期之间的所有日期
- PhpStorm11.0 配置在浏览器中打开文件
- PHP CI分页类带多个参数