Excel / SharedStrings에 대한 정렬 알고리즘


10

Excel에서는 문자열을 숫자 매핑으로 '압축'합니다 (이 경우 압축 단어가 올바른지 확실하지는 않습니다). 다음은 아래에 표시된 예입니다.

여기에 이미지 설명을 입력하십시오

이렇게하면 전체 파일 크기 및 메모리 공간을 줄이는 데 도움이되지만 Excel은 어떻게 문자열 필드에서 정렬합니까? 모든 단일 문자열이 조회 매핑을 거쳐야합니까? 그렇다면 문자열 필드에서 정렬을 수행하는 속도를 늦추거나 늦추지 않을 것입니다 (1M 값이 있으면 1M 키 조회는 그렇지 않습니다) 하찮은). 이것에 대한 두 가지 질문 :

  1. 공유 문자열은 Excel 응용 프로그램 자체 내에서 사용되거나 데이터를 저장할 때만 사용됩니까?
  2. 그렇다면 현장에서 분류하는 알고리즘 예는 무엇입니까? 모든 언어는 괜찮습니다 (c, c #, c ++, python).

이것에 대한 지식이 풍부한 답변에 관심이 있습니다. 메모리 캐싱과 관련이 있지만 쉽게 잘못 될 수 있다고 추측 할 수 있습니다.
PeterT

이 매핑이 문서의 실제 XML 표현에 존재한다는 사실은 Excel에서 런타임에 데이터를 내부적으로 나타내는 방법과 무관하다고 생각합니다. 데이터 열을 원시 방식으로 표현하는 것이 더 계산적으로 효율적이라고 생각합니다 (다양한 방법으로 수행 될 수 있음).
alxrcs

@alxrcs Excel의 내부에 들어가는 SQLServer와 비슷한 문서 나 책이 있습니까? amazon.com/Pro-Server-Internals-Dmitri-Korotkevitch/dp/… 또는 기본적으로 ms 팀 외부의 블랙 박스입니까?
David542

확실하지 않습니다. 죄송합니다. 파일 형식에 대한 일부 사양을 온라인에서 찾을 수 있지만 Excel 런타임 내부에 대한 세부 정보를 쉽게 찾을 수 있다고 생각하지 않습니다.
alxrcs

어쨌든, 두 번째 질문에서 Excel 관련 사항보다 이론에 더 관심이 있다고 생각합니다. 맞습니까?
alxrcs

답변:


0

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조회 작업 이 느리고 사전에 요소를 캐싱하는 데 도움이됩니다.


0

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 ++에서 빠른 정렬 구현에 대한 링크입니다.

http://www.cplusplus.com/forum/beginner/101599/


2
빠른 정렬은 문자열 자체에있을 것입니다. 포인터를 역 참조하거나 조회 맵을 백만 번해야합니다. 아니요? 이 대답은 기본적으로 "예, 공유 문자열을 수행합니다. 공유 문자열없이 정렬하는 방법"이라고 말하는 것입니다.
David542

2
공유 문자열 테이블은 파일 내용을 디스크에 저장하는 데만 사용됩니다. ISO 표준은 응용 프로그램을 열 때 셀을 채우는 방법을 지정하지 않습니다. 공유 문자열 테이블에서 추출 된 문자열 값의 사본으로 셀을 채우면 역 참조를 피할 수 있습니다.
Gopinath

1
내가 참조. 예, 여기서 중요한 관심 대상은 스토리지 간 / 스토리지 측면에서 메모리 내에서 처리되는 방식이었습니다. 그 부분에 대한 통찰력이 있습니까?
David542

Excel 정렬에서 사용자는 정렬 순서를 열 목록으로 지정해야합니다 (예 : 열 A로 정렬, B로, C로, D로). 열 A에 중복 문자열이 있다고 가정하십시오. 정렬하는 동안 A 열에 대해 동일한 값을 가진 모든 행이 '열 B'의 값으로 정렬됩니다. B의 셀에 중복 값이 ​​포함 된 경우 고유 한 값을 가진 열이 발견 될 때까지 C 열에서 정렬이 수행됩니다. 고유 한 값을 가진 열이 없으면 행을 건너 뜁니다.
Gopinath
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.