Java – the fastest way to combine unique integers from 2 arrays
•
Java
If I have 2 arrays:
arr1 = {9,8}
arr2 = {13,12,10,9,8}
I want to get:
{13,10}
And the array is given:
arr1 = {23,22,21,20,19,18,17,16}
arr2 = {21,17}
The result will be:
{23,16}
So basically, the number I get is Arr1 or arr2, but not both
>2 arrays may have different lengths. > The 2 arrays are sorted in descending order, and the final array must also have this attribute. > This has been done millions of times, so I try to reduce / prevent object allocation as much as possible That's why I don't use a suit to do the job
Solution
You are looking for two sets of EXOR Because the array is pre - ordered, I think it's simpler than it looks Pseudo code
This is a green o (n) solution This is an implementation that has been slightly tested: D
/**
* Returns the sorted EXOR of two sorted int arrays (descending). Uses
* arrays,index management,and System.arraycopy.
* @author paislee
*/
int[] arrExor(int[] a1,int[] a2) {
// eventual result,intermediate (oversized) result
int[] exor,exor_builder = new int[a1.length + a2.length];
int exor_i = 0; // the growing size of exor set
int a1_i = 0,a2_i = 0; // input indices
int a1_curr,a2_curr; // elements we're comparing
// chew both input arrays,greedily populating exor_builder
while (a1_i < a1.length && a2_i < a2.length) {
a1_curr = a1[a1_i];
a2_curr = a2[a2_i];
if (a1_curr != a2_curr) {
if (a1_curr > a2_curr)
exor_builder[exor_i++] = a1[a1_i++];
else
exor_builder[exor_i++] = a2[a2_i++];
} else {
a1_i++;
a2_i++;
}
}
// copy remainder into exor_builder
int[] left = null; // alias for the unfinished input
int left_i = 0,left_sz = 0; // index alias,# elements left
if (a1_i < a1.length) {
left = a1;
left_i = a1_i;
} else {
left = a2;
left_i = a2_i;
}
left_sz = left.length - left_i;
System.arraycopy(left,left_i,exor_builder,exor_i,left_sz);
exor_i += left_sz;
// shrinkwrap and deliver
exor = new int[exor_i];
System.arraycopy(exor_builder,exor,exor_i);
return exor;
}
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码
