优先队列 PriorityQueue (优先队列priority_queue)
本文目录导航:
优先队列(PriorityQueue)
在数据结构中,普通的队列是先进先出,但有时咱们或者并不想有这么固定的规矩,咱们宿愿能有一个带优先级的队列。
思索在事实生存中,一些服务排队窗口会写着“军人依法优先”;送进医院的患者,即使是按顺序抵达的,生病愈加严重的往往优先级也会更高;还有操作系统中的作业调度也和优先级无关...... 于是咱们能不能改良队列?使得队列是有必定优先级的,这样能让一些事物和义务的处置变的愈加灵敏。
当然是可以的,最基本的咱们可以基于线性结构来成功,思索基于线性结构的期间复杂度: 1、队列是一种FIFO(First-In-First-Out)先进先出的数据结构,对应于生存中的排队的场景,排在前面的人总是先经过,依次启动。
2、优先队列是不凡的队列,从“优先”一词,可看出有“插队现象”。
比如在火车站排队进站时,就会有些比拟急的人来插队,他们就在前面先经过验票。
优先队列至少含有两种操作的数据结构:insert(拔出),行将元素拔出到优先队列中(入队);以及deleteMin(删除最小者),它的作用是找出、删除优先队列中的最小的元素(出队)。
结构\操作 入队出队 普通线性结构O(1)O(n) 顺序线性结构O(n)O(1) 普通线性结构成功的优先队列出队期间复杂度是O(n),由于出队要拿出最优先的元素,也就是相对最大的元素(留意:大小是相对的,咱们可以指定比拟规定),从而要扫描一遍整个数组选出最大的取出才行。
而关于顺序线性结构的入队操作,入队后或者破坏了原来的有序性,从而要调整以后顺序。
可以看到经常使用线性结构总有期间复杂度是O(n)的操作,还有没有更好的成功方式呢,当然是有的,这就要来聊一聊堆Heap。
堆严厉意义过去说又叫二叉堆(Binary Heap),由于它的结构是一颗齐全二叉树,堆普通分为最大堆和最小堆。
堆性质: 结构性:堆是一颗除底层外被齐全填满的二叉树,底层的节点从左到右填入,这样的树叫做齐全二叉树。
即缺失结点的局部必定再树的右下侧。
堆序性:由于咱们想很快找出最小元,则最小元应该在根上,恣意节点都小于它的后裔,这就是小顶堆(Min-Heap);假设是查找最大元,则最大元应该在根上,恣意节点都要大于它的后裔,这就是大顶堆(Max-heap)。
最大堆:父亲节点的值大于孩子节点的值 最小堆:父亲节点的值小于孩子节点的值 由于是齐全二叉树,节点的索引之间有着必定的相关,故咱们可以经常使用数组来存储二叉堆,详细如下: 假设从索引为0开局存储,则父亲和孩子节点的索引相关如下: 当咱们须要向一个最大堆减少一条新的数据时,此时咱们的堆变成了这样。
此时,由于新数据的参与曾经不合乎最大堆的定义了。
所以咱们须要对新参与的数据启动shift up操作,将它放到它应该在的位置。
shift up操作时咱们将新参与的数据与它的父节点启动比拟。
假设比它的父节点大,则交流二者。
此时咱们就成功了 对新参与元素的shift up操作。
当咱们从堆中(也就是优先队列中)取出一个元素时。
咱们是将堆顶的元素弹出。
(只能从堆顶取出) 此时这个堆没有顶了,那么该怎样办呢?咱们只有要把这个堆最后一个元素放到堆顶就可以了。
此时咱们就成功了弹出一个元素之后的shift down操作。
replace:去除最大元素后,放入一个新元素 成功:可以先extractMax,再add,两次longn操作。
成功:将堆顶的元素交流以后sift down,一次性O(logn)操作 将n个元素一一拔出到一个空堆中,算法复杂度是O(nlogn),heapify的环节,算法的复杂度为O(n). heapify:将恣意数组整顿成堆的状态。
首先将一个数组形象成一个堆。
这个环节,咱们称之为heapify。
之后咱们找到这个堆中第一个非叶子节点,这个节点的位置一直是数组的数量除以2,也就是索引5位置的27,从这个节点开局,对每一个非叶子的节点,,启动shift down操作。
27比它的子节点51要小,所以交流二者。
接上去咱们看索引2位置的20。
首先呢,咱们须要将20与它两个子节点中较大的51交流。
每个节点堆化的期间复杂度是O(logn),那个节点的堆化的总期间复杂度是O(nlogn)。
推导环节 堆化节点从倒数第二层开局。
堆化环节中,须要比拟和交流的节点个数与这个节点的高度k成正比。
所以 heapify() 期间复杂度是 O(n). 建堆后,数组中的数据是大顶堆。
把堆顶元素,即最大元素,跟最后一个元素交流,那最大元素就放到了下标为n的位置。
这个环节有点相似下面的“删除堆顶元素”的操作,当堆顶元素移除之后,把下标n的元素放堆顶,而后再经过堆化的方法,将剩下的n-1个元素从新构建成堆。
不时重复这个环节,直到最后堆中只剩下下标为1的元素,排序就成功了。
topk和selectk疑问既可以经常使用快排思维处置,也可以经常使用优先队列处置。
快排:O(n) 空间O(1) 优先队列:O(nlogk) 空间O(k) 优先队列的有i是,不须要一次性性知道一切数据,数据流的方式处置。
[幽默的ES配置调研]Keyword类型字段排序居然是这种成果?!
在 Elasticsearch 的经常使用环节中,咱们了解到 string 类型在 5.0 版本后出现了严重变卦,被拆分红 text 和 keyword 两种新的数据类型。
自动状况下,文本字段同时映射为 text 和 keyword 类型,这也解释了为什么某些字段会智能创立与之对应的 字段。
在实践运行中,咱们经常常使用 keyword 类型启动关键词搜查,并且须要设置排序规定。
但是,在一次性试验中,咱们发现了一个无心思的现象:当设置 mode 为 min 和 order 为 desc 时,排序结果并没有如预期的那样启动降序陈列,这惹起了咱们的思索和考查。
接上去,咱们经常使用 Lucene 启动了深化摸索。
经过对比不同选项的组合,咱们发现排序行为在 keyword 类型的多值查问中具备特定的法令。
这些法令重要体如今 sortMode 和 sortOrder 的选用上,它们对排序顺序发生了影响。
在 Lucene 的成功中,keyword 类型的写入分为两局部:存储时,数据以 doc values 方式启动排序,行将文本内容编号并排序,而非存储实践的文本值。
同时,排序操作在写入环节中就曾经成功,这为咱们的初步论断提供了基础。
接上去,咱们深化钻研了 sortMode 和 sortOrder 在 Lucene 中对 keyword 查问的影响。
经过对源代码的剖析,咱们发现 sortMode 的值选择了排序方式,而 sortOrder 则影响了排序的顺序。
例如,当 sortMode 设置为 MAX 时,排序取值逻辑会依据 sortOrder 的顺序调整,这进一步影响了文档召回顺序的陈列。
在查问流程中,排序和打分的环节出当初多个步骤中。
在 Lucene 的查问成功中,排序和结果搜集的环节触及优先队列(PriorityQueue)的运行。
优先队列的调整环节在排序时施展了关键作用,确保了却果依照指定的顺序输入。
综上所述,keyword 类型在 Elasticsearch 中的排序行为遵照特定的法令。
索引时,排序消息被嵌入数据中,查问时依据 sortMode 和 sortOrder 的设置启动排序,从而影响了排序结果的出现。
最终,咱们总结出关键词排序的关键点,包含自动排序规定、查问时的排序规定选用以及排序规定对结果召回顺序的影响。
名目中有哪些汇合类型
在名目中,罕用的汇合类型有以下几种:1. 数组(Array):有序的元素汇合,可以经过索引访问和修正元素。
2. 列表(List):有序的元素汇合,可以灵活减少、删除和修正元素。
3. 汇合(Set):无序的元素汇合,不准许重复元素。
4. 字典(Dictionary):键值对的汇合,可以经过键访问和修正对应的值。
5. 堆(Heap):一种不凡的优先队列,可以高效地拔出和删除元素,并依据必定规定失掉具备最高(或最低)优先级的元素。
6. 栈(Stack):一种后进先出(LIFO)的数据结构,只准许在栈的顶部启动拔出和删除操作。
7. 队列(Queue):一种先进先出(FIFO)的数据结构,只准许在队列的尾部启动拔出操作,在头部启动删除操作。
8. 链表(Linked List):一种经过指针衔接元素的数据结构,可以高效地启动拔出、删除和查找操作。
9. 树(Tree):一种档次结构的数据结构,可以用来示意具备父子相关的元素汇合。
10. 图(Graph):一种由节点和边导致的数据结构,用来示意元素之间的关联相关。
这些汇合类型在名目开发中都有各自的运行场景,开发人员可以依据详细需求选用适合的类型来存储和操作数据。
文章评论