为了账号安全,请及时绑定邮箱和手机立即绑定

第6节中变成hash array之后,对于字符串‘abc’的bucket来说,‘key’和‘h’的值那个是‘2’?

$arr=[0=>'foo',2=>'abc'],foo在第0个位置,第一个位置为空,abc在第二个位置,之后变成hash array  ,此时foo在第0个位置,abc在第一个位置,bar在第二个位置。
问题一:$arr[2]取得值是‘abc’还是‘bar’?

问题二:‘abc’对应的key是‘2’还是对应的‘h’是‘2’?

正在回答

2 回答

问题一:$arr[2]取得值是‘abc’还是‘bar’?        使用$arr[2]取的值还是‘abc’  但是请注意,在底层的hashtable中,abc被放在第1个位置,当我们通过$arr[2]取值的时候, h值是2,2|-8=-6 从前面的索引数组中取-6的位置,是1;  然后从arData[1]取出来,h=2跟我们的$arr[2]里面的2相等,这时候没有发生冲突,因此,值就是我们要的,可以打印出来就是"abc",具体可以看下图:https://img1.sycdn.imooc.com//5c2d7f4900018b4d25161054.jpg

问题二:从上图可以看出, "abc"对应的key是0x0  h是2.


看一下是不是能解决你的疑问呢?


0 回复 有任何疑惑可以回复我~
#1

qq_时光正浓岁月安好_0 提问者

感谢老师解疑。以下是我的理解不知道对不对,请老师指正。 如果是packed array ‘h’和idx是对应的。如果是hash array 则是通过(如果关联数组,则用key经过hash函数计算出h)‘h’或运算计算出nIndex,再通过nIndex中保存的idx值找到对应的位置。 ‘foo’存储在idx='0'的位置是因为h='0'或运算-16得到nIndex='-16',该索引存储的idx值为0,所以'foo'才存储在0的位置。与packed array 存储在同一个位置。 超级期待老师后续的课程。
2019-01-03 回复 有任何疑惑可以回复我~

如果是packed array ‘h’和idx是对应的。如果是hash array 则是通过(如果关联数组,则用key经过hash函数计算出h)‘h’或运算计算出nIndex,再通过nIndex中保存的idx值找到对应的位置。

---这句话完全正确的。 packed array就是按照idx取。  hash array就是hashtable了,要计算对应的位置的。

‘foo’存储在idx='0'的位置是因为h='0'或运算-16得到nIndex='-16',该索引存储的idx值为0,所以'foo'才存储在0的位置。与packed array 存储在同一个位置。

-- 这个有一点点小问题, 对于hashtable是8个大小的时候就是0|-8  在第-8个索引位置;  你说的应该是扩容一倍以后,变成了hashtable是16个大小了。   公式就是nIndex = h | ht->nTableMask; 



1 回复 有任何疑惑可以回复我~
#1

qq_时光正浓岁月安好_0 提问者

感谢老师解答。 ^-^
2019-01-03 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

第6节中变成hash array之后,对于字符串‘abc’的bucket来说,‘key’和‘h’的值那个是‘2’?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信