zoukankan      html  css  js  c++  java
  • algorithm@ lower_bound implementation(Binary Search)

    一道来自jhu algorithm的作业题:

    Given two sorted arrays A, B, give a linear time algorithm that finds two entries i,j such that|A[i]−B[j]|is minimized. Prove the correctness of your algorithm and analyze the running time.

    Solution:我们可以对于每个a[i],然后再B数组中二分查找距离a[i] “最近”的数,这里的“最近”是指|A[i]−B[j]|最小。

    贴上一个algo代码 和 一个简单test案例。

    package abc.com;
    
    import java.util.Collections;
    
    public class TestLowerBound {
        
        public static void prt(Object o) {
            System.out.print(o);
        }
        
        //return a index where (key <= a[index])
        public static int lowerBound(int[] a, int key) {
            int l = 0, r = a.length-1, mid;
            if(key > a[r])  return -1;
            
            while(l < r) {
                mid = (l+r)/2;
                if(a[mid] < key)  l = mid + 1;
                else r = mid;
            }
            
            return l;
        }
        
        public static int min_abs_dif(int[] a, int val) {
            int l = 0, r = a.length-1, mid;
            
            if(val <= a[l]) {
                return Math.abs(val - a[l]);
            }
            else if(val >= a[r]) {
                return Math.abs(val - a[r]);
            }
            else {
                int pos = lowerBound(a, val);
                //prt(pos);
                if(Math.abs(a[pos] - val) == 0)  return 0;
                int min = Integer.MAX_VALUE;
                if(pos-1 >= 0 && Math.abs(a[pos-1] - val) < min)  min = Math.abs(a[pos-1] - val);
                if(pos >= 0 && (Math.abs(a[pos] - val) < min))  min = Math.abs(a[pos] - val);
                return min;
            }
            
        }
        
        public static void main(String[] args) {
            int[] a = {1, 29, 32, 42, 61, 63, 64, 84, 88, 99};
            
            /*
            for(int i=0; i<a.length; ++i) {
                a[i] = (int)(Math.random() * 100);
                prt(a[i] + "   ");
            }*/
            
            int min_abs = min_abs_dif(a, 450); 
            prt("
    " + min_abs);
        }
    
    }
  • 相关阅读:
    node.js简单的服务器
    简单的分页1
    定时跳转
    初始化多个vue实例对象
    js获取验证码的方法
    [z]Java代理(jdk静态代理、动态代理和cglib动态代理)
    .net操作word lib DocX
    git常用命令
    [z]查表空间使用情况
    [z]oracle job
  • 原文地址:https://www.cnblogs.com/fu11211129/p/5182600.html
Copyright © 2011-2022 走看看