2015-01-23 5 views
-2

나는 내가 제어하는 ​​하나의 마스터 문자열을 문자열 A라고 부릅니다. 그리고 나서 다른 제어 문자열이 아닌 문자열을 B 문자열이라고합니다. A에 들어 있던 모든 것을 포함해야합니다. B, 올바른 순서로.문자열 비교 및 ​​복사 차이

다음은 B가 작동하는 방법입니다. 처음에는 새로운 텍스트가 위에서 아래로 나타납니다 (단어 문서를 작성하는 경우 일반적으로 텍스트가 나타납니다). 그런 다음 무작위 지점에서 랩핑하고 새 텍스트가 다시 맨 위부터 시작하여 이전에 있던 내용을 덮어 씁니다.

특정 바이트 수가 기록 된 후에 B가 랩핑되고 맨 처음 시작된 것이 아니라면 타이머를 사용하여 주어진 간격으로 전체 문자열을 복사 할 수있었습니다. 대신 B와 A를 위에서 아래로 비교하는 일종의 비교를 사용해야합니다. B와 A가 다른 바이트를 찾으면 B에서부터 끝까지 모든 것을 복사하여 A의 맨 아래에 씁니다.

작동이 불분명 할 경우 입력했는데 아래 예를 참고하십시오. 모든 코드 -이 작업을 수행하는 방법에 대한 예제는 크게 감사하겠습니다. 나는 그것을 해결하기 위해 커서 접근 방식을 사용하려고하지만 텍스트가 정상에 포장 할 때 파산 :

String B: abc 
String A: abc 

String B: abcde 
String A: abcde 

String B: fgh 
String A: abcdefgh 

String B: fghijk 
String A: abcdefghijk 

etc... 

그냥 솔루션을 내 자신의 생각을 추가 할 수 있습니다. 비교 방법을 수행하는 방법을 잘 모르겠습니다. 나는 String을 살펴 봤다. 비교해 보라. 그러나 그것이 더 크든 작든간에 반환 만한다. 나는 수동으로 바이트 비교에 의해 바이트를 할 수있을 것 같아요,하지만 그것은 매우 비효율적 인 것처럼 보이는데, 특히 문자열이 매우 커질 때 특히 그렇습니다.

EDIT (설명) : 텍스트가 B에 나타나면가 전에 B에 나타난 그, 그것은 여전히 ​​A에

편집을 포함해야한다 (설명 2) : 그냥 나는 분명합니다 문자열 B를 보유하는 프로세스를 제어 할 수 없기 때문에 정기적으로 타이머를 폴링하거나 (정말로 빠른 루프를 사용하여) 폴링해야합니다.

매그너스

알고리즘에 대한
+0

글쎄, 나는 위의 문자열 B를 호출하는 것을 포함하여, 다른 프로세스의 메모리로부터 많은 것들을 읽는 코드의 수천 줄의 프로그램을 작성했다. 그것을 해결하기 위해 커서 접근법을 사용하려고했지만 텍스트가 맨 위에 올랐을 때 파손되었습니다. 비교 방법을 수행하는 방법을 잘 모르겠습니다. 나는 String을 살펴 봤다. 비교해 보라. 그러나 그것이 더 크든 작든간에 반환 만한다. 나는 수동으로 바이트 비교에 의해 바이트를 할 수있을 것 같아요,하지만 그것은 매우 비효율적 인 것처럼 보이는데, 특히 문자열이 매우 커질 때 특히 그렇습니다. – Anders

+0

다음에 문자열이 변경되면 "flmno"가 반환됩니다. f를 무시해야합니까 (예 : 중복을 처리하는 방법)? – Default

+1

B가 예전의 "abc"와 같이 이미 되었다면 어떻게 될까요? 그런 다음 "abc"를 A에 추가해야합니까, 아니면 이미 한 번 포함 되었습니까? 그러면 B가 "defg"가되면 어떻게 될까요? 즉, A의 "bcdef"는 B의 "bcd"와 "def"를 모두 포함합니까? 아니면 두 개의 다른 단어로 계산되어야합니까? – Kjartan

답변

1

기본 아이디어 : 확인이 거꾸로 말 마이너스 B의 길이에서, B의 시작 대, 이미 추가 된 내용을 B에서 제거 할

,

이것은 A의 마지막 부분과 겹치는 B의 부분을 제외한 A의 끝에 B의 각 "단어"를 추가해야합니다 (I 희망 해석했습니다. 문제가 더 많거나 적게 정확하게).

예 : Say B는 "DEFGH"이고 지금까지 A는 "ABCDEF"를 기록했습니다.

다음과 같이 반복 할 것이다 비교 알고리즘 :

D - - - - // Only check D first, from end of A - length(B) 
A B C D E F // No match! 

    D - - - - // Move B ahead 1, still no match 
A B C D E F 

     D - - - - // Move B ahead 1, one match now. 
A B C D E F 

결과 : 나머지는 B의 해당 문자를 일치

  • 경우에, 당신은 단지 B의 나머지 부분을 추가 할 수 있습니다 A.
  • A의 나머지와 B의 겹치는 문자가 일치하지 않으면 알고리즘을 다시 시작하십시오. 단, 이번에는 이전 일치 이후부터 시작하십시오. 불일치

예 :

 D E F L M N O ... 
A B C D X Y D E F 
여기

, E 및 B의 F는까지 X과의 Y와 불일치 때문에 등 Y 후, X에 B에 D 비교함으로써 시작한다 이 때 A에서 두 번째 D에 도달하면 D E F은 A로, 나머지 B (L M N O)는 A에 추가 될 준비가 된 것입니다.

+0

Kjartan, 고마워! 우리는 같은 나라 출신입니다 :) Jeg studerte paa NTNU. 이것을 이해하려고 노력할 것입니다. – Anders

+0

자, 도와 줘서 고마워! 희망이 작동합니다. Lykke 때까지! :) – Kjartan