数据结构是计算机编程中最重要的内容之一,我们经常会看到一个公式,那就是程序=数据结构+算法。从这个公式我们就能够看出来数据结构是多么的重要,要想写出优雅高效的程序,一定离不开良好的数据结构,今天我们就来盘点一下常用的数据结构的应用场景。
LRU 缓存淘汰算法
链表是最基础的数据结构,也是最常用的数据结构,很多复杂的数据结构都是通过链表演化而来的,而链表就可以用来实现LRU缓存淘汰。
![ac4fd028759c98507de1c810228ee5d9.png](https://i-blog.csdnimg.cn/blog_migrate/19cbdca3e7dfa612d9f0f040a6db3311.jpeg)
我们可以维护一个有序的链表,越靠近链表尾部的节点是越早之前访问的。当有一个新的数据被访问时,我们从链表头部开始顺序遍历链表。如果此数据之前已经被缓存在链表中了,我们遍历得到这个数据的对应结点,并将其从原来的位置删除,并插入到链表头部。如果此数据没在缓存链表中,如果此时缓存未满,可直接在链表头部插入新节点存储此数据;如果此时缓存已满,则删除链表尾部节点,再在链表头部插入新节点。
B+树索引
数据库已经成为我们应用程序离不开的存储引擎,对于大量的数据,我们经常需要创建数据库索引来提高查询检索效率,而B_树就是非常高效的数据结构,它通过将数据存放到叶子节点,增加了索引存储空间,同时B树的结构又让树的层次很低,大大加快了检索的比较次数,因此非常高效。
![0da7419de3f0fe7cd63d939e748a80a8.png](https://i-blog.csdnimg.cn/blog_migrate/8495dbe4d38d536a79bbd2e5b63d72ab.jpeg)
二叉树查找
排序和查找是我们经常需要进行的操作,而排序的最终目的也是为了更好地查找。而二叉树这个数据结构,就是为了方便我们进行数据的查找。我们都知道搜索二叉树的结构可以让查找变成二分查找,这大大加快速了查找效率。
表达式求值
对于一个表达式比如a+b*c,因为有优先级,所以我们不能按照从左到右的顺序进行运算,在这个时候栈这个数据结构就发挥出它的优势,通过使用栈,我们就能够轻松地计算表达式的值。
![281dba9d41976ad141373995552561d7.png](https://i-blog.csdnimg.cn/blog_migrate/6f1e73ff8f87affd76d6578fc8a22d9a.jpeg)
对于上面的表达式,我们只需要将数值和操作符压入到不同的栈中,然后从最后面比较操作符的优先级,如果后面的操作符的优先级更高,那么就先弹出数据计算后面的表达式值,否则可以先计算前面表达式的值。
消息队列
大型的互联网架构中,消息队列一定少不了,它不仅可以消除高峰期的流量值,还可以解耦代码,更可以处理日志。
而消息队列底层的数据结构就是队列,它是一种先进先出的数据结构,当然现在的消息队列是有优先级的,不过这些都是在队列的基础上演变的,如果没有队列的基础,消息队列是不能够掌握的。
关键词提示
当我们在搜索引擎里输入一个词的时候,它会提示给我们许多关键词,这些关键词是如何存储的,答案就是使用字典树这个数据结构,它根据关键词进行字典的排序,这样在查询的时候,通过前缀匹配,就可以高效地给出关键词的相关匹配数据。
![690f132fe901e0a4ef512c0a9fa8f66c.png](https://i-blog.csdnimg.cn/blog_migrate/2eaa9cc482cdee385cb1cdca4b99075e.jpeg)
有序集合
我们都知道redis的常用五种数据结构,其中有一个有序集合,它是如何实现的呢?答案就是它使用了跳表这种数据结构。不同于红黑树的复杂操作,跳表使用多层索引结构,大大加速了检索时间。
![dda1c9c29ef6c72ee0712d6859891f66.png](https://i-blog.csdnimg.cn/blog_migrate/1f64a98b52086b5b995bb2746b2fd399.jpeg)