Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 二进制堆的通用性 定义:_C_Data Structures_Language Agnostic_Priority Queue_Binary Heap - Fatal编程技术网

C 二进制堆的通用性 定义:

C 二进制堆的通用性 定义:,c,data-structures,language-agnostic,priority-queue,binary-heap,C,Data Structures,Language Agnostic,Priority Queue,Binary Heap,优先级队列是一种抽象数据类型,类似于常规队列或堆栈数据结构,但每个元素都有一个与其关联的“优先级”。在优先级队列中,高优先级的元素在低优先级的元素之前被服务。如果两个元素具有相同的优先级,则根据它们在队列中的顺序提供服务 实施: 为了实现优先级队列,非排序数组、排序数组和二进制堆数据结构是3种实现策略 具体来说,二进制堆实现策略可以使用密钥数组表示 或 每个键作为二进制节点,有两个子节点 问题: 除了优先级队列实现之外,它们还有使用二进制堆数据结构的其他应用程序吗?二进制堆可用于在O(lo

优先级队列是一种抽象数据类型,类似于常规队列或堆栈数据结构,但每个元素都有一个与其关联的“优先级”。在优先级队列中,高优先级的元素在低优先级的元素之前被服务。如果两个元素具有相同的优先级,则根据它们在队列中的顺序提供服务

实施: 为了实现优先级队列,非排序数组、排序数组和二进制堆数据结构是3种实现策略

具体来说,二进制堆实现策略可以使用密钥数组表示

每个键作为二进制节点,有两个子节点


问题:


除了优先级队列实现之外,它们还有使用二进制堆数据结构的其他应用程序吗?

二进制堆可用于在O(logn)时间内提取(max或min)元素。可以利用此属性在许多算法中使用,以获得更好的运行时间

例如,有一次我在k-merge排序算法中使用它来提高k-merge排序步骤的时间效率。简单地说,它对k子数组进行了二进制堆,并且可以在线性时间内实现排序,这比合并排序的常规排序步骤要好

它还用于Dijkstra算法和Prim算法,以减少它们的运行时间


您还可以看看二进制堆还有一个有用的(也是主要的)应用程序:HeapSort。HeapSort的开销比QuickSort要高,但最糟糕的情况是O(n logn)与QuickSort的O(n*n)。在间隔足够短的情况下,通过切换到堆排序,可以改进快速排序,以获得最坏的O(n log n)。这称为“内排序”,并且是在STL和C++标准库中使用的。请参见

另请参见堆排序。不完全如此。甚至可以说,heapsort也只是填充了一个优先级队列,然后按顺序完成任务。二进制堆是一个优先级队列。更重要的问题是优先级队列的应用程序是什么,其中哪些应用程序最好用二进制堆实现,哪些应用程序应该使用其他优先级队列实现。1。请为您从中复制的源提供适当的属性。看见2.要求列出二进制堆的所有应用程序可能太广泛了。3.你做了什么研究?你看过数据结构教科书,看看它们对堆做了什么吗?“不是真的。”——是的,真的。“即使是希普索尔,也可以说,只是填充了一个优先级队列,然后按顺序把事情搞定。”——没有得到有效的论证。HeapSort排序——这就是应用程序。它在内部使用堆是重言式的。使用HeapSort的原因不是因为它内部有一个堆,而是因为它的性能特征。请看@JimBalter:我想你是说Heapsort是一个独立的应用程序,因为“优先级队列排序”不会那么快;堆的性能特征(特别是在O(n)中重新排列数组以构建二进制堆的能力)使得使用二进制堆优于仅使用任何旧的优先级队列。这就是你说的吗?你不能在固定时间内从二进制堆中提取元素。delete min是一个O(logn)操作。此外,OP要求使用二进制堆,而不是实现优先级队列。所有三个示例(合并排序、Dijkstra算法、Prim算法)都基于优先级队列。二进制堆只是一个方便的实现。我更正了我的答案。谢谢你指出这一点。我试图列出二进制堆的几种用法。我没有谈论实施。如果您有任何不使用二进制堆作为优先级队列的情况,那么欢迎您留下评论。我很乐意了解。“提取(max或min)元素”——这实际上是优先级队列的定义,所以您还没有回答这个问题,正如@JimMischel所指出的。“如果您在任何情况下不使用二进制堆作为优先级队列”-您可以将其反向使用。有几种方法可以在不使用堆的情况下实现优先级队列。。。OP提到了排序和未排序的数组,还有许多其他数组。问题是二进制堆是否适合其他用途。请看我的答案。。。一个真实的答案。编辑:我想也许你没有倒着写,只是措词不当。@JimBalter我在你的回答中看到,你认为heapsort是二进制堆的一个很好的应用。所以你认为heapsort算法没有使用从树中提取最小/最大元素的特性?它不仅仅在内部使用二进制堆作为优先级队列吗?我不太明白你的意思。@CODError“那么你认为heapsort算法没有使用从树中提取最小/最大元素的属性?”--不,我不这么认为。“我真的不明白你的观点”——我在OP问题下的评论中解释了这一点。提取最小/最大值不是使用HeapSort的原因。。。原因完全在于其性能特点。如果有人发现了具有相同性能特征的完全不同的算法,则可以使用它们。