有的人掌握了数组知识,觉得不过如此;有的人掌握了数组思想,觉得其很伟大。
数组思想的产生不是凭空产生的,而是立足于丰富的数组知识之上的,是踩坑踩出来的。如果数组知识不丰富,如果在学习的过程中没有踩过坑,那就没有时间投入,也不会花费时间去思考数组,没有时间的付出谈何思想的升华呢?在Java里面,数组的知识并不丰富,大家一学就会,自然就没有机会让人去思考数组了,而在c/c++里面,数组的知识变化多端,在学习的过程中会踩很多的坑,坑踩的多,自然思考的机会就多,花费的时间就多,慢慢就能升华到数组思想了。
我在面试的过程中,经常喜欢问的一个问题是:哈希和数组有什么关系呢?可惜很多人都没有答出来。我觉得,不应该做一个只会搬砖的码农,更应该学会思考,多思考,对数据结构知识深度的掌握,才能提升自我能力。凡是对这个问题没有答出来的人,很难被录取的,因为我觉得连基本的数组都没有掌握好,很难成为成长起来的。这个问题的答案是这样的:
哈希表 的本质就是数组,它是数组的升华。查找元素的过程分为两大步骤:
第一:定位key的哈希值
第二:根据哈希值定位元素的位置
哈希表的查找过程,耗时在计算哈希上面,然后得出哈希值之后定位元素的过程是非常快的。
哈希表的本质就是数组,所以它也是连续的,就完全把它当做普通数组对待就行了。不要被哈希表这个名词所干扰,误认为是高大上的东西。
既然提到了数组思想,那么什么是数组思想呢?我觉得应该包括以下几点:
(1)深刻认识到数组查找的快,快的没边。假如有一堆数据,总量为10000,如果采用 链表 形式去存储,现在想找到中间的数据,则需要查找5000次,而数组则需要1次。如此大的差距,数组查找的快可不是快一点,而是非常快,需要深刻的认知,需要有主观感性的认识。
(2)明白数组查找快的根本原因。
2.1数组是顺序存储,在内存中是一个整块;
2.2 数组元素的定位分为两步:第一步,计算下标i*数组元素大小求出偏移 地址 ;第二步:数组首地址+偏移地址就是元素i的地址
2.3 链表的内存不是连续的,只能一个一个查找,速度自然慢很多了。
(3)认识到哈希表的本质就是数组,它是数组的升华。就是上面提到的内容。