2012-10-24 3 views
1

필자는 이론적으로 수천 개의 문자열을 임의의 (사전 프로젝트 별) 데이터 정렬로 정렬해야하는 사전 편집 소프트웨어를 작성하고 있습니다. 사용자 지정 데이터 정렬을 지정하는 두 가지 방법이 있습니다.효율적인 정렬 및 정렬 방법?

  1. 유니 코드 형식의 다단계 정렬 키에 대한 graphemes의지도입니다.
  2. 정렬 순서대로 알파벳 글자체의 배열 (가능하게는 이중선 등)이 내부적으로 조합 키의지도로 변환 될 수 있습니다.

문자열을 비교하는 순진한 방법을 사용하면 불일치를 찾을 때까지별로 그래 핀 그래 핀-확인하고 일치하지 않는 제자 비교하기위한 정렬 키를 검색하는 것입니다,하지만 난 더 효율적인 방법이 바라고 있어요 그것을하는 것.

내가 지금까지 가지고있는 가장 좋은 아이디어는 동일한 길이의 문자열을 리틀 엔디안 base-n 숫자로 처리 할 수 ​​있다는 점에 달려있다. 따라서 저렴한 가격으로 데이터 정렬을 변환하는 각 문자열의 정수 키를 미리 계산할 수있다. 정수 비교. 그러나 이것은 다른 길이의 문자열 (사전을 정렬 할 때 큰 문제)에서 발생하며, 생성 될 수있는 정수의 크기에는 제한이 없습니다. 길이 차이를 설명하기 위해 각 문자열의 모든 접두사에 대한 키 목록을 계산 한 다음 비교되는 더 짧은 문자열과 동일한 길이의 접두사에 대한 키를 비교할 수 있다고 생각했습니다. 그것은 꽤 잘하는 것처럼 보이지만 키 크기는 여전히 제한되어 있지 않으며 키를 저장하면 많은 메모리를 사용할 수 있습니다.

이러한 접근 방식을 향상시킬 방법이 있습니까? 아니면 완전히 잘못된 것일뿐입니다. 임의의 데이터 정렬을 사용하여 문자열을 정렬하는 훨씬 더 좋은 방법이 있습니까?

답변

1

저는 전문가는 아니지만 순진한 접근 방식과 접근 방식 사이에 어떤 종류의 하이브리드를 제안 할 수 있습니다. 각 문자열에서 고정 된 수의 바이트를 보면 리틀 엔디안 번호로 취급하고 미리 계산 된 데이터 정렬을 사용합니다. 그렇다면 그들이 같은 길이의 다음 세트로 이동하고 동일하게한다면. 까다로운 부분은 가변 길이의 글 림을 다루는 것입니다 (예 : UTF-8 또는 다이 그래프). 가장 간단한 해결책은 사전에 고정 너비 표현을 사용하는 것이지만 지금은 생각할 수없는 또 다른 정교한 솔루션이있을 수 있습니다.

짧은 문자열의 끝에 도달하면 다음 경계를 충족시키기 위해 0을 확장 한 다음 비교를 수행합니다.

데이터 정렬의 오픈 소스 구현을보고 더 정교한 작업을하는지 확인할 수도 있습니다 (예 : strcoll C 함수의 GNU 구현).

+0

strcoll은 strxfrm과 비교할 문자열을 변환 한 후 strcmp를 사용합니다. GNU libc 문서에서는 모든 문자열의 strxfrm 변환을 미리 계산 한 다음 strcmp를 사용하여 효율적으로 정렬 할 것을 권장합니다. Strxfrm 구현을 찾을 수 있다면 strxfrm이 단지 변환 된 문자열보다 더 나은 비교 키를 생성하는 방법이 있는지 보는 방법을 살펴 봐야한다고 생각합니다. –

2

grapheme-by-grapheme 어때? Big O n (단어 수) * m (가장 긴 단어 길이)로 정렬됩니다. 아이디어는 A 버킷에 B로 시작하는 모든 단어를 넣고 B 버킷에 B를 넣은 다음 단어의 문자 아래에 배치하는 것이 매우 간단해야합니다.