2017-03-12 1 views
0

배열의 순서를 고려한 조합 함수 인 을 찾고 있습니다. 예를 들어 "hello world"의 모든 조합을 생성하려고하지만 "world hello"를 반대로 바꾸고 싶지는 않습니다. 현재 조합 기능이 있지만 너무 큽니다.순열 알고리즘

간단한 예 :

$text = "Hello World" 
$arr = explode(" ",$text); // string to array 

그리고 준다 : 나는 그것이 더 빨리하려는

"World Hello" 
  • 키는 다음과 같습니다

    $result = combo_function($arr); 
    var_dump($result); 
    
    "Hello World" 
    "Hello" 
    "World" 
    

    내가 역을 원하지 않는 가능하면 조합보다. 나는이 사용하고 현재

:

// careful, this is very labor intensive (O(n^k)) 

public function buildSearchCombinations(&$set, &$results) 
{ 
    for ($i = 0; $i < count($set); $i++) { 

     $results[] = (string) $set[$i]; 
     $tempset = $set; 
     array_splice($tempset, $i, 1); 
     $tempresults = array(); 
     $this->buildSearchCombinations($tempset, $tempresults); 

     foreach ($tempresults as $res) { 
      $results[] = trim((string) $set[$i]) . " " . (string) trim($res); 
     } 
    } 
} 
+0

"hello world의 조합"은 무엇을 의미합니까? 단어 순서의 모든 조합? –

+0

여기에서 성취하고자하는 것이 무엇인지 분명하지 않습니다! 당신의 안녕하세요 세상은 당신이 무엇을하려고 하는지를 이해하기 정말 가난합니다! – hassan

+0

기본적으로 데이터베이스 검색에 사용할 순열 세트를 만들려고하지만 모든 조합을 사용하는 대신 사용자가 순서대로 입력해야한다고 가정 할 수 있습니다. 예를 들어, "프렌치 프라이"를 검색하는 경우, 검색 결과를 제공하는 식당을 모두 반환합니다. 프렌치 프라이스에 들어가면 실패 할 것입니다. 현재 나는 "감자 튀김"과 "감자 튀김"을 "감자 튀김"과 "프랑스어"와 함께 자동으로 생성하는 조합을 사용하고 있습니다. 이것은 더 큰 구와 함께 너무 많은 작업입니다. –

답변

1

을 나는이에 오히려 이상한 해결책을 가지고 :

<?php 

function supersetmember($set, $index) { 
    $keys = array_reverse(str_split(decbin($index))); 
    $member = []; 
    foreach ($keys as $k => $v) { 
     if ($v == 1) { 
      $member[] = $set[$k]; 
     } 

    } 
    return $member; 
} 


$text = "Hello World"; 
$arr = explode(" ",$text); 
$total = pow(2,count($arr)); //Total permutations on size of set n is 2^n 
$superset = []; 
for ($i = 0;$i < $total;$i++) { 
    $superset[] = supersetmember($arr,$i); 
} 
print_r($superset); 

설명 :

세트를 구성하는 2^n 개의 세트있다 크기 n (빈 세트 포함). 각 세트를 0에서 (n-1) 사이의 자연수로 매핑 할 수 있습니다. 숫자를 2 진수로 변환하면 1 인 숫자는 하위 집합에 포함될 원래 집합의 멤버를 나타냅니다. 예 :

집합 = (A, B);

수퍼 셋 2 (십진수) = 10 (이진수) 즉, 하위 집합에는 초를 포함하지만 첫 번째 구성원은 포함하지 않습니다 (우리는 최하위 숫자부터 최상위 숫자까지 오른쪽에서 왼쪽 숫자를 읽습니다).

이 작업을 수행하는 장점은 "fausset"알고리즘 (supersetmember 함수)을 사용하여 세트와 서브 세트를주고 그 서브 세트를 얻는 것입니다.

현재 버전에서 하나의 부분 집합을 얻기의 복잡성은 O(n)하지만 당신이 이동 비트와 그것을 구현하는 경우에는 생성 될 O(2^n) 부분 집합이 있기 때문에 불가피한 O(2^n) 될 것입니다 전체 알고리즘에서 O(log n)로 줄일 ​​수 있습니다.

+0

와우 야, 이건 완전히 불쾌한거야 –

+0

@MikeQ이 코드를 사용한 방식을 공유하려는 경우 일반적으로 허용되는 규칙은 질문을 업데이트하는 것입니다. – apokryfos

+0

ok thx, 나는 내가 그렇게해야만한다는 것을 잊었다. .. 주말에 그것을 비난한다. 감사 –