1
1
NanoTurtle的小窝

数据分析程序设计

摘要生成中
AI生成,仅供参考

该程序适用于数据分组,即分出组内离差平方和最小的2组

感谢同学开源。

背景

在《义务教育教科书 数学 八年级下册》(浙江教育出版社)的第78页出现了特别猎奇的题目:

To solve the problem,神人同学使用了十分牛逼,牛逼上天的C++编写了一个符合教科书中要求的程序。

程序设计

/*
用于计算如下问题:
给定一组数据x1,x2,...,xn
把这组数据分成两组,使组内离差平方和最小。 
先输入n,再输入n个数,就可找出最优分组方案和对应的组内离差平方和 
*/
#include<bits/stdc++.h>
using namespace std;

#define N 109
int n;
double a[N],sum[N];

int main()
{
	scanf("%d",&n);
	sum[0] = 0;
	for(int i=1;i<=n;i++)
	{
		scanf("%lf",&a[i]);
	}
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++)
		sum[i] = sum[i-1] + a[i];
	double x=1.0*sum[n]/n;
	double d=0;
	for(int i=1;i<=n;i++)
	{
		d += 1.0*(a[i]-x)*(a[i]-x);
	}
	printf("x=%.2lf D^2=%.2lf\n",x,d);
	// 把前i个分成一组,剩余的分成另一组 
	double mn=1145141919810,ans;
	for(int i=1;i<=n-1;i++)
	{
		double x1=1.0*sum[i]/i,x2=1.0*(sum[n]-sum[i])/(n-i);
		double d12=d-1.0*i*(x1-x)*(x1-x)-1.0*(n-i)*(x2-x)*(x2-x);
		if(d12<mn)
		{
			mn=d12;
			ans = i;
		}
		for(int j=1;j<=i;j++)
		{
			if(j<i) printf("%.2lf ",a[j]);
			else printf("%.2lf",a[j]);
		}
		printf("|");
		for(int j=i+1;j<=n;j++)
		{
			printf("%.2lf ",a[j]);
		}
		printf(" %.2lf\n",d12);
	}
	printf("\n最优分组方案:\n"); 
	for(int i=1;i<=ans;i++)
	{
		if(i<ans) printf("%.2lf ",a[i]);
		else printf("%.2lf",a[i]);
	}
	printf("|");
	for(int i=ans+1;i<=n;i++)
	{
		printf("%.2lf ",a[i]);
	}
	printf(" %.2lf\n",mn);
	return 0;
}

效果展示

别检查我的网站了喵 本文采用 CC BY-NC-SA 4.0 国际许可协议进行许可。 转载请注明作者及原文链接,并遵循相同方式共享原则。 链接:https://blog.nanoturtle.cn/index.php/2026/03/28/data-analysis-programming/
NanoTurtle的头像

NanoTurtle

文章作者

发表回复

textsms
account_circle
email

  • Cerulean Ballad的头像
    Cerulean Ballad

    思路挺直接,排序后枚举,不错。

    2 周前 回复
  • 深渊凝视的头像
    深渊凝视

    这代码看着舒服,没花里胡哨的。

    2 周前 回复
  • 社交变色龙的头像
    社交变色龙

    如果数据是负数,排序后分组会不会有问题?

    2 周前 回复
  • 风一样的汉子的头像
    风一样的汉子

    输出格式看着有点乱,能不能优化下排版?

    2 周前 回复
  • 星际隐士的头像
    星际隐士

    之前做数据分析也写过类似的分组,不过用的K-means。

    2 周前 回复
  • 星尘绘梦者的头像
    星尘绘梦者

    这代码风格,bits/stdc++.h好评,哈哈。

    2 周前 回复
  • 阳光橙的头像
    阳光橙

    如果数据有重复值,分组结果会不会有多个最优解?

    2 周前 回复
    • 蜂巢协议的头像
      蜂巢协议

      @阳光橙: 那要是数据本身是正态分布呢?还会有效吗?

      2 周前 回复
    • InfinityInker的头像
      InfinityInker

      @阳光橙: 好问题,重复值会导致多个分割点总离差平方和相同吧。

      2 周前 回复
  • 暗影织语的头像
    暗影织语

    组内离差平方和最小不一定是最优吧,还要看组间差异?

    2 周前 回复
  • 信号织梦的头像
    信号织梦

    之前做聚类也用过类似思路,不过是用Python写的。

    2 周前 回复
  • 森林熊的头像
    森林熊

    数学题还能这么玩?666

    2 周前 回复
  • 樵夫刘的头像
    樵夫刘

    看不懂,但感觉很厉害的样子。

    2 周前 回复
  • 幽暗之影的头像
    幽暗之影

    哈哈,教科书上的题终于有程序解了。

    2 周前 回复
  • 海边微风的头像
    海边微风

    这波操作可以啊,变量名1145141919810笑死。

    2 周前 回复
  • 臊皮儿的头像
    臊皮儿

    如果数据量很大,这个算法还能用吗?

    2 周前 回复
  • The Quirky Turkey的头像
    The Quirky Turkey

    我试了下n=20也能跑,就是输出有点乱。

    8 小时前 回复
  • 砚池心的头像
    砚池心

    那个啥,求问这个咋改成三组的?

    1 天前 回复

NanoTurtle的小窝

数据分析程序设计
该程序适用于数据分组,即分出组内离差平方和最小的2组 感谢同学开源。 背景 在《义务教育教科书 数学 八年级下册》(浙江教育出版社)的第78页出现了特别猎奇的题目: …
扫描二维码继续阅读
2026-03-28
登录

ACGN Android Arch Linux C# C++ IT兴趣 Linux Magisk模块 Python Python Root 权限 SEO优化 Steam Ubuntu WinUI WinUI3 三星刷机 东方Project 个人博客 中文输入法 人工智能 历史课件 同人游戏 域名管理 学生生活 改革开放 数码设备 新年快乐 新年祝福 机器学习 游戏 现代化建设 科技 空气质量 终端美化 网站迁移 网站运营 节日问候 语言设置 音乐