算法导论——集合S是否存在两个元素相加之和等于x

来源:互联网 发布:电路仿真软件j 编辑:程序博客网 时间:2024/06/10 15:21

算法伪代码:

FindX(S,x){

         //输入S[1…n],x;输出true或false

//首先对S进行归并排序

         mergeSort(S)

       //对于排好序的数组S中每个元素,通过二分查找,判断S的剩余元素中是否存在相加为X的情况(转化为查找x-A[i]的方式)

         fori <- 1 to length[S] do{

                   if(binarySearch(S,1,length[S],x-S[i])!= i)

retrun true

}

         returnflase

}


java实现:

public class TestFindX{public static void main(String[] args){int[] intArray = new int[100];for(int i = 0;i < 100;i++){intArray[i] = (int)(Math.random() * 100);System.out.print(intArray[i] + " ");}int x = (int)(Math.random() * 100);System.out.println("\n该集合是否存在两个元素相加之和等于" + x + "? " + findX(intArray,x));}public static boolean findX(int[] A,int x){//首先对数组A进行归并排序mergeSort(A,0,A.length - 1);//对于排好序的数组A中每个元素,通过二分查找,判断A的剩余元素中是否存在相加为X的情况(转化为查找x-A[i]的方式)int j;for(int i = 0;i < A.length;i++){j = binarySearch(A,0,A.length,x-A[i]);if(j != i && j >= 0)return true;}return false;}public static void mergeSort(int[] A,int p,int r){//递归划分至只含一个元素,然后进行合并if(p < r){int q = (p + r) / 2;mergeSort(A,p,q);mergeSort(A,q+1,r);merge(A,p,q,r);}}//合并分别已经排好序的A[p...q]和A[q+1...r]public static void merge(int[] A,int p,int q,int r){int n1 = q - p + 1;int n2 = r - q;//新建两个副本数组L、R分别用于拷贝A[p...q]和A[q+1...r]int[] L = new int[n1 + 1];int[] R = new int[n2 + 1];int i,j;for(i = 0;i < L.length - 1;i++)L[i] = A[p + i];for(j = 0;j < R.length - 1;j++)R[j] = A[q + 1 + j];//将数组L、R的最后一个值设为无穷大作为哨兵L[n1] = Integer.MAX_VALUE;R[n2] = Integer.MAX_VALUE;//从左至右分别比较数组L、R,并将较小值依次放回A[p...r]中i = 0;j = 0;for(int k = p;k <= r;k++){if(L[i] <= R[j])A[k] = L[i++];else A[k] = R[j++];}}public static int binarySearch(int[] A,int low,int high,int x){int i = 0;while(low < high){i = (low + high) / 2;if(x == A[i]) return i;else if(x > A[i])low = i + 1;elsehigh = i - 1;}return -i -1;}}

运行结果:

阅读全文
0 0