请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

20w个数字倒着插入,为什么就是hash 数组呢?

雷哥 在看免费课程数组章节的时候有这么个疑惑:
20w个数字倒着插入,为什么就是hash 数组呢?

正在回答

1回答

首先弄清楚packed array和hash array的区别。  

packed array可以认为类似于c语言中的数组, 数组的特点是“顺序”存储的,那么我们从0到20w是顺序的,所以可以一直保持“c语言数组”的特点,一直是packed array。这时候请注意,是不需要额外的“索引”来记录每个元素的位置的,因为“c语言数组”的下标是天然的索引。

而当我们从20w倒着插入的时候,就不是“顺序”的了,这时候需要“索引”来记录每个元素的位置,比如第20w放在第0个位置,这就要一个索引进行对应的。  此时就是hash array。  索引放在arData的前面的int32_t类型的数组中。见图:


//img1.sycdn.imooc.com//szimg/5c4c298d0001306312160594.jpg


对于$arr[0] = 'a',$arr[2]='b',$arr[1]='c', 过程如下:

//img1.sycdn.imooc.com//szimg/5c4c46db0001e5c825561262.jpg

https://img1.sycdn.imooc.com//szimg/5c4c47340001654e17580654.jpg

https://img1.sycdn.imooc.com//szimg/5c4c47450001d17523121330.jpg

https://img1.sycdn.imooc.com//szimg/5c4c47560001ac6325481062.jpg

https://img1.sycdn.imooc.com//szimg/5c4c476600018a3825401262.jpg

https://img1.sycdn.imooc.com//szimg/5c4c477c0001da6b25580560.jpg

https://img1.sycdn.imooc.com//szimg/5c4c478d00019d6d15640390.jpg

0 回复 有任何疑惑可以回复我~
  • 提问者 小奇葩001 #1
    感谢雷哥,理解了。刚做了一个实验,$arr[0] = 'a',$arr[2]='b',$arr[1]='c',执行完 0 2 后还是packed array,执行完1后就是hash array了。雷哥的回答“”此时就是packed array。 “”,手误了吧,应该是hash array吧。第一次买课程,感觉非常值得,每次都能及时的得到答案。
    回复 有任何疑惑可以回复我~ 2019-01-26 18:06:24
  • 陈雷 回复 提问者 小奇葩001 #2
    谢谢支持哈。   确实手误了, 是hash array 。   手机打字不太方便。   希望你能通过这门课,掌握基本php底层实现的原理,然后进一步研究;PHP的实现还是很深的,需要持续去学习去理解。
    回复 有任何疑惑可以回复我~ 2019-01-26 18:16:38
  • 提问者 小奇葩001 回复 陈雷 #3
    雷哥 数组这样:$arr[0] = 'a',$arr[2]='b',$arr[1]='c';arData[2]的key是空h=1;但是 h|-8=-7,但是我取arData[-7]的u1type确是0;
    
    {val = {value = {lval = 0, dval = 0, counted = 0x0, str = 0x0, arr = 0x0, obj = 0x0, res = 0x0, ref = 0x0, ast = 0x0, 
          zv = 0x0, ptr = 0x0, ce = 0x0, func = 0x0, ww = {w1 = 0, w2 = 0}}, u1 = {v = {type = 0 '\000', type_flags = 0 '\000', 
            const_flags = 0 '\000', reserved = 0 '\000'}, type_info = 0}, u2 = {next = 0, cache_slot = 0, lineno = 0, num_args = 0, 
          fe_pos = 0, fe_iter_idx = 0, access_flags = 0, property_guard = 0}}, h = 0, key = 0x0}   雷哥这是为啥呢?我哪里理解错了吗?
    回复 有任何疑惑可以回复我~ 2019-01-26 18:45:22
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信