常用的提高读写效率的数据结构:哈希表,有序数组,搜索树

哈希表:
key-value的存储结构,把值放在数组中,用一个哈希函数把key换算成确定的位置,然后把value放在数组的这个位置,不可避免多个key值经过哈希算法后出现同一个值的情况,处理这种情况的一种方式就是,拉出一个链表。
数组空间越小,哈希表值重复的概率就越大,对单链表的线性查找频率就越高。反过来,如果数组空间过来,又会出现很多闲置的空间,所以合理合计数组的大小很重要。

但是注意,哈希函数算法的特性导致存储的value是无序的,所以用哈希表的数据结构用作索引的情况下,做区间查询是非常慢的。所以哈希表哈希索引适用于等值查询的情况,比如Memcached及其他一些NoSql引擎。

https://baijiahao.baidu.com/s?id=1671247611862752442&wfr=spider&for=pc

 

 

有序数组:

 以身份证为例,将数据按照身份证号的大小,有序存储。查找的时候,只需要二分查找就可以定位到数据。时间复杂度是log(N)。//2的x次方等于N。比如N=8。那二分查找的时间复杂度就是3,N=16,就是4以此类推。

有序数组在等值查找区间查找都很优秀,但是却有一个致命问题,当有序找到需要插入数据的位置时,需要挪动这个数据后面所有的数据,所以有序数组只适合用静态数据的引擎。比如2017商城订单的信息,这种不会再改变的数据信息。

 

 

搜索树:

我们可以由浅入深先理解下二叉搜索树。二叉搜索树的特点是,左边子节点小于父节点,父节点又小于右边子节点。查找的时间复杂度为log(N),为了保持这颗树为平衡二叉树,更新的时间复杂度也是log(N)。

 

二叉树是搜索效率最高的,但是实际上大多数的数据库存储却并不使用二叉树。其原因是,索引不止存在内存中,还要写到磁盘上。

你可以想象一下一棵 100 万节点的平衡二叉树,树高 20。一次查询可能需要访问 20 个数据块。在机械硬盘时代,从磁盘随机读一个数据块需要 10 ms 左右的寻址时间。也就是说,对于一个 100 万行的表,如果使用二叉树来存储,单独访问一个行可能需要 20 个 10 ms 的时间,这个查询可真够慢的。

 

posted @ 2022-09-06 13:11  宋songsong  阅读(148)  评论(0编辑  收藏  举报