算法 上机 第四题

来源:互联网 发布:天下手游激活码淘宝 编辑:程序博客网 时间:2024/05/18 00:59

题目:

 Give a divide and conquer algorithm for the following problem: you are given two sorted lists of size m and n, and are allowed unit time access to the ith element of each list. Give an O(lg m + lgn) time algorithm for computing the kth largest element in the union of the two lists. (For simplicity, you can assume that the elements of the two lists are distinct).

分析://本题的主要思想是 分治,首先 是数学 上的推导。(假设 数组 都是 有序 且 从大到小排列)// A B 数组,各有 m,n,个元素。x,y分别是 中点元素 把 AB 分成 俩 部分。A[x] 前面 x 个 元素,假如 A[x]<B[y];//那么 A[x] 前面 至少有x+y+1 个元素 比她大,如果 要查询的kth largest <=x+y+1;可以肯定的是 A[x]后面的元素 不在 考虑范围之内//则把 范围 缩小为A数组的一半,如果k>x+y+1 ,由于 B[y]后面的元素至少 为n-y-1+m-y-1+1=m+n-(x+y+1) 可知 B[y]前面的元素//至多为x+y+1;那么 B[y] 前面的元素 是不在考虑范围之内的,同样可以 删除,从而达到减小查询范围的目的。注意 当 把 前面的大数减少之后 // k值 也相应 的变化。举例:若满足条件A[x]<B[y],且 k> x+y+1, 第一次递归应该是(al,ar,bm+1,br,k-(bm-bl+1));

public class Work4 {public static int find_kth(int[] a,int[] b,int al,int bl,int ar,int br,int k){int am=(al+ar)/2;int bm=(bl+br)/2;if(al>ar){return b[bl+k-1];}if(bl>br){return a[al+k-1];}if(a[am]>b[bm]){if(k<=am-al+bm-bl+1){return find_kth(a, b, al, bl, ar, bm-1, k);}else{return find_kth(a, b, am+1, bl, ar, br, k-(am-al+1));}} else{if(k<=am-al+bm-bl+1){return find_kth(a, b, al, bl, am-1, br, k);}else{return find_kth(a, b, al, bm+1, ar, br, k-(bm-bl+1));}}}public static void main(String[] args){int[] a=new int[]{4,3,2};int[] b=new int[]{7,6,5,4,3,2,1};for(int i=1;i<10;i++){System.out.println(find_kth(a, b, 0, 0, 2, 6, i));}}}

0 0