[算法] 找到最相邻的3元组

原创 2012年03月29日 22:50:01

问题如下:

 You are given with three sorted arrays ( in ascending order), you are  required to find a triplet ( one element from each array) such that distance  is minimum.

 Distance is defined like this :  If a[i], b[j] and c[k] are three elements then  distance=max(abs(a[i]-b[j]),abs(a[i]-c[k]),abs(b[j]-c[k]))

 Please give a solution in O(n) time complexity

这个算法有很强的实用性,比如找到3组用户里面最相似的3元组,这里可以把abs替换为一个similarity函数即可。

下面的代码给出了一个最简单的Bruce force算法和一个优化算法。

package com.autofei.algorithm;

import java.util.Arrays;

public class GoogleMinimumDistance {

	static void NavieMin(int[] a, int[] b, int[] c) {
		int min = Integer.MAX_VALUE;
		String triplet = "";
		int[] tripletArray = new int[3];

		for (int i = 0; i < a.length; i++) {
			for (int j = 0; j < b.length; j++) {
				for (int k = 0; k < c.length; k++) {
					tripletArray[0] = Math.abs(a[i] - b[j]);
					tripletArray[1] = Math.abs(a[i] - c[k]);
					tripletArray[2] = Math.abs(b[j] - c[k]);
					Arrays.sort(tripletArray);
					int distance = tripletArray[2];
					if (distance < min) {
						min = distance;
						triplet = a[i] + "|" + b[j] + "|" + c[k];
					}
				}
			}
		}

		System.out.println(triplet + " => " + min);
	}

	static void SmartMin(int[] a, int[] b, int[] c) {
		int min = Integer.MAX_VALUE;
		String tripletString = "";
		int[] tripletArray = new int[3];
		int i = 0;
		int j = 0;
		int k = 0;
		while (i < a.length && j < b.length && k < c.length) {
			tripletArray[0] = a[i];
			tripletArray[1] = b[j];
			tripletArray[2] = c[k];
			Arrays.sort(tripletArray);
			int tripletMax = tripletArray[2];
			int tripletMin = tripletArray[0];
			int distance = tripletMax - tripletMin;
			if (distance < min) {
				min = distance;
				tripletString = a[i] + "|" + b[j] + "|" + c[k];
			}

			if (a[i] == tripletMin) {
				i++;
			} else if (b[j] == tripletMin) {
				j++;
			} else if (c[k] == tripletMin) {
				k++;
			}
		}

		System.out.println(tripletString + " => " + min);
	}

	public static void main(String[] args) {
		int[] a = { 4, 10, 15, 28 };
		int[] b = { 1, 3, 29 };
		int[] c = { 5, 13, 28 };

		GoogleMinimumDistance.NavieMin(a, b, c);

		GoogleMinimumDistance.SmartMin(a, b, c);
	}
}


一个无序实数数组中的相邻两个元素的最大差值

题目描述: 一个无序的实数数组a[i],要求求里面大小相邻的实数的差的最大值。比如 double a[]={1,5,4,0.2,100} 这个无序的数组,相邻的数的最大差值为100-5=95. ...
  • u010025211
  • u010025211
  • 2016年05月27日 08:47
  • 1465

Maximum Gap 寻找数组中排序后相邻两个数的最大差值,桶排序,O(n)

Given an unsorted array, find the maximum difference between the successive elements in its sorted f...
  • tuzigg123
  • tuzigg123
  • 2015年09月07日 14:53
  • 2005

数据结构之——找到无序数组中排序后相邻元素差值的最大值

/**  * 有一个整形数组A,请设计一个复杂度为O(n)的算法,算出排序后相邻两数的最大差值。 给定一个int数组A和A的大小n,请返回最大的差值。保证数组元素多于1个。  * @author...
  • Leo____Wang
  • Leo____Wang
  • 2016年11月27日 23:49
  • 1513

Lecture Halls 假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的算法进行安排。(这个问题实际上是著名的图着色问题。若将每一个活动作为图的一个顶点,不相容活动间用边相连。使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数。)

  • 2009年05月11日 18:07
  • 2KB
  • 下载

“像元分组” 算法:将二值图像中处于相邻的元素进行分组标号, 使得属于同一个分组的像元集合,其编号都相同

这个我看了很多文章的一些心得,欢迎大家指教
  • zcl1359205840
  • zcl1359205840
  • 2015年01月19日 21:24
  • 998

CSS Master, Sitepoint 2015读书笔记(印象比较深的几点:CSS优先级3元组表示法,多列及flex,Transforms)

CSS Master [attr~=val] 空格分隔的属性|= hyphenated,前缀子串:^= *= $=伪元素:::before ::after ::selecti...
  • cteng
  • cteng
  • 2015年11月08日 21:00
  • 592

相邻素数算法详细pdf文档

  • 2017年12月14日 16:24
  • 90KB
  • 下载

随便输入10相邻不等的数,随机输出5个不重复的算法

  • 2010年08月06日 17:44
  • 1KB
  • 下载

Pebble Merging 在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。试设计一个算法,计算出将n堆石子合并成一堆的最小得分和最大得分。

  • 2009年05月11日 18:01
  • 2KB
  • 下载

设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。

一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现。0是例外,可以反复出现。 请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。 注意: -...
  • dy0558775258712345
  • dy0558775258712345
  • 2014年05月29日 18:11
  • 560
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[算法] 找到最相邻的3元组
举报原因:
原因补充:

(最多只允许输入30个字)