[excel] Excel / SharedStrings에 대한 정렬 알고리즘
Excel에서는 문자열을 숫자 매핑으로 ‘압축’합니다 (이 경우 압축 단어가 올바른지 확실하지는 않습니다). 다음은 아래에 표시된 예입니다.
이렇게하면 전체 파일 크기 및 메모리 공간을 줄이는 데 도움이되지만 Excel은 어떻게 문자열 필드에서 정렬합니까? 모든 단일 문자열이 조회 매핑을 거쳐야합니까? 그렇다면 문자열 필드에서 정렬을 수행하는 속도를 늦추거나 늦추지 않을 것입니다 (1M 값이 있으면 1M 키 조회는 그렇지 않습니다) 하찮은). 이것에 대한 두 가지 질문 :
- 공유 문자열은 Excel 응용 프로그램 자체 내에서 사용되거나 데이터를 저장할 때만 사용됩니까?
- 그렇다면 현장에서 분류하는 알고리즘 예는 무엇입니까? 모든 언어는 괜찮습니다 (c, c #, c ++, python).
답변
SharedStringTable
런타임에 Excel 에서 요소에 메모리가있는 셀을 정확히 저장하는 방법을 찾을 수는 없지만 요소를 항목의 인덱스로 SharedStringTable
저장하면 요소가 배열로 저장되어 있다고 가정 할 때 액세스 할 수있는 추가 참조가 하나만 필요합니다. 그래서 내 추측은 이것이 어떻게 수행되는지입니다. 이것이 가장 간단한 방법이며 더 빠르게 만드는 유일한 방법은 SharedStringTable
이미 요소별로 정렬 된 런타임 표현을 갖는 것입니다 . 이 경우 인덱스를 기준으로 정렬하는 것은 값을 기준으로 정렬하는 것과 같습니다. 그러나이 방법을 사용하면 새 문자열이 테이블 중앙에 삽입 될 때 모든 인덱스가 증가해야하는 것보다 큰 모든 인덱스가 증가하고 문서에서 이러한 셀의 수가 최대로 많아 질 수 있으므로 삽입 작업에 많은 비용이 소요됩니다. 세포 참조 SharedStringTable
.
셀에 파일과 동일한 인덱스가 포함되어 있으면 여기 에 2의 비용으로 벡터 columnValue
에 저장된 문자열을 기반으로 벡터에 표시된 셀을 정렬하는 방법 이 있습니다 sharedStrings
(C ++에서 차이가 없다고 말했기 때문에). 비교 작업 당 추가 역 참조 :
// sort indexes from columnValue based on comparing values in sharedStrings
sort(columnValue.begin(), columnValue.end(),
[&sharedStrings](size_t i1, size_t i2){return sharedStrings[i1] < sharedStrings[i2];});
OP에는 없었지만 역방향 SharedStringTable
조회 작업 이 느리고 사전에 요소를 캐싱하는 데 도움이됩니다.
답변
Microsoft Excel 공유 문자열 테이블
공유 문자열 테이블은 ISO 표준 -ISO / IEC 29500-1 : 2016 (E)에 정의 된 Open XML 표준입니다 .
공유 문자열의 공식 정의 (ISO 문서에서 인용)
공유 문자열 테이블
문자열 값은 스프레드 시트 셀 요소 내에 직접 저장 될 수 있습니다. 그러나 여러 셀 요소에 동일한 값을 저장하면 워크 시트 파트가 매우 커져 성능이 저하 될 수 있습니다. 공유 문자열 테이블은 통합 문서에서 공유되는 색인화 된 문자열 값 목록으로, 구현에서 값을 한 번만 저장할 수 있습니다.
공유 문자열의 ISO 표준은
https://standards.iso.org/ittf/PubliclyAvailableStandards/c071691_ISO_IEC_29500-1_2016.zip
이 주제에 관한 질문에 대한 답변
질문 1 : 공유 문자열이 Excel 응용 프로그램 자체에서 사용됩니까, 아니면 데이터를 저장할 때만 사용됩니까?
답변 :
공유 문자열은 Excel에서 문서를 저장할 때만 스프레드 시트를 파일로 저장 용으로 저장하기 위해 사용합니다.그러나 파일을 표시하기 위해 열면 셀은 공유 문자열 테이블에서 가져온 실제 문자열 값으로 채워집니다.
–
질문 2 : 필드에서 정렬하는 예제 알고리즘은 무엇입니까? 모든 언어는 괜찮습니다 (c, c #, c ++, python).
답 :
Excel과 같은 응용 프로그램의 경우 특수 독점 변형 인
빠른 정렬 이 문자열 값을 정렬하는 데 가장 많이 사용되는 알고리즘이라고 생각합니다.Excel은 1,048,576 행으로 제한됩니다. 이 크기에서 빠른 정렬은 확실히 승자입니다. 빠른 정렬은이 크기의 데이터 세트에 대해 매우 효율적인 결과를 생성 할 수 있습니다.
다음은 문자열 정렬을위한 C ++에서 빠른 정렬 구현에 대한 링크입니다.