Pues bien, la mediana de las matrices concatenadas no es ciertamente la respuesta, como tampoco lo es la mediana de la unión de las matrices, aunque éstas tengan la misma longitud. El siguiente código sencillo de Python te desengañará de esa idea:
from random import randint
from statistics import median
import numpy as np
size_a = randint(10, 20)
a = [randint(0, 10) for __ in range(size_a)]
a.sort()
size_b = randint(10, 20)
b = [randint(0, 10) for __ in range(size_b)]
b.sort()
c = list(set(a + b)) // This is testing the union. For concat, eliminate
// the list and set calls and just do c = a + b.
c.sort()
print('a = ' + str(a))
print('b = ' + str(b))
print('median of c = a concat b is ' + str(median(c)))
a = np.array(a) // Useful for conditional indexing.
b = np.array(b)
print('Number of elements of a less than median: ')
print(str(len(a[a < median(c)])))
print('Number of elements of b greater than median: ')
print(str(len(b[b > median(c)])))
Sin embargo, creo que podemos tomar esta idea básica y ajustarla un poco para resolver tu problema. Idea: tomar las matrices concatenadas c = a + b
y empezar con la mediana del resultado. Luego haz una comparación. Si el número de elementos de $a$ es mayor, vaya antes en $c$ . Si no, vete más tarde. Sin embargo, me gustaría señalar que no todas las opciones de $A$ y $B$ dará una solución. Por ejemplo: \begin{align*} A&=[0, 2, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8, 9, 9, 10] \\ B&=[0, 0, 1, 1, 1, 1, 2, 3, 3, 7, 8] \end{align*} no da una solución. Si se toma $0, 0.5, 1, 1.5, 2, 2.5,$ y $3$ a su vez, se verá que para ninguna de estas posibilidades el número de elementos de $A$ menos que el número igual al número de elementos de $B$ mayor que el número. Además, al recorrer la lista de números que acabo de dar, verás una inversión en los tamaños de las listas que satisfacen el criterio deseado. El siguiente código de Python encontrará un umbral, si existe, y un umbral óptimo que minimice la diferencia entre el número de elementos de $A$ menor que el umbral y el número de elementos de $B$ mayor que el umbral:
from random import randint
from statistics import median
import numpy as np
size_a = randint(10, 20)
a = [randint(0, 10) for __ in range(size_a)]
a.sort()
size_b = randint(10, 20)
b = [randint(0, 10) for __ in range(size_b)]
b.sort()
c = a + b
c.sort()
print('a = ' + str(a))
print('b = ' + str(b))
print('median of c = a concat b is ' + str(median(c)))
a = np.array(a)
b = np.array(b)
c = np.array(c)
t = median(c)
t_index = len(c[c < t])
iter_count = 0
diff = abs(len(a[a < t]) - len(b[b > t]))
best_t = t
while 0 < diff and iter_count < len(c):
iter_count += 1
if len(a[a < t]) > len(b[b > t]):
t = np.mean(c[t_index-1:t_index+1])
if len(a[a < t]) > len(b[b > t]):
t_index -= 1
t = c[t_index]
else:
t = np.mean(c[t_index:t_index+2])
if len(a[a < t]) < len(b[b > t]):
t_index += 1
t = c[t_index]
if abs(len(a[a < t]) - len(b[b > t])) < diff:
diff = abs(len(a[a < t]) - len(b[b > t]))
best_t = t
if 0 < diff:
print('Could not find an exact threshold.')
print('Optimal threshold was ' + str(best_t))
print('Difference in set cardinalities was ' + str(diff))
else:
print('Threshold is ' + str(best_t))