Вот код, вставленный из hereАлгоритм: Медиана два отсортированных массива различных размеров
Я не может понять, что он делает. Я мог бы придумать простой алгоритм для поиска медианы двух отсортированных массивов при объединении. Идея состоит в том, чтобы сравнить медианы (m1, m2) обоих массивов, и если m1 < m2
найти медиану правого первого подмассива из m1 и левого второго подмассива до m2. Следующий код делает это в тех же строках, но я не могу полностью его понять.
double findMedian(int A[], int B[], int l, int r, int nA, int nB) {
if (l>r)
return findMedian(B, A, max(0, (nA+nB)/2-nA), min(nB, (nA+nB)/2), nB, nA); //What does the min/max do here
int i = (l+r)/2;
int j = (nA+nB)/2 – i – 1;
if (j>=0 && A[i] < B[j])
return findMedian(A, B, i+1, r, nA, nB);
else if (j<nB-1 && A[i] > B[j+1])
return findMedian(A, B, l, i-1, nA, nB);
else {
if ((nA+nB)%2 == 1) return A[i];
else if (i>0) return (A[i]+max(B[j], A[i-1]))/2.0; //I couldn't understand this
else return (A[i]+B[j])/2.0;
}
}
double findMedianSortedArrays(int A[], int n, int B[], int m) {
if (n<m)
return findMedian(A, B, 0, n-1, n, m);
else
return findMedian(B, A, 0, m-1, m, n);
}
Что делает вторая строка кода? Кроме того, я не мог понять, как последний блок else
вернет медиану. будет i
индекс содержит медианный, когда n + m
является нечетным?
Любая помощь, ссылки или указатели оцениваются.
Возможно, вам стоит попросить кого-нибудь, написавшего эту часть кода? – Galigator
Если A = {1; 1} B = {0; 0; 6; 6}, алгоритм возвращает 3.5, но правильный ответ равен 1. Если A = {1; 1} B = {0; 6}, происходит переполнение буфера , – Galigator
Это вопрос из leetcode (здесь [ссылка] (http://oj.leetcode.com/problems/median-of-two-sorted-arrays/)). Как упоминалось в @Mr K, алгоритм, который вы предоставляете, не даст правильного результата. Зачем вообще это понимать? –