问答详情
源自:6-1 数组增删改查实战1

第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’?

提问者:qq_时光正浓岁月安好_0 2019-01-03 09:47

个回答

  • 陈雷
    2019-01-03 11:21:00
    已采纳

    问题一:$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://img4.mukewang.com/5c2d7f4900018b4d25161054.jpg

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


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


  • 陈雷
    2019-01-03 17:38:27

    如果是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;