锦标赛排序之使用n+lgn-2次比较来选出第二小的元素

本文介绍了一种算法,用于在未排序数组中找到第二小的元素,包括数据输入、数组排序过程及寻找第二小元素的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
 * FindSecondElement.c
 *
 *  Created on: 2011-10-13
 *      Author: kontrol
 */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAX 1000

struct Node
{
    int data;
    struct Node * lchild;
    struct Node * rchild;
    _Bool tag;
};

int upper(int n, int div) //求上整数
{
    float r = (float)n/div;
    if(r == n/div)
        return r;
    else return n/div + 1;
}

void findSecondElement(int a[], int length)
{
    struct Node* elements = (struct Node*)malloc(length * sizeof(struct Node));
    memset((void *)elements, 0 , length * sizeof(struct Node));
    int j = 0;
    while(j<length)
    {
        elements[j].data = a[j];
        j++;
    }
    struct Node * p = elements;
    int count = length;
    while(count > 0) //退出循环的条件比较难写
    {
        if(count == 1) break;
        int i = 0;
        struct Node* upperLayer = (struct Node *)malloc(upper(count, 2) * sizeof(struct Node));
        while(i+1<count)
        {
            if(p[i].data < p[i+1].data)
            {
                upperLayer[i/2].data = p[i].data;
                upperLayer[i/2].lchild = p + i;
                upperLayer[i/2].rchild = p+ i +1;
                upperLayer[i/2].tag = 1;
            }
            else
            {
                upperLayer[i/2].data = p[i+1].data;
                upperLayer[i/2].rchild = p + i + 1;
                upperLayer[i/2].lchild = p + i;
                upperLayer[i/2].tag = 0;
            }
            i += 2;
        }
        if(i+1 == count)//说明原来那一层是基数个元素
        {
            upperLayer[upper(count, 2)-1].data = p[i].data;
            upperLayer[upper(count, 2)-1].lchild = p + i;
            upperLayer[upper(count, 2)-1].rchild = 0;
            upperLayer[upper(count, 2)-1].tag = 1;
        }
        p = upperLayer;
        count = upper(count, 2);
    }
    printf("the minumin element is %d\n", p->data);
    printf("the second minumin element is: ");
   int secondMin = 0;
if (p->tag)
{
secondMin = p->rchild->data;
p = p->lchild;
}
else 
{
secondMin = p->lchild->data;
p = p->rchild;
}
while(p->rchild && p->lchild)
{
if (p->tag)
{
if(p->rchild->data < secondMin )
secondMin = p->rchild->data;
p = p->lchild;
}
else 
{
if(p->lchild->data < secondMin )
secondMin = p->lchild->data;
p = p->rchild;
}
}

printf("%d", secondMin);
}

int main()
{
    puts("please input the scale of data:");
    int length = 0;
    scanf("%d", &length);
    int* a = (int *)malloc(length * sizeof(int));
    srand(time(0));
    int i=0;
    puts("the array is:");
    for(;i<length;i++)
    {
        a[i] = rand()%MAX;
        printf("%d ", a[i]);
    }
    printf("\n");
    findSecondElement(a, length);
    return 0;
}



所出现的问题:

1:退出大循环的时候,由于count  = upper(count, 2),所以当count=1的时候就会有count一直等于1;这样就不能退出循环了。

2:最后寻找第二小的元素的时候,搞的乱七八糟的,因为自己老是不能知道退出循环的条件,开始些的是while(p),这样的话p->lchild和p->rchild会指向空指针,导致错误,因此一直没有调试对!

3:如果程序段不长的话,我想还是最好重新写一下,这样比盲目的调试更有效!


关于LGN-Net的具体信息并未在当前提供的引用材料中提及。然而,基于深度学习网络的一般特性以及相关领域的发展趋势,可以推测并提供一些可能的信息。 ### LGN-Net 的定义与背景 LGN-Net 可能是一种专注于局部全局特征融合的神经网络架构,通常用于计算机视觉中的目标检测、分割或其他复杂任务。尽管未找到具体的描述,但类似的网络设计往往通过结合局部细节和全局上下文来提升性能[^1]。这种类型的网络广泛应用于图像分类、物体识别等领域,并且其核心思想在于有效提取多层特征。 ### 结构特点 假设 LGN-Net 是一种典型的卷积神经网络 (CNN),它可能会采用以下几种常见组件: #### 1. 局部特征提取模块 此部分主要由多个卷积层组成,负责捕捉输入数据中小范围内的纹理或边缘等低级特征。 ```python import torch.nn as nn class LocalFeatureExtractor(nn.Module): def __init__(self): super(LocalFeatureExtractor, self).__init__() self.conv1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, stride=1, padding=1) self.relu = nn.ReLU() def forward(self, x): return self.relu(self.conv1(x)) ``` #### 2. 全局上下文感知机制 为了增强模型对于整体布局的理解能力,引入注意力机制或者池化操作获取更广泛的视野。 ```python class GlobalContextModule(nn.Module): def __init__(self): super(GlobalContextModule, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d((1, 1)) def forward(self, x): global_feature = self.avg_pool(x).expand_as(x) combined_features = x * global_feature return combined_features ``` #### 3. 融合策略 最后一步则是将上述两方面所得结果加以综合处理,形成最终表示向量供后续决策使用。 ```python class FusionLayer(nn.Module): def __init__(self): super(FusionLayer, self).__init__() def forward(self, local_feat, global_context): fused_output = torch.cat([local_feat, global_context], dim=1) return fused_output ``` 以上仅为理论框架示意代码片段,实际应用时需依据具体需求调整参数配置及优化方案。 ### 使用指南 如果打算部署此类预训练好的模型,则建议遵循官方文档指示安装相应环境依赖项之后加载权重文件即可快速上手测试效果;而对于定制开发版本来说则需要经历完整的实验流程包括但不限于数据准备、超参调优直至评估验证环节结束为止才能得出满意成果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值