python cookbook 学习笔记 第一章 数据结构和算法(4)实现一个优先级队列

  • 实现一个优先级队列
  • 问题:
    • 怎样实现一个按优先级排序的队列?兵器在这个队列上面每次 pop 操作总返回优先级最高的那个元素
  • 解决方案:
    • 下面利用 heapq 模块实现一个简单的优先级队列:
import heapq

class PriorityQueue(object):

    def __init__(self):
        self._queue = list()
        self._index = 0
    
    def push(self,item,priority):
        heapq.heappush(self._queue,(-priority,self._index,item))
        self._index += 1
    
    def pop(self):
        return heapq.heappop(self._queue)[-1]
  • 下面是它的使用方式:
class Item(object):

    def __init__(self,name):
        self.name = name
    
    def __repr__(self):
        return "Item({!r})".format(self.name)

q = PriorityQueue()

q.push(Item("foo"),1)
q.push(Item("bar"),5)
q.push(Item("spam"),4)
q.push(Item("grok"),1)

print(q.pop())
print(q.pop())
print(q.pop())
print(q.pop())
  • 仔细观察发现,第一个pop()操作返回优先级最高的元素,另外注意到如果连个有着相同优先级的元素 pop操作按照他们被插入到队列的顺序返回的。
  • 讨论:这一节我们主要关注 heapq模块的使用。函数 heapq.heappush() 和 heapq.heappop() 分别在队列_queue上插入和删除第一个元素,并且队列_queue保证第一个元素拥有最小的优先级。 heappop()函数总是返回"最小"的元素,这是保证队列pop操作返回正确元素的关键。另外,由于push 和pop操作时间复杂度为0(logN),其中N是堆的大小,因此就算N很大的时候,他们的运行速度也很快。 上面代码中,队列包含了一个(-priority,index,item)的元组。优先级为负数的目的是使元素按照 优先级从高到低排序。这个跟普通的优先级从低到高排序的堆排序恰巧相反。 index变量的作用是保证同优先级元素的正确顺序。通过保存一个不断增加的index下标变量,可以确保 元素按照它们插入的顺序排序。而且,index变量也在相同优先级比较的时候起到重要的作用。
  • 为了阐明这些,先假定Item实例是不支持排序的:
a = Item("foo")
b = Item("bar")
print(a < b)

# 上面的程序会报错
  • 如果使用元组(priority,item),只要连个元素的优先级不同就能比较。但是两个元组的优先级一样 的话,那么比较操作就会跟之前一样出错:
a = (1,Item("foo"))
b = (5,Item("bar"))
print(a < b)    #---> True

c = (1,Item("grok"))
print(a < c)
  • 通过引入另外的index变量组成三元组(priority,index,item),就能很好的避免上面的错误,因为 不可能有两个元素有相同的index值。python在做元组比较时,如果前面的比较已经可以确定结果了, 后面的操作就不会发生了:
a = (1, 0, Item("foo"))
b = (5, 1, Item("bar"))
c = (1, 2, Item("grok"))
print(a < b)
print(a < c)
  • 如果想在多个线程中使用同一个队列,那么需要增加适当的线程锁和信号量机制。
深度学习是机器学习一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值