ZOJ 3499. Median

简介:     地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4322     题意:寻找中位数。对于一个(浮点数)数组,如果含有奇数个元素,“中位数”就是排序后位于数组中间那个。

    地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4322

    题意:寻找中位数。对于一个(浮点数)数组,如果含有奇数个元素,“中位数”就是排序后位于数组中间那个。如果含有偶数个元素,“中位数”是排序后数组中间那两个元素的平均值。

    

    此题应该是直接取自《算法导论》第9章(中位数和顺序统计学)的命题。如果对数组排序,再得出中位数,时间复杂度是 O(n log n) ,但这样的效率不高。对于这个命题不需要排序,算法导论的 9.2 节给出平均情况为 O(n)的方法,代码类似快排,其最差情况是 O(n^2),但由于对数组随机选取一个点作为分割点,所以最差情况几乎不可能发生。第 9.3 节给出一种最差情况也能达到线性时间的方法,但编码实现比较麻烦。书中也没有给出伪码。以下代码是第 9.2 节中的方法:

 

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

double nums[500];

void exchange(double* A, int i, int j)
{
    double tmp;
    if(i != j)
    {
        tmp = A[i];
        A[i] = A[j];
        A[j] = tmp;
    }
}

/* 以A中最后一个元素作为分割点,把A就地划为为两个子序列 */
int fix_partition(double* A, int begin, int end)
{
    double x = A[end];
    int i = begin - 1, j;
    for(j = begin; j < end; j++)
    {
        if(A[j] <= x)
        {
            i++;
            exchange(A, i, j);
        }
    }
    exchange(A, i+1, end);
    return i + 1;
}

/* 从A中随即取一个元素作为分割点,把A就地划为为两个子序列 */
int random_partition(double* A, int begin, int end)
{
    int i = rand() % (end - begin + 1) + begin;
    exchange(A, i, end);
    return fix_partition(A, begin, end);
}

/* 返回数组 A[begin, ..., end] 中第 i 小的数字,即排序后的 A[begin + i -1]  */
double random_select(double* A, int begin, int end, int i)
{
    if(begin == end)
        return A[begin];

    int q = random_partition(A, begin, end);
    int k = q - begin + 1;
    
    if(i == k)
    {
        return A[q];
    }
    else if(i < k)
    {
        return random_select(A, begin, q-1, i);
    }
    else
    {
        return random_select(A, q+1, end, i-k);
    }
}


int main(int argc, char* argv[])
{
    int i, j;
    int T, n;
    scanf("%ld", &T);
    double result;
    for(i = 0; i < T; i++)
    {
        scanf("%ld", &n);
        for(j = 0; j < n; j++)
            scanf("%lf", nums + j);

        if(n & 1)
        {
            result = random_select(nums, 0, n-1, n/2+1);
        }
        else
        {
            result = random_select(nums, 0, n-1, n/2);
            result += random_select(nums, 0, n-1, n/2+1);
            result *= 0.5;
        }
        printf("%.3lf\n", result);
    }
    return 0;
}

 

    参考资料:

    (1)《算法导论》第9章,中位数和顺序统计学。

目录
相关文章
|
存储 算法 网络协议
分布式文件系统介绍与minio介绍与使用(附minio java client 使用)(二)
分布式文件系统介绍与minio介绍与使用(附minio java client 使用)
1349 0
|
JSON NoSQL MongoDB
一幅长文细学MongoDB(三)——数据库操作
本文讲述了如何对MongoDB进行一些简单的操作
260 1
|
18天前
|
人工智能 JSON 供应链
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
LucianaiB分享零成本畅用JVS Claw教程(学生认证享7个月使用权),并开源GeoMind项目——将JVS改造为科研与产业地理情报可视化AI助手,支持飞书文档解析、地理编码与腾讯地图可视化,助力产业关系图谱构建。
23535 12
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
|
6天前
|
Shell API 开发工具
Claude Code 快速上手指南(新手友好版)
AI编程工具卷疯啦!Claude Code凭借任务驱动+终端原生的特性,成了开发者的效率搭子。本文从安装、登录、切换国产模型到常用命令,手把手带新手快速上手,全程避坑,30分钟独立用起来。
1853 12
|
3天前
|
人工智能 开发工具 iOS开发
Claude Code 新手完全上手指南:安装、国产模型配置与常用命令全解
Claude Code 是一款运行在终端环境中的 AI 编程助手,能够直接在命令行中完成代码生成、项目分析、文件修改、命令执行、Git 管理等开发全流程工作。它最大的特点是**任务驱动、终端原生、轻量高效、多模型兼容**,无需图形界面、不依赖 IDE 插件,能够深度融入开发者日常工作流。
1285 1
|
5天前
|
人工智能 JSON BI
DeepSeek V4-Pro 接入 Claude Code 完全实战:体验、测试与关键避坑指南
Claude Code 作为当前主流的 AI 编程辅助工具,凭借强大的代码理解、工程执行与自动化能力深受开发者喜爱,但原生模型的使用成本相对较高。为了在保持能力的同时进一步降低开销,不少开发者开始寻找兼容度高、价格更友好的替代模型。DeepSeek V4 系列的发布带来了新的选择,该系列包含 V4-Pro 与 V4-Flash 两款模型,并提供了与 Anthropic 完全兼容的 API 接口,理论上只需简单修改配置,即可让 Claude Code 无缝切换为 DeepSeek 引擎。
1317 0
|
12天前
|
人工智能 缓存 Shell
Claude Code 全攻略:命令大全 + 实战工作流(完整版)
Claude Code 是一款运行在终端环境下的 AI 编码助手,能够直接在项目目录中理解代码结构、编辑文件、执行命令、执行开发计划,并支持持久化记忆、上下文压缩、后台任务、多模型切换等专业能力。对于日常开发、项目维护、快速重构、代码审查等场景,它可以大幅减少手动操作、提升编码效率。本文从常用命令、界面模式、核心指令、记忆机制、图片处理、进阶工作流等维度完整说明,帮助开发者快速上手并稳定使用。
2858 4
|
3天前
|
人工智能 JSON BI
Claude Code 搭配 DeepSeek V4-Pro 完整测评:超越 Claude Sonnet 4.5,低成本高效能背后的真实表现
Claude Code 凭借强大的代码理解、工程执行与自动化任务能力,成为开发者广泛使用的 AI 编程工具。但原生模型的调用成本较高,长期高频使用会带来明显开销。DeepSeek V4 系列模型发布后,凭借优秀的代码能力与兼容 Anthropic 协议的 API 接口,成为替代原生模型的高性价比选择。本文完整记录将 Claude Code 对接 DeepSeek V4-Pro 的配置流程、真实任务测试效果、优势亮点与必须注意的使用限制,为开发者提供可直接落地的参考方案。
875 2

热门文章

最新文章