tengo una tabla de idordenar una matriz de acuerdo con los elementos de otra matriz
a1 = [1, 2, 3, 4, 5]
y tengo otro conjunto de objetos con ids en orden aleatorio
a2 = [(obj_with_id_5), (obj_with_id_2), (obj_with_id_1), (obj_with_id_3), (obj_with_id_4)]
Ahora necesito para ordenar a2 según el orden de los identificadores en a1. Así a2 ahora debe convertirse en:
[(obj_with_id_1), (id_2), (id_3), (id_4), (id_5)]
a1 podría ser [3, 2, 5, 4, 1] o en cualquier orden pero a2 debe corresponder al orden de ids en a1.
hago así:
a1.each_with_index do |id, idx|
found_idx = a1.find_index { |c| c.id == id }
replace_elem = a2[found_idx]
a2[found_idx] = a2[idx]
a2[idx] = replace_elem
end
Pero esto todavía podría funcionar en un tiempo O (n^2) si el orden de los elementos de A2 es exactamente inversa de a1. ¿Puede alguien decirme la forma más eficiente de ordenar a2?
creo que esto sería O (n^2). el tipo real es O (n), pero el paso de preparación lo haría n^2 – Jato
No estoy de acuerdo, para construir la tabla hash se requiere O (n), mira aquí http://en.wikipedia.org/wiki/ Hash_table – megas
Sí, construir la tabla hash es O (n) tiempo. Y el género es O (n) tiempo. Entonces tienes 2xO (n) ... hmmm ... eso sería menos que n^2. Estoy corregido. ¡buena atrapada! – Jato