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

问题描述 投票:0回答:5

我正在尝试实现一个堆定义的优先级队列,该算法来自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 algorithm numbers
5个回答
69
投票

Python 具有特殊值

float('inf')
float('-inf')


6
投票

碰巧,在 Python 2 中,

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

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

3
投票

我在自己进行堆实现时偶然发现了这一点。 :)

从 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 常量)。


1
投票

使用数学库,您可以:

import math

a = -math.inf

0
投票

对于

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
© www.soinside.com 2019 - 2024. All rights reserved.