引文
相信大家都用过数组,数组的特点是查询速度快,而插入和删除速度慢。插入和删除速度慢很容易理解,就是如果在数组中间插入或删除一个元素,后面的元素都要进行移动,时间复杂度是O(n)。而查询速度快是因为数组是根据索引来查询的,时间复杂度是O(1)。那为什么用索引来查就能做到这么快呢?先来看一下下面这张图:
以Java为例,这里是一个int类型的数组{4,7,2,9,1,3},已经知道数组的起始地址为 0x1000 ,如果要查询第3个元素的值要怎么查呢(从0开始)。
假如数组没有索引,那就只能通过遍历的方式来找了。这样时间复杂度就是O(n), 这种就是链表的查询方式。但是对于数组来说,它的元素内存是连续的,而且数据类型相同(占的空间相同),所以只要知道第0个元素的位置,就能算出后面连续的元素。
所以现在要找第三个元素的值,就能直接根据索引来计算它的位置:
address = address_start + data_size * index
即 address = 0x1000 + 4 * 3 = 0x100C
这样就能马上知道第三个元素的位置在内存地址为0x100C的位置, 这样的时间复杂度为O(1)。
看完这个例子后,是否对索引是什么和他的作用有所了解了呢。其实索引不一定是这样顺序结构的,也有一些树状结构的和哈希结构的。于索引使用的比较多的是数据库。以MySQL为例,索引的数据结构有一下几种:
1. B+树索引
2. hash索引
3. FULLTEXT索引
4. R-Tree索引