2010-03-15 3 views
9

균등하게을 선택하십시오. 배열에서 n 요소를 선택하십시오. 설명하기 가장 좋은 방법은 예제에 의한 것 같습니다. 어레이에서 N elems를 균등하게 선택하십시오. 배열에서 N을 선택하십시오.

제가

있다고 가정 :

배열 [0,1,2,3,4] 및 I는 0,2,4 .. 3 개 번호를 선택해야한다. 배열 길이가 < = n 인 경우 배열 전체를 반환하면됩니다.

나는 거기에 이것에 대한 정의 알고리즘, 검색하는 노력이고 내가을 알고리즘 소개에서 살펴 보았다하지만 내 요구를 충족 아무것도 (아마 그것을 간과)

를 찾을 수 없습니다 확신 해요

내가 겪고있는 문제는이 배열을 [p..q]로 확장하여 N 개의 요소를 균등하게 선택하는 방법을 찾아 낼 수 없다는 것입니다.

참고 : 난 그냥 위의 예에서 짝수 요소 ..

몇 가지 다른 예를 선택할 수 없습니다;

배열 [0,1,2,3,4,5,6], 3 요소; 나는 0,3,6을 얻을 필요가있다
배열 [0,1,2,3,4,5], 3 요소;

이상의 예 :
배열 [0,1,2] 2 elems : 0,2
배열 [0,1 I 0, 2 또는 3 중, 5

EDIT를 받아야 , 2,3,4,5,6,7], 5 elems : 0,2, 3 또는 4, 5,7

예, 항상 첫 번째 요소와 마지막 요소를 포함하고 싶습니다.

편집 2 :

제가 생각하는 것은 그 중간 값을 사용하여 내 길을 작동, 첫 + 마지막 요소 .. 같은했다. 비록 내가 그렇게 붙잡 혔을 때/혼란스러워했지만.

게시중인 알 고를 살펴 보겠습니다. 감사!

편집 3 :

여기에 PHP와 incrediman 솔루션의 최대 재미있게 버전입니다. 키를 유지하면서 연관 배열에서도 작동합니다.

<?php 

/** 
* Selects $x elements (evenly distributed across $set) from $set 
* 
* @param $set array : array set to select from 
* @param $x int  : number of elements to select. positive integer 
* 
* @return array|bool : selected set, bool false on failure 
*/ 
///FIXME when $x = 1 .. return median .. right now throws a warning, division by zero 

function select ($set, $x) { 
    //check params 
    if (!is_array($set) || !is_int($x) || $x < 1) 
     return false; 

    $n = count($set); 

    if ($n <= $x) 
     return $set; 

    $selected = array(); 
    $step  = ($n - 1)/($x - 1); 
    $keys  = array_keys ($set); 
    $values = array_values($set); 

    for ($i=0; $i<$x; $i++) { 
     $selected[$keys[round($step*$i)]] = $values[round($step*$i)]; 
    } 

    return $selected; 
} 

?> 

당신은 아마 Iterator을 구현할 수 있지만, 나는 그렇게 멀리를 취할 필요가 없습니다.

+0

? 당신의 패턴에 대해 더 구체적으로 생각하십시오. –

+0

더 많은 예제가 필요하다고 생각합니다. 여전히 당신이하려는 것을 이해하지 못하기 때문입니다. 더 긴 배열과 다른 수의 요소를 선택하는 것은 어떻습니까? –

+0

만약 내가 이것을 정확하게 읽는다면, OP는 어떤 규칙적인 패턴을 따르는 인덱스를 가진 다수의 배열 요소를 선택하려고합니다. 나는 Rex Kerr의 대답이 무엇이 여기에 묻히고 있는지 더 잘 설명 할 수 있다고 생각한다. – bta

답변

관련 문제