The geometric median of a discrete set of sample points in a Euclidean space is the point minimizing the sum of distances to the sample points. This generalizes the median, which has the property of minimizing the sum of distances for one-dimensional data, and provides a central tendency in higher dimensions.

也就是说,中位数就是一个数组里到所有其他数据点的距离之和达到最小值的点。n维的也一样。

一维的中位数满足这个性质,证明的话可以用反证法。可以证明的到的是,中位数往左一点或者往右一点都会造成距离之和增加,所以中位数是到其他点的距离之和最小。

$Geometric Median =\underset{y \in \mathbb{R}^n}{\operatorname{arg\,min}} \sum_{i=1}^m \left \| x_i-y \right \|_2$

然后,问题来了。。。

Q:Given set of points in 2d grid space. Find a grid point such that sum of distance from all the points to this common point is minimum.

eg: p1: [0, 0] p2: [3, 0] p3: [0, 3]

ans: r: [0,0]

sum: 0 + 3 + 3 = 6

这题naive 方法就是$O(n^2)$,求出所有点到其他点的距离之和,再取最小。

这里指的是曼哈顿距离。manhattan distance. 欧式距离不好求,网上人家直接用kmeans。。

参考:

  • http://stackoverflow.com/questions/12934213/how-to-find-out-geometric-median
  • http://stackoverflow.com/questions/12905663/given-list-of-2d-points-find-the-point-closest-to-all-other-points/12905913#12905913

对于曼哈顿距离,可以先通过预处理,算出在x轴上,每个点到其他x的值的距离之和,这个开销在O(nlgn+2*n)。y轴的同理。

现在我们就能够在O(1)得到所有点到其他点的距离之和(曼哈顿距离)。所以就能够在O(n)中求出最小值了。(最大值都行啊)

 bool compareByX(const Point &p1, const Point &p2) {
return p1.x < p2.x;
} bool compareByY(const Point &p1, const Point &p2) {
return p1.y < p2.y;
} int maxDistance(vector<Point> &points) {
if (points.empty()) return ;
sort(points.begin(), points.end(), compareByX);
int n = points.size();
vector<int> xdistances(n, ), ydistances(n, );
for (int i = ; i < n; ++i) {
xdistances[i] = xdistances[i - ] + i * (points[i].x - points[i - ].x);
}
int right = ;
for (int i = n - ; i >= ; --i) {
right = right + (n - i - ) * (points[i + ].x - points[i].x);
xdistances[i] += right;
} // preprocessing based on y
sort(points.begin(), points.end(), compareByY);
for (int i = ; i < n; ++i) {
ydistances[i] = ydistances[i - ] + i * (points[i].y - points[i - ].y);
} int top = ;
for (int i = n - ; i >= ; --i) {
top = top + (n - i - ) * (points[i + ].y - points[i].y);
ydistances[i] += top;
} int max = ;
for (int i = ; i < n; ++i) {
if (xdistances[i] + ydistances[i] > max) {
max = xdistances[i] + ydistances[i];
}
}
return max;
}

q神好叼,给他mock interview的时候答出O(n)的。

geometric median的更多相关文章

  1. 论文笔记(Filter Pruning via Geometric Median for Deep Convolutional Neural Networks Acceleration)

    这是CVPR 2019的一篇oral. 预备知识点:Geometric median 几何中位数 \begin{equation}\underset{y \in \mathbb{R}^{n}}{\ar ...

  2. postgis几何操作函数集

    管理操作函数 AddGeometryColumn - Adds a geometry column to an existing table of attributes. By default use ...

  3. [第四篇] PostGIS:“我让PG更完美!”

    概要 本篇文章主要分为几何图形处理函数.仿生变换函数.聚类函数.边界分析函数.线性参考函数.轨迹函数.SFCGAL 函数.版本函数这八部分. Geometry Processing ST_Buffer ...

  4. No.004:Median of Two Sorted Arrays

    问题: There are two sorted arrays nums1 and nums2 of size m and n respectively.Find the median of the ...

  5. [LeetCode] Find Median from Data Stream 找出数据流的中位数

    Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...

  6. [LeetCode] Median of Two Sorted Arrays 两个有序数组的中位数

    There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...

  7. Applying vector median filter on RGB image based on matlab

    前言: 最近想看看矢量中值滤波(Vector median filter, VMF)在GRB图像上的滤波效果,意外的是找了一大圈却发现网上没有现成的code,所以通过matab亲自实现了一个,需要学习 ...

  8. 【leetcode】Median of Two Sorted Arrays

    题目简述: There are two sorted arrays A and B of size m and n respectively. Find the median of the two s ...

  9. Codeforces Round #327 (Div. 2) B. Rebranding C. Median Smoothing

    B. Rebranding The name of one small but proud corporation consists of n lowercase English letters. T ...

随机推荐

  1. AngularJS 学习之事件

    1.ng-click指令:定义了AngularJS点击事件 <div ng-app="" ng-controller="myCtrl"> <b ...

  2. POJ 2774 后缀数组

    题目链接:http://poj.org/problem?id=2774 题意:给定两个只含小写字母的字符串,求字符串的最长公共子串长度. 思路:根据<<后缀数组——处理字符串的有力工具&g ...

  3. psql-05数据库,模式

    数据的组织结构 数据库:表,索引:数据行 PostgreSQL中一个服务(实例)可以有多个数据库:而一个数据库不能属于多个实例; 数据库 创建数据库 create database name [own ...

  4. CSS总结1

    新增:修改placeholder样式 ::-moz-placeholder{color:red;} //ff19+ :-moz-placeholder{color:red} //ff18- ::-we ...

  5. configSections

         由于最近一个项目的数据库变动比较频繁, 为了减少数据层的负担, 打算采用.net的MVC框架, 使用LINQ对付数据层.       这个框架的web.config文件里出现了configS ...

  6. PLSQL看oracle中汉字显示乱码

    首先执行语句 select * from V$NLS_PARAMETERS  查看第一行中PARAMETER项中为NLS_LANGUAGE 对应的VALUE项中是否为SIMPLIFIED CHINES ...

  7. Codeforces 581F Zublicanes and Mumocrates(树形DP)

    题目大概说有一棵树要给结点染色0或1,要求所有度为1的结点一半是0一半是1,然后问怎么染色,使两端点颜色不一样的边最少. dp[0/1][u][x]表示以u结点为根的子树中u结点是0/1色 且其子树有 ...

  8. unity meshrender理解

    网格渲染器,其中unity里面多有的材质在渲染的时候都是会划分成三角形的,所以当添加一些物体的时候,例如3d text的时候,默认添加网格渲染器. 最常用的就是获取材质. 下面是一个利用网格渲染器获得 ...

  9. BZOJ4117 : [Wf2015]Weather Report

    一种天气情况的概率只与4种天气的出现次数有关,故将相同概率的情况计数后放入堆中模拟哈夫曼树即可. 每次取出概率最小的,将它个数除以2,对于零头需要特判. #include<cstdio> ...

  10. 基于单决策树的AdaBoost

    ①起源:Boosting算法 Boosting算法的目的是每次基于全部数据集,通过使用同一种分类器不同的抽取参数方法(如决策树,每次都可以抽取不同的特征维度来剖分数据集) 训练一些不同弱分类器(单次分 ...