我已经创建并工作了一个优先级队列,该队列按顺序输入项目并按顺序删除它们。即使两个数字具有相同的优先级,也会删除第一个输入的数字。
如果有三个具有相同优先级的数字,则不会删除第一个数字。我将如何去做,还是应该去做?
public void deQueue(Animal item)
{
item = items.elements[0];
items.elements[0] = items.elements[numItems - 1];
numItems--;
items.ReheapDown(0, numItems - 1);
}
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);
}
}
}
答案 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 方法是在比较中添加第二个条件-从根本上讲,您必须使这些相等项目不相等。您需要在密钥上添加日期戳或序列号,以便标识插入顺序。