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

给定三个升序数组,需要找出一个元素分别来自每个数组的三元组,使得它们之间的距离最小。距离定义为三个元素之间的最大绝对差值。要求解决方案的时间复杂度为O(n)。这个问题在实践中具有应用价值,例如找到三组用户中最相似的三元组,通过将abs替换为相似性函数。文中提供了暴力算法和优化算法的实现。
摘要由CSDN通过智能技术生成

问题如下:

 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);
	}
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值