当前位置: 首页 > news >正文

算法设计与分析 作业 算法实现 1

问题描述

最大间隙问题。给定 n 个实数x1 , x2 ,…,xn,求这n个 实数在数轴上相邻2个数之间的最大差值。

直观解法:将n个数排序后计算间距,再找最大值。 假设对任何实数的下取整函数耗时O(1), 设计解最大间隙问题的线性时间算法。

算法输入: 输入数据由文件名input.txt的文本提供。文件的第一 行有一个正整数n,接下来有n个实数。

算法输出: 将找到的最大间隙输出到文件output.txt中。

设:

  • 最小值 minv
  • 最大值 maxv
  • n 个实数

则整体区间长度为:

range = maxv - minv

如果把区间分成 n-1 个桶(bucket),
每个桶宽度:

gap = range / (n - 1)

由于最大间隙必然发生在 相邻非空桶 之间(而非桶内),
我们只需要每个桶记录:

  • 桶最小值
  • 桶最大值
    (空桶跳过)

然后:

max_gap = max(next_bucket.min - prev_bucket.max )

1️⃣ 扫描一次找到 minvmaxv

2️⃣ 若所有数相等,最大间隙为 0

3️⃣ 计算桶宽度:

gap = (maxv - minv) / (n - 1)

4️⃣ 建立 n−1 个桶,每个桶记录:

struct Bucket {
bool used = false;
double minval = std::numeric_limits<double>::infinity();
double maxval = -std::numeric_limits<double>::infinity();
};

5️⃣ 遍历每个数 x

if (x == maxv) idx = n - 2; // 特殊处理最大值
else idx = int((x - minv) / gap);

更新该桶的 minvalmaxval

6️⃣ 再遍历桶,计算最大间隙:

max_gap = max(curr.minval - prev.maxval)

7️⃣ 源码

#include <iostream>
#include <fstream>
#include <vector>
#include <limits>
#include <cmath>struct Bucket {bool used = false;double minval = std::numeric_limits<double>::infinity();double maxval = -std::numeric_limits<double>::infinity();
};int main() {std::ifstream fin("input.txt");if (!fin) {std::cerr << "Error: cannot open input.txt\n";return 1;}int n;fin >> n;if (n <= 1) {std::ofstream("output.txt") << 0.0;return 0;}std::vector<double> nums(n);for (int i = 0; i < n; ++i)fin >> nums[i];fin.close();double minv = nums[0], maxv = nums[0];for (double x : nums) {if (x < minv) minv = x;if (x > maxv) maxv = x;}if (minv == maxv) {std::ofstream("output.txt") << 0.0;return 0;}double gap = (maxv - minv) / (n - 1);std::vector<Bucket> buckets(n - 1);for (double x : nums) {int idx = (x == maxv) ? (n - 2) : int((x - minv) / gap);auto &b = buckets[idx];b.used = true;if (x < b.minval) b.minval = x;if (x > b.maxval) b.maxval = x;}double max_gap = 0;double prev_max = minv;for (const auto &b : buckets) {if (!b.used) continue;max_gap = std::max(max_gap, b.minval - prev_max);prev_max = b.maxval;}std::ofstream fout("output.txt");fout << max_gap;fout.close();return 0;
}
http://www.dtcms.com/a/453736.html

相关文章:

  • 控制高血压的穴位按摩
  • 从零开始实现一个高并发内存池_DayThree:内存池整体框架与ThreadCache、TLS无锁访问
  • 网站维护费用计入什么科目怎么申请小程序
  • CCF编程能力等级认证GESP—C++5级—20250927
  • 电子商务网站建设规划说明书美食网站二级页面模板
  • 养殖舍建设网站网站建设哈尔滨app开发2
  • 在JavaScript / HTML中,词内断行
  • 做外汇有哪些正规的网站门户网站兴化建设局 金
  • SOLIDWORKS VBA 自学笔记017、根据指定模板创建新文档(代码示例)
  • Python set() 函数
  • 营销型网站套餐国家优质校建设网站
  • 外贸易贷朝阳区seo技术
  • TigerVNC 教程
  • 掌握GPIO基于GD32F407VE的天空星的输入输出控制
  • 九【Python新手入门指南】极速搭建Python开发环境s
  • 四川成都企业高端网站建设一站式的手机网站制作
  • 【LeetCode热题100(36/100)】二叉树的中序遍历
  • 企业建立网站的必要性画网页前端界面的软件
  • Docker 基础命令的 6 大核心模块
  • 十大购物网站产品50个关键词
  • Kiln AI:重新定义AI系统构建的全栈开源平台深度解析
  • 测试epoll、io_uring的百万连接、建连、qps,以及qps客户端的实现
  • 做游戏女角色去衣的网站网站名 注册
  • Rust中所有权和作用域及生命周期
  • 外贸网站啥需要掌握在自己手里中企动力手机邮政登录
  • 二维码制作网站有哪些618网络营销策划方案
  • 【论文学习】2025年图像处理顶会论文
  • 【MyBatis】——执行过程
  • 修改配置文件之后,重启edge浏览器收藏夹消失怎么办?
  • 网站推广优化外包公司个人网站设计开题报告