이 있는 알고리즘을 찾기 위해 가장 작은 설정의 가장 짧은 prefix 하위 문자열의 지속적인 숫자 시퀀스에 있습니까?

cs.stackexchange https://cs.stackexchange.com/questions/124480

문제

앞에 아무것도 하고 싶을 때 선 감사하는 사람에 의해 삭제를 위해 인내심이 없어요 공식적인 CS 배경 그래서 나는 아마도를 사용하려고 본 약관의 일부 잘못입니다.

나는 퍼즐:주어진 두 번호를 정의하는 설정의 지속적인 계산 숫자의 숫자의 번호,사 약 5 12 긴 숫자(즉,50000 60000,32325600000 및 32399999999),무엇이 가장 빠르고 가장 효율적인 방법으로 응축되면 이를 설정하는 접두사는 포함하는 모든 순열의 이후의 자리?

이 방법을 사용하여 하이브리드의 치료로 이러한 숫자와 문자열.첫 번째 제거하는 모든 쌍의 일치에 0 9 의 끝에 시작/끝입니다.두 번째 만들 전체 시퀀스 복사 두 개의 열을,어디 두 번째 열은 항상 부분과 오른쪽으로 자리를 제거에 상대적으로 열에 있습니다.거기에서 제가 할 수 있습을 재귀적으로 얼마나 많은 시간이 주어진 한 자리-짧은 문자열이 발생 항목 N-계산<10,N-count>=10 을 제거 또 다른 자리에서 모두 열고 반복합니다.

무엇을지 궁금하네요가 있다면 더 빠르고 효율적인 방법입니다.문자열 작업을 대신에의 수학했다는 명백한 빠른 해결지만,일반적인 접근 방식은 여전히 재귀적으로 그룹화하며 자르고 자입니다.내가 만드는 것으로 간주 전체 시리즈의 접두사 및 N-수 열을 다시 가장 높은 숫자 하지만 적어도 본능적으로는 같은 느낌이 든 것보다 효율적 운영을 재귀적으로 감소추장의 숫자가 있습니다.

IE
Input: 
Start=50000000 
End=55399999

which becomes
Start=500 
End=553

Cycle one creates two sequence columns like this:

String   Prefix     N-Count
500        50          10
501        50          10
etc..                  
510        51          10
etc..
550        55          6
551        55          6
552        55          6
553        55          6   

Cycle two keeps everything where N-count<10 the same, but reduces the rest by 1
digit each and recalculates N-count (while getting rid of duplicates).

String   Prefix     N-Count
50        5          5
51        5          5
52        5          5         
53        5          5
54        5          5       
550       55         4
551       55         4
552       55         4
553       55         4  


Output:  50,51,52,53,54,55,550,551,552,553 
```
도움이 되었습니까?

해결책

가정 입력 $a,b$, 두 $n$-자리 오래 숫자입니다.우리가 선도하는 제로(는 순간에 볼 why).자 $c$ 가장 긴 공통의 접두사 $a,b$, 자 $a=캘리포니아$, $b=cB$.

는 경우 $=0^{n|c|}$$B=9^{n|c|}$ 그런 다음 우리는 단순히 출력 $c$ (이 포함되어 있는 경우 $|c|=n$).

그렇지 않으면,우 $d_A$ 첫번째 자리의 $달, 자 $d_B$ 첫번째 자리의 $B$.

재귀적으로 솔루션을 찾을 위한의 범위 $[A,d_A9^{|A|-1}]$$[d_B0^{|B|-1},B]$, 로,prefix $c$ 습니다.또한,추가 $c(d_A+1),\ldots,c(d_B-1)$.

여기에는 최적화되지 않은 python 구현:

def prefixes(a,b,C=''):
     n, m = len(a), max(i for i in range(len(a)+1) if a[:i] == b[:i])
     c, A, B = C+a[:m], a[m:], b[m:]
     if A == '0'*len(A) and B == '9'*len(B):
         yield c
     else:
         yield from prefixes(A[1:],'9'*(len(A)-1),c+A[0])
         for i in range(int(A[0])+1,int(B[0])):
             yield f'{c}{i}'
         yield from prefixes('0'*(len(B)-1),B[1:],c+B[0])

예를 들어,실행하는 경우 list(prefixes('50000000','55399999')) 다음 당신은 다음과 같이 출력:['50', '51', '52', '53', '54', '550', '551', '552', '553']

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 cs.stackexchange
scroll top