我正在尝试实现一个堆定义的优先级队列,该算法来自CLRS书籍第6章。 伪代码如下:
Max_Heap_Insert(A, key):
A.heap_size = A.heap_size + 1
A[A.heap_size] = -∞
Heap_Increase_Key(A, A.heap_size, key)
我的问题是,使用python,如何定义-∞?
Python 具有特殊值
float('inf')
和 float('-inf')
。
碰巧,在 Python 2 中,
None
小于任何整数,因此您可以使用 None
。在 Python 3 中,你(至少)有四种选择:
None
,每当您比较两个值时,明确测试它们是否为 None
。Heap-Increase-Key
。我在自己进行堆实现时偶然发现了这一点。 :)
从 Python 3.5 开始,您可以使用 math 模块中的 inf 常量
from math import inf
inf + inf # inf
inf - inf # nan
inf / inf # nan
inf * inf # inf
max(list(range(1_000_000)) + [inf]) # inf
min(list(range(-1_000_000, 1)) + [-inf]) # -inf
我不知道这一点,并使用自定义类来实现相同的排序属性
class MinusInf:
def __gt__(self, other):
return False
def __ge__(self):
return False
def __lt__(self, other):
return True
def __le__(self, other):
return True
def __eq__(self, other):
return False
minus_inf = MinusInf()
minus_inf >= -1_000_000 # False
这适用于堆,但推荐的方法是仅使用
math.inf
(或 numpy.inf
,它是 numpy 中的 inf 常量)。
使用数学库,您可以:
import math
a = -math.inf
对于
float
类型:
import sys
import math
import numpy as np
import torch
print(float('-inf')) # -inf
print(float('-infinity')) # -inf
print(-1.7976931348623157e+309) # -inf
print(-sys.float_info.max * 2) # -inf
print(sys.float_info.max * -2) # -inf
print(-math.inf) # -inf
print(-np.inf) # -inf
print(-torch.inf) # -inf
对于
complex
类型:
print(complex('-inf-infj')) # (-inf-infj)
print(complex('-infinity-infinityj')) # (-inf-infj)
print(complex('-inf+infj')) # (-inf+infj)
print(complex('-infinity+infinityj')) # (-inf+infj)
print(complex('inf-infj')) # (inf-infj)
print(complex('infinity-infinityj')) # (inf-infj)
print(complex('-inf')) # (-inf+0j)
print(complex('-inf+0j')) # (-inf+0j)
print(complex('-infinity')) # (-inf+0j)
print(complex('-infinity+0j')) # (-inf+0j)
print(-1.7976931348623157e+309+1.7976931348623157e+309j) # (-inf+infj)
print(-1.7976931348623157e+309-1.7976931348623157e+309j) # (-inf-infj)
对于
decimal.Decimal
类型:
from decimal import Decimal
print(Decimal('-inf')) # -Infinity
print(Decimal('-infinity')) # -Infinity