2016-07-29 3 views
2

내가 달성하고자하는 것 :요소의 증가로 모든 문자 조합을 통해 반복

내가 하나의 문자로 시작, 인쇄 가능한 ASCII - 문자의 모든 가능한 조합을 통해 루프 원하는 기능을 가지고, 두 자, 세 자 등이 포함됩니다.

이 부분을 어렵게 만드는 부분은 내가 할 수있는 한 많은 문자로 작업 할 수 있기를 바랍니다.

기록 : 나는 abc이 실제로 97 98 99이라는 것을 알고 있습니다. 그렇다면 더 쉽게 숫자 표현을 할 수 있습니다.

이 몇 글자 작동

:

I 그것을 통해 n 문자에 대한 모든 가능한 조합의 목록, 그냥 루프를 만들 수 있지만 이미 대량의 메모리를 필요로 n = 4. 이 접근법은 n > 5 (적어도 일반 데스크탑 컴퓨터에서는)에서는 문자 그대로 불가능합니다.

아래 스크립트에서 모든 작업은 각 조합에 대해 카운터를 증가시키는 것입니다. 제 실제 기능은보다 진보 된 것들입니다.

가 나는 (감사 Luis Mendo에) 할 수있는 무제한의 메모리를 가지고 있다면 :

counter = 0; 
some_function = @(x) 1; 
number_of_characters = 1; 
max_time = 60; 
max_number_of_characters = 8; 
tic; 
while toc < max_time && number_of_characters < max_number_of_characters 
    number_of_characters = number_of_characters + 1; 
    vectors = [repmat({' ':'~'}, 1, number_of_characters)]; 
    n = numel(vectors); 
    combs = cell(1,n); 
    [combs{end:-1:1}] = ndgrid(vectors{end:-1:1}); 
    combs = cat(n+1, combs{:}); 
    combs = reshape(combs, [], n); 
    for ii = 1:size(combs, 1) 
     counter = counter + some_function(combs(ii, :)); 
    end 
end 

지금, 나는 특정 시간에 가능한 한 많은 조합을 반복 원하는 5 초, 10 초, 2 분, 30 분, 그래서 나는 가능한 시간에 의해서만 제한되는 함수를 만들고, 적당한 양의 메모리만을 사용하기를 바라고 있습니다.


시도 내가 만든 (그리고에 실패) 이상의 문자를 한 : 나는 위의 방법 중 하나를 사용하여 두 개 또는 세 개의 문자의 조합을 컴퓨팅 미리 생각했습니다

및 사용 마지막 문자에 대한 루프. 이것은 단지 하나의 (상대적으로 작은) 배열과 반복되는 하나 이상의 추가 문자가 있기 때문에 많은 메모리가 필요하지 않습니다.

나는 이것을 최대 4 자까지 확장 할 수 있었지만 그 이상으로 나는 문제가 생기기 시작했다.


필자는 위쪽으로 세는 반복기를 사용하려고했습니다. 내가 any(mod(number_of_ascii .^ 1:n, iterator) == 0)을 칠 때마다 나는 m 번째 문자를 1 씩 증가시킨다. 따라서 마지막 문자는주기 !"# ... ~을 반복하며 물결표가 표시 될 때마다 두 번째 문자가 증가합니다. 때마다 두 번째 문자는 물결, 세 번째 문자의 증가 등 안타


당신은 내가이 문제를 해결하는 방법에 대한 제안 사항이 있습니까?

+0

출력 문자열의 최대 문자 수는 얼마입니까? – beaker

+0

몇 시간 후에 내 컴퓨터가 얼마나 많은 조합을 반복 할 수 있는지 잘 모르겠지만, 많은 경우 해당 컴퓨터에서 원활하게 작동해야합니다. 나는 그것이 6이나 7 정도의 한계에 도달했다고 생각 하겠지만, 확실하지는 않다. –

+0

예언서에 아래에 언급되어 있듯이 이것은 당신의 경우에 토큰의 수를 기준으로 세고있다. 95 955 = 7.7378 e + 09'. 그건 좀 걸릴거야. – beaker

답변

0

기본적으로 기본 -26 (또는 CAPS가 필요한 경우 기본 52)을 계산하려고합니다. 해당베이스의 각 번호는 특정 문자 열을 설명합니다.예를 들어,

0,1,2,3,4,5,6,7,8,9 A, B, C, D, E, F, G, H, I, J, K, L , M, N, O, P, 10,11,12, ...

여기에서 cap A부터 P까지는 base-26 시스템의 숫자 기호를 나타내는 데 사용되는 기호입니다. 위는 단순히이 문자열을 나타냅니다. l, m, n, o, p, q, r, s, t, u, v, w, m, X, Y, Z, 바, BB, BC, ...

그런 다음, 당신은 단순히이 작업을 수행 할 수 있습니다

물론
symbols = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E',... 
     'F','G','H','I','J','K','L','M','N','O','P'] 
characters = ['a','b','c','d','e','f','g','h','i','j','k','l',... 
     'm','n','o','p','q','r','s','t','u','v','w','x','y','z'] 
count=0; 
    while(true) 
    str_base26 = dec2base(count,26) 
    actual_str = % char-by-char-lookup-of-str26 to chracter string 
    count=count+1; 
    end 

, 그것은 0의 후행로 시작하는 문자를 표시하지 않습니다. 그러나 그것은 매우 간단해야합니다.

+0

이 방법으로 해결할 수 있다고 생각하지 않습니다. 나는 94 개의 ASCII 문자가 있기 때문에 그것이 base-94라고 믿는다. MATLAB은 기본 35 또는 기본 36까지만 처리 할 수 ​​있습니다. –

+0

@StewieGriffin Base-95? 옥타브의'dec2base'는 그것을 처리 할 수 ​​있지만 MATLAB은 처리 할 수 ​​없습니다. 자신 만의 기본 변환기를 만들 수 있습니다. – beaker

+0

사실 옥타브가 처리하지 못했습니다. 공백을 기호로 허용하지 않습니다. – beaker

0

단지 위쪽으로 세는 반복기를 얻는 것에 대한 생각은 그리 멀지 않았습니다.

이 아이디어와 함께 필요한 것은 정수에서 ASCII 문자까지의지도입니다. StewieGriffin이 제안했듯이, 기본 95 (94 문자 + 공백)로 작업하면됩니다.

왜 공백인가 : 0으로 매핑되고 그에 상응하는 것이 필요할 것입니다. 공백은 완벽한 후보입니다. 그러면 공백이 포함 된 문자열을 건너 뜁니다. 직접 입력하지 않고 !에서 직접 시작하는 경우 !! 또는 !ab과 같은 문자열을 표시 할 수 없습니다.


우선의 매핑하는 함수 정의 할 수 있습니다 (1 : 1) : 주요 스크립트에 다음

function [outstring,toskip]=dec2ASCII(m) 


    out=[]; 

    while m~=0 

     out=[mod(m,95) out]; 

     m=(m-out(1))/95; 

    end 

    if any(out==0) 

     toskip=1; 

    else 

     toskip=0; 

    end 

    outstring=char(out+32); 

end 

그리고 :

counter=1; 
some_function = @(x) 1; 
max_time = 60; 
max_number_of_characters = 8; 
currString=''; 


tic; 


while numel(currString)<=max_number_of_characters&&toc<max_time 

    [currString,toskip]=dec2ASCII(counter); 

    if ~toskip 

     some_function(currString); 

    end 

    counter=counter+1; 

end 
문자열 정수
기능의 16,

일부 임의 출력 : 나는 당신이 당신의 some_function 수행 할 작업을 모르는 나는 정말 자세히 설명 할 수없는 성능면에서

dec2ASCII(47) 

ans = 

O 

dec2ASCII(145273) 

ans = 

0)2 

. 매우 속도 측면에서 제한됩니다 다음과 같이 반복 : 내가 말할 수있는 유일한 방법은 dec2ASCII의 실행 시간은 약 2*10^(-5) s


사이드 노트 것입니다. some_function 기능을 사용하지 않으면 약 40 분 안에 4 개의 문자를 순환 할 수 있으며 5 개의 문자는 이미 64 시간까지 걸릴 수 있습니다. 어쩌면 반복하는 함수를 통해 전달할 물건의 양을 줄일 수 있습니다.

이 코드는 쉽게 병렬화 할 수 있으므로 더 많은 조합을 확인하려면 병렬 방식으로 시도하는 것이 좋습니다.

관련 문제