优秀的算法往往取决于你采用哪种数据结构。
常用的高级数据结构:
优先队列(Priority Queue)
图(Graph)
前缀树(Trie)
线段树(Segment Tree)
树状数组(Fenwick Tree/Binary Indexed Tree)
在分析问题的时候回归本质,很多题目都能迎刃而解了。
优先队列
与普通队列的区别:
保证每次取出的元素是队列中优先级最高的
优先级别可自定义
最常用的场景:
从杂乱无章的数据中按照一定的顺序(或者优先级)筛选数据。
例如:
任意给定一个数组,要求找出前k大的数。
最直接的办法就是先对这个数组进行排序,然后依次输出前k大的数。复杂度为O(nlogn)
如果借用优先队列就能将复杂度优化为O(k+nlogk)。
当数据量很大,而k相对较小时,用优先队列能显著地降低算法复杂度。其本质在于,要找出前k大的数,我们并不需要对所有的数进行排序。
优先队列的本质:
二叉堆的结构,堆在英文里叫Binary Heap
利用一个数据结构来实现完全二叉树。
即,优先队列的本质是一个数组,数组里的所有元素既有可能是其他元素的父节点,也有可能是其他元素的子节点。而且每个父节点只能有两个子节点。
优先队列的特性:
数组里的第一个元素array[0]拥有最高的优先级
给定一个下标i,那么对于元素array[i]而言