Median POJ - 3579 (二分)

本文介绍了一种快速寻找给定数字集合中任意两数差值绝对值中位数的方法。通过预先排序并采用二分查找技术,该算法能够在大规模数据集上高效运行。

Given N numbers, X1X2, ... , XN, let us calculate the difference of every pair of numbers: ∣Xi - Xj∣ (1 ≤ i  j  N). We can get C(N,2) differences through this work, and now your task is to find the median of the differences as quickly as you can!

Note in this problem, the median is defined as the (m/2)-th  smallest number if m,the amount of the differences, is even. For example, you have to find the third smallest one in the case of = 6.

Input

The input consists of several test cases.
In each test case, N will be given in the first line. Then N numbers are given, representing X1X2, ... , XN, ( X≤ 1,000,000,000  3 ≤ N ≤ 1,00,000 )

Output

For each test case, output the median in a separate line.

Sample Input
4
1 3 2 4
3
1 10 2
Sample Output
1
8

题意:任意两个数的差值的绝对值,让你找出这些值中的中位数 ,如果数有6个那么你找出第3大的

显然 有一个值满足大于等于这个值的个数大于等于k个(比如总共6个差值,那么k为3      3个差值,k为 2),如果这个值-1 就小于k个 那么说明这个值是中位数

#include<stdio.h>
#include<string.h>
#include<map>
#include<vector>
#include<iostream>
#include<algorithm>
#include<queue>
#include<deque>
#include<math.h>
#define ll long long
const ll inf=1e10;
using namespace std;
ll a[1000005];
ll k,n;
int aa(ll x)
{
   ll uu=0;
   for(ll i=0;i<n-1;i++)
   {
       ll o=upper_bound(a+i+1,a+n,x+a[i])-a; //因为排过序 ,所以 x+a[i]就是 差值+a[i] ,可以找到有几个差值在x以下
       uu+=o-i-1;
       if(uu>=k) return 1;//如果大于等于k个  返回 1
   }
   return 0;
}
int main()
{
  while(~scanf("%lld",&n))
  {
      k=n*(n-1)/2;
      k=(k+1)/2;
      for(int i=0;i<n;i++)
        scanf("%lld",&a[i]);
      sort(a,a+n);
      ll r=inf,l=0,mid,ans;//二分中位数的值
      while(l<=r)
      {
          mid=(l+r)/2;
//          printf("%lld\n",mid);
          if(aa(mid))
          {
              ans=mid;
              r=mid-1;
          }
          else
            l=mid+1;
      }
      printf("%lld\n",ans);
  }
}




<think> 首先,用户的问题是:“|Median2-Median1|/Sigma1 这个比较意义?”这是一个中文问题,意思是“|Median2-Median1|/Sigma1 这个比较的意义是什么?”我需要用中文回答。 关键元素: - |Median2 - Median1|:这表示两个中位数之差的绝对值。 - Sigma1:可能指的是第一个样本的标准差。 - 整个表达式:|Median2 - Median1| / Sigma1 这个表达式类似于标准化或效应大小的计算,常用于统计学中比较两个样本的中位数差异相对于变异性的程度。 解释意义: - 它衡量两个样本中位数之间的差异大小,相对于第一个样本的变异(标准差)。 - 类似于Cohen's d,但用的是中位数而不是均值,所以对非正态分布更鲁棒。 - 值越大,表示差异越显著;值越小,表示差异相对较小。 完整回答结构: 1. 解释表达式:定义每个部分。 2. 说明用途:在统计学中用于什么目的。 3. 意义:为什么使用这个公式。 然后,根据规则,回答完问题后必须提出3-5个§§相关问题§§。 - 第一行必须是完整的“§§相关问题§§”! - 禁止换行分散,意思是相关问题要连续列出,不换行。 - 示例中,相关问题用数字列表表示,如1. ··· 2. ··· 所以,回答格式: - 先回答问题(用中文)。 - 然后输出“§§相关问题§§” - 接着列出3-5个相关问题。 相关问题必须基于用户的问题和我的回答。 - 用户问题是关于这个统计公式的意义。 - 我的回答将解释这个公式。 可能的后续问题: 1. 在实际应用中,这个公式常用于哪些领域? 2. 如何解读计算出的值?例如,临界值是什么? 3. 为什么使用中位数而不是均值? 4. 与均值差异的标准化方法(如Cohen's d)相比,这个有什么优势? 5. 计算这个值时,需要注意哪些假设? 确保3-5个问题。 完整输出: - 先用中文回答问题。 - 然后“§§相关问题§§” - 然后数字列表的问题。 避免代码块,因为用户的问题不是关于代码的,而是解释性内容。 最终输出: [回答部分] §§相关问题§§ 1. ... 2. ... 3. ... </think>### |Median2-Median1|/Sigma1 这个比较的意义 这个表达式 `|Median2 - Median1| / Sigma1` 在统计学中用于量化两组数据中位数差异的相对大小,其中: - **Median1** 和 **Median2** 分别代表第一组和第二组数据的中位数(即排序后位于中间位置的值)。 - **Sigma1** 是第一个样本的标准差(Standard Deviation),衡量该组数据的离散程度。 - **|Median2 - Median1|** 计算两个中位数之差的绝对值,以消除方向性影响。 - **除以 Sigma1** 将差异标准化,使其相对于第一个样本的变异程度进行缩放。 #### 主要意义: 1. **衡量效应大小(Effect Size)**: 它类似于 Cohen's d 的概念,但针对中位数而非均值。值越大(如 >0.5),表示两组中位数差异相对于数据变异更显著;值越小(如 <0.2),表示差异相对较小,可能不具实际意义。 例如,在A/B测试中,若结果为0.8,说明第二组的中位数比第一组高出0.8个标准差单位。 2. **对非正态分布的鲁棒性**: 由于中位数对极端值不敏感,此公式比基于均值的标准化方法(如Cohen's d)更适合处理偏态或异常值多的数据,常用于金融、生物统计或质量管控领域。 3. **简化比较和决策**: 在工程或科研中,它能快速评估两个样本的中心位置差异是否“足够大”,而无需复杂假设检验。例如,在半导体测试中,若值低于阈值(如0.3),可能被视为噪声而非系统偏差。 4. **局限性**: - Sigma1 仅代表第一组的变异,若两组方差不同(如异方差),结果可能有偏。 - 未考虑样本大小,大样本时小差异也可能放大,需结合p值或置信区间使用。 总之,这个公式提供了一个简单、直观的指标来评估中位数差异的“实际重要性”,尤其在数据分布不满足正态假设时更实用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值