[演算法] 找到最相鄰的3元組

來源:互聯網
上載者:User

問題如下:

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.