如何在python中实现负无穷大?

时间:2013-01-10 16:57:46

标签: python algorithm numbers

我正在尝试实现Heap定义的优先级队列,该算法来自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,我该如何定义-∞?

3 个答案:

答案 0 :(得分:9)

Python具有特殊值float('inf')float('-inf')

答案 1 :(得分:3)

实际上,在Python 2中,None小于任何整数,因此您可以使用None。在Python 3中,你有(至少)四种选择:

  1. 使用min(A) - 1。
  2. 使用None,每当您比较两个值时,请明确测试它们为None
  3. 定义一个由整数或-∞组成的新数据类型,并正确处理比较。
  4. 修改算法以消除第2行。您将不得不以某种方式修补Heap-Increase-Key

答案 2 :(得分:0)

我在自己处理堆实现时偶然发现了这个问题。 :)

从 Python 3.5 开始,您可以使用数学模块中的 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 常量)。