Soy nuevo en F # y busco una función que tome N * índices y una secuencia y me da N elementos. Si tengo N índices, debería ser igual a concat Seq.nth index0, Seq.nth index1 ... Seq.nth indexN, pero solo debería escanear sobre indexN elementos (O (N)) en la secuencia y no index0 + index1 + .. . + indexN (O (N^2)).Tome N elementos de la secuencia con N índices diferentes en F #
En resumen, estoy buscando algo como:
//For performance, the index-list should be ordered on input, be padding between elements instead of indexes or be ordered when entering the function
seq {10 .. 20} |> Seq.takeIndexes [0;5;10]
Result: 10,15,20
que podría hacer esto mediante el uso ss {...} rendimiento y tienen un índice de venta libre que marque cuando algún elemento debe ser pasado pero si F # ofrece una buena forma estándar, preferiría usar eso.
Gracias:) ...
adición : me han hecho lo siguiente. Funciona pero no es bonito. Sugerencias bienvenidas
let seqTakeIndexes (indexes : int list) (xs : seq<int>) =
seq {
//Assume indexes is sorted
let e = xs.GetEnumerator()
let i = ref indexes
let curr = ref 0
while e.MoveNext() && not (!i).IsEmpty do
if !curr = List.head !i then
i := (!i).Tail
yield e.Current
curr := !curr + 1
}
¿Están sus índices ordenados (es decir, de menor a mayor o al revés)? –
Solo me pregunto, pero, ¿qué tipo de programa estás escribiendo que requiere un acceso indexado a tus secuencias? – Juliet
Pavel: podríamos decir que están ordenados. Juliet: En realidad, es para el problema 40 del Proyecto Euler que HE resuelto y puede ser resuelto por matematics puros. Pero quiero que mi solución funcional se vea mejor :) –