Предположим, у вас есть строка длины n
, и вы хотите, чтобы она была длиной m
.У вас есть n-2
элементов для выбора и m-2
элементов для вашего нового массива.Теперь предположим, что вы выбрали i
элементов и передали j
элементов.Если i/j
<<code>(m-2)/(n-2), то вы позади.Вы, вероятно, должны взять другой элемент.Что вы действительно хотите знать, для максимально равномерного выбора, является ли (i+1)/(j+1)
или i/(j+1)
ближе к вашей цели (m-2)/(n-2)
.Если переполнение не является проблемой, вы можете сделать небольшую алгебру, чтобы понять, что это эквивалентно тому, больше или меньше (i+1)*(n-2) - (j+1)*(m-2)
, чем (n-2)/2
;more означает i
лучше (так что не берите этот), а less означает i+1
лучше.
Я не знаком с ActionScript, но вот некоторые Scala, которые, мы надеемся, могут работать как псевдокод:
// Don't worry about the [T: ClassManifest] thing
// that just means it can work on arrays of any type
def pare[T: ClassManifest](a: Array[T], m: Int) = {
val b = new Array[T](m)
val n2 = a.length - 2
val m2 = m - 2
b(0) = a(0)
var i,j = 0
while (j < n2) {
val diff = (i+1)*n2 - (j+1)*m2
if (diff < n2/2) {
i += 1
j += 1
b(i) = a(j)
}
else j += 1
}
b(m2+1) = a(n2+1)
b // This means "return b"
}
Давайте попробуем!
scala> pare(Array[Any]('a','b','c','d','e','f','g',1,2,3,4,5),6)
res1: Array[Any] = Array(a, c, e, 1, 3, 5)
scala> pare(Array(1,2,3,4,5,6,7,8,9),4)
res2: Array[Int] = Array(1, 4, 7, 9)
scala> pare(('a' to 'z').toArray, 16)
res3: Array[Char] = Array(a, b, d, f, h, i, k, m, n, p, r, t, u, w, y, z)
Как видите, это дает очень равномерные расстояния.