내가 달성하고자하는 것 :요소의 증가로 모든 문자 조합을 통해 반복
내가 하나의 문자로 시작, 인쇄 가능한 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 씩 증가시킨다. 따라서 마지막 문자는주기 !"# ... ~
을 반복하며 물결표가 표시 될 때마다 두 번째 문자가 증가합니다. 때마다 두 번째 문자는 물결, 세 번째 문자의 증가 등 안타
당신은 내가이 문제를 해결하는 방법에 대한 제안 사항이 있습니까?
출력 문자열의 최대 문자 수는 얼마입니까? – beaker
몇 시간 후에 내 컴퓨터가 얼마나 많은 조합을 반복 할 수 있는지 잘 모르겠지만, 많은 경우 해당 컴퓨터에서 원활하게 작동해야합니다. 나는 그것이 6이나 7 정도의 한계에 도달했다고 생각 하겠지만, 확실하지는 않다. –
예언서에 아래에 언급되어 있듯이 이것은 당신의 경우에 토큰의 수를 기준으로 세고있다. 95 955 = 7.7378 e + 09'. 그건 좀 걸릴거야. – beaker