算法导论第六章 堆排序

主要内容:

堆、最大堆、最小堆的基本概念

堆的操作:调整、创建、排序

采用堆实现优先级队列

基本概念

heap)亦被称为:优先队列priority queue

逻辑定义:

n个元素序列{k1,k2...ki...kn},当且仅当满足下列关系时称之为堆:

(ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4...n/2)

堆的实现通过构造二叉堆(binary heap),实为二叉树的一种。

性质

1、任意节点小于或大于它的所有后裔,最小元或最大元在堆的根上(堆序性)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。

2、堆总是一棵完全树。堆只需要满足父节点大于两个子节点,而子节点之间没有要求。作为一颗完全树,一层中的节点是从左到右填满的。如果一个节点没有左儿子,那么它一定没有右儿子。并且在第h层中如果存在节点,那么第h-1层必须是填满的。

堆的操作

调整堆

void adjust_max_heap_recursive(int *datas, int length, int i)//递归调用,最大堆调整

{

    int left,right,largest;

    int temp;

    left = LEFT(i);//left child

    right = RIGHT(i);//right child

    //find the largest value among left and right and i

    if(left<=length && datas[left]>datas[i]) largest = left;

    else largest = i;

    if(right <= length && datas[right] >datas[largest]) largest = right;

    //exchange i and largest

    if(largest != i)

    {

        temp = datas[i];

        datas[i] = datas[largest];

        datas[largest] = temp;

        //recursive call the function, adjust from largest

        adjust_max_heap(datas, length, largest);

    }

}

void adjust_max_heap(int *datas,int length,int i)//非递归调用,最大堆调整
{
    int left,right,largest;
    int temp;
    while(1)
    {
        left = LEFT(i);   //left child
        right = RIGHT(i); //right child
        //find the largest value among left and rihgt and i.
        if(left <= length && datas[left] > datas[i])
            largest = left;
        else
            largest = i;
        if(right <= length && datas[right] > datas[largest])
            largest = right;
        //exchange i and largest
        if(largest != i)
        {
            temp = datas[i];
            datas[i] = datas[largest];
            datas[largest] = temp;
            i = largest;
            continue;
        }
        else
            break;
    }
}

创建堆

思路:逐个加入元素,调整为最大堆或最小堆,直到将所有的元素全部处理完。

void build_max_heap(int *datas,int length)//创建最大堆
{
    int i;
    //build max heap from the last parent node
    for(i=length/2;i>0;i—)//从最后一个非叶子节点(n/2)开始到第一个非叶子(1)结束
        adjust_max_heap(datas,length,i);
}

堆排序

思路:创建堆,然后从后往前调整堆。

void heap_sort(int *datas,int length)
{
    int i,temp;
    //bulid max heap
    build_max_heap(datas,length);//创建最大堆
    i=length;
    //exchange the first value to the last unitl i=1
    while(i>1)
    {
        temp = datas[i];
        datas[i] = datas[1];
        datas[1] =temp;
        i--;
        //adjust max heap,make sure the fisrt value is the largest
        adjust_max_heap(datas,i,1);
    }
}

堆排序算法时间复杂度:调整堆过程满足递归式T(n)<=T(2n/3)+θ(1),有master定义可以知道T(n) = O(lgn),堆排序过程中执行一个循环,调用最大堆调整函数,总的时间复杂度为O(nlgn)。

优先级队列

优先级队列有两种:最大优先级队列和最小优先级队列,这两种类别分别可以用最大堆和最小堆实现。

优先级队列操作(最大优先级队列--最大堆)

插入:返回最大(优先级)元素:返回最大堆的第一个元素

最大(优先级)元素出队:删除最大堆的第一个元素,然后把最后一个移动到第一个位置,从第一个位置开始调整堆。

提高优先级:增加优先级,然后从该节点父节点开始向上调整堆。

入队:插入堆尾部,然后从该节点父节点开始向上调整堆。

优先级队列应用

实现FIFO队列:优先级递增

实现FILO:优先级递减

转载于:https://www.cnblogs.com/lucas-hsueh/p/3732155.html

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 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、付费专栏及课程。

余额充值