Priority Queue删除优先级相同的项目,首先输入

时间:2019-02-26 20:48:27

标签: c# queue priority-queue

我已经创建并工作了一个优先级队列,该队列按顺序输入项目并按顺序删除它们。即使两个数字具有相同的优先级,也会删除第一个输入的数字。

如果有三个具有相同优先级的数字,则不会删除第一个数字。我将如何去做,还是应该去做?

出队功能:

public void deQueue(Animal item)
{
    item = items.elements[0];
    items.elements[0] = items.elements[numItems - 1];
    numItems--;
    items.ReheapDown(0, numItems - 1);
}

ReheapDown函数:

public void ReheapDown(int root, int bottom)
{
    int maxchild, rightchild, leftchild;
    leftchild = root * 2 + 1;
    rightchild = root * 2 + 2;

    if (leftchild <= bottom)
    {
        if (leftchild == bottom)
            maxchild = leftchild;
        else
        {
            if (elements[leftchild].priority <= elements[rightchild].priority)
                maxchild = rightchild;
            else
                maxchild = leftchild;
        }

        if (elements[root].priority < elements[maxchild].priority)
        {
            Swap(elements, root, maxchild);
            ReheapDown(maxchild, bottom);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

在这一行

if (elements[leftchild].priority <= elements[rightchild].priority)

如果元素相等,则交换元素。假设您以该顺序输入数字[2, 2, 1, 3]。我们将第二个2称为“ 2*”,以区别于第一个 1 / \ 2 2* / 3 。产生的堆为:

1

现在,您删除1。因此,您将3替换为 3 / \ 2 2*

ReheapDown

在您的2方法中,父级有两个孩子,您正在选择最小的孩子。比较两个if (elements[leftchild].priority <= elements[rightchild].priority) maxchild = rightchild; else maxchild = leftchild; 时,您将获得以下代码:

2 == 2

maxchild = rightchild起,它将设置2*,因此新的根成为2 -输入的第二个 2* / \ 2 3 。您的堆现在看起来像这样:

2*

接下来要删除的是<=

那么,您可能会认为,如果将<更改为[1, 3, 2, 2*],它将解决您的问题。但这不会。

当您考虑堆可以进行变异的所有不同方式时,除非提供其他信息,否则不可能保证相等的项将按照插入时的相同顺序被删除。请考虑如果您按 1 / \ 2* 2 / 3 的顺序输入项目会发生什么。产生的堆为:

1

如果您删除 3 / \ 2* 2 ,则会得到以下结果:

<=

在这种情况下,C:\Python>python Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import netmiko Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python\Lib\site-packages\netmiko\__init__.py", line 8, in <module> from netmiko.ssh_dispatcher import ConnectHandler File "C:\Python\Lib\site-packages\netmiko\ssh_dispatcher.py", line 4, in <module> from netmiko.a10 import A10SSH File "C:\Python\Lib\site-packages\netmiko\a10\__init__.py", line 2, in <module> from netmiko.a10.a10_ssh import A10SSH File "C:\Python\Lib\site-packages\netmiko\a10\a10_ssh.py", line 4, in <module> from netmiko.cisco_base_connection import CiscoSSHConnection File "C:\Python\Lib\site-packages\netmiko\cisco_base_connection.py", line 3, in <module> from netmiko.base_connection import BaseConnection File "C:\Python\Lib\site-packages\netmiko\base_connection.py", line 21, in <module> import paramiko File "C:\Python\Lib\site-packages\paramiko\__init__.py", line 22, in <module> from paramiko.transport import SecurityOptions, Transport File "C:\Python\Lib\site-packages\paramiko\transport.py", line 90, in <module> from paramiko.ed25519key import Ed25519Key File "C:\Python\Lib\site-packages\paramiko\ed25519key.py", line 17, in <module> import bcrypt File "C:\Python\Lib\site-packages\bcrypt\__init__.py", line 25, in <module> from . import _bcrypt ModuleNotFoundError: No module named '_cffi_backend' 将为您提供帮助。但是在以前的情况下,不会。

保证相同项目的移除顺序的 only 方法是在比较中添加第二个条件-从根本上讲,您必须使这些相等项目不相等。您需要在密钥上添加日期戳或序列号,以便标识插入顺序。