Sắp xếp thuật toán cho Excel / SharedStrings


10

Trong Excel, họ 'nén' chuỗi thành ánh xạ số (mặc dù tôi không chắc rằng nén từ là chính xác trong trường hợp này). Dưới đây là một ví dụ hiển thị dưới đây:

nhập mô tả hình ảnh ở đây

Mặc dù điều này giúp giảm tổng dung lượng tệp và bộ nhớ, nhưng Excel sẽ sắp xếp như thế nào trên trường chuỗi? Mỗi chuỗi đơn sẽ cần phải đi qua ánh xạ tra cứu: và nếu vậy, điều đó sẽ không làm tăng đáng kể chi phí / làm chậm việc thực hiện sắp xếp trên trường chuỗi (nếu có các giá trị 1M, tra cứu khóa 1M sẽ không không đáng kể). Hai câu hỏi về điều này:

  1. Các chuỗi được chia sẻ được sử dụng trong chính ứng dụng Excel hay chỉ khi lưu dữ liệu?
  2. Điều gì sẽ là một thuật toán ví dụ để sắp xếp trên trường sau đó? Bất kỳ ngôn ngữ nào cũng tốt (c, c #, c ++, python).

Tôi cũng sẽ quan tâm đến một câu trả lời am hiểu cho vấn đề này. Tôi chỉ có thể đoán rằng nó có liên quan đến bộ nhớ đệm nhưng có thể dễ dàng sai.
PeterT

Tôi nghĩ rằng thực tế là ánh xạ này tồn tại trong biểu diễn XML vật lý của tài liệu độc lập với cách Excel thể hiện dữ liệu bên trong khi chạy. Tôi tin rằng sẽ hiệu quả hơn về mặt tính toán khi biểu diễn các cột dữ liệu theo cách thô (mặc dù điều này có thể được thực hiện theo nhiều cách).
alxrcs

@alxrcs có bất kỳ tài liệu hoặc sách nào đi vào phần bên trong của Excel, tương tự như cái gì đó như thế này cho SQLServer không? amazon.com/Pro-Server-Iternals-Dmitri-Korotkevitch/dp/ mẹo , hay về cơ bản nó là một hộp đen bên ngoài nhóm ms?
David542

Không chắc chắn, xin lỗi. Bạn có thể tìm thấy trực tuyến một số thông số kỹ thuật cho các định dạng tệp, nhưng tôi không nghĩ chi tiết về nội bộ thời gian chạy Excel rất dễ tìm.
alxrcs

Dù sao, từ câu hỏi thứ hai của bạn, tôi nghi ngờ bạn quan tâm đến lý thuyết hơn là chi tiết cụ thể về Excel, phải không?
alxrcs

Câu trả lời:


0

Tôi không thể tìm thấy chính xác Excel lưu trữ các ô có SharedStringTablecác phần tử trong bộ nhớ như thế nào trong thời gian chạy, nhưng lưu trữ chúng dưới dạng một chỉ mục của mục SharedStringTableyêu cầu chỉ cần thêm một sự bổ sung để truy cập chúng, giả sử rằng các phần tử được lưu trữ dưới dạng một mảng. Vì vậy, dự đoán của tôi là đây là cách nó được thực hiện. Đó là cách đơn giản nhất và cách duy nhất để làm cho nó nhanh hơn là có biểu diễn thời gian chạy của SharedStringTablecác phần tử đã được sắp xếp. Trong trường hợp như vậy, sắp xếp theo một chỉ mục tương đương với sắp xếp theo giá trị. Tuy nhiên, cách tiếp cận đó làm cho thao tác chèn tốn kém vì khi một chuỗi mới được chèn vào giữa bảng, tất cả các chỉ mục lớn hơn nó sẽ được tăng lên và số lượng các ô như vậy trong tài liệu có thể rất lớn, lên đến tất cả các tế bào đề cập đến SharedStringTable.

Nếu các ô chứa các chỉ mục giống như trong tệp, thì đây là cách người ta sắp xếp các ô được biểu thị bằng columnValuevectơ dựa trên các chuỗi mà chúng trỏ đến được lưu trữ trong sharedStringsvectơ (trong C ++ vì bạn nói không có sự khác biệt) với chi phí là 2 thêm hội nghị cho mỗi hoạt động so sánh:

// 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];});

Nó không có trong OP, nhưng SharedStringTablehoạt động tra cứu ngược lại chậm và các phần tử lưu vào bộ từ điển sẽ giúp ích.


0

Bảng chuỗi chia sẻ Microsoft Excel

Bảng chuỗi được chia sẻ là và tiêu chuẩn XML mở, như được định nghĩa theo tiêu chuẩn ISO - ISO / IEC 29500-1: 2016 (E)

Định nghĩa chính thức của chuỗi Chia sẻ (được trích dẫn từ tài liệu ISO)

Bảng chuỗi chia sẻ

Các giá trị chuỗi có thể được lưu trữ trực tiếp bên trong các thành phần ô của bảng tính; tuy nhiên, việc lưu trữ cùng một giá trị bên trong nhiều thành phần ô có thể dẫn đến các phần Bảng tính rất lớn, có thể dẫn đến suy giảm hiệu suất. Bảng chuỗi chia sẻ là danh sách các giá trị chuỗi được lập chỉ mục, được chia sẻ trên sổ làm việc, cho phép triển khai chỉ lưu trữ giá trị một lần.

Có thể tải xuống tiêu chuẩn ISO trên Chuỗi chia sẻ từ

https://stiterias.iso.org/ittf/PubliclyAv AvailableStiterias/c071691_ISO_IEC_29500-1_2016.zip

Trả lời các câu hỏi về chủ đề này

Câu hỏi 1: Các chuỗi được chia sẻ được sử dụng trong chính ứng dụng Excel hay chỉ khi lưu dữ liệu?

Trả lời: Chuỗi dùng chung chỉ được Excel sử dụng tại thời điểm lưu tài liệu, IE, chỉ với mục đích lưu trữ bảng tính dưới dạng tệp trên bộ lưu trữ.

Tuy nhiên, khi tệp được mở để hiển thị, các ô được điền với các giá trị chuỗi thực được kéo từ bảng chuỗi chia sẻ.

-

Câu hỏi 2: Thuật toán ví dụ để sắp xếp trên trường sau đó là gì? Bất kỳ ngôn ngữ nào cũng tốt (c, c #, c ++, python).

Trả lời: Đối với một ứng dụng như Excel, tôi đoán rằng một biến thể độc quyền đặc biệt của Sắp xếp nhanh là thuật toán có khả năng nhất được sử dụng để sắp xếp theo các giá trị chuỗi.

Excel có giới hạn 1.048.576 hàng. Đối với kích thước này, Quick sort chắc chắn là một người chiến thắng. Sắp xếp nhanh có thể tạo ra kết quả rất hiệu quả cho tập dữ liệu có cường độ này.

Đây là liên kết đến việc thực hiện Sắp xếp nhanh trong C ++ để sắp xếp các chuỗi:

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


2
sắp xếp nhanh sẽ là trên chính chuỗi, bạn cần phải hủy đăng ký một con trỏ hoặc thực hiện tra cứu bản đồ hàng triệu lần, phải không? Tôi nghĩ rằng câu trả lời này về cơ bản chỉ là "Có, đó là Chuỗi chia sẻ. Đây là cách thực hiện sắp xếp mà không cần chuỗi chia sẻ".
David542

2
Bảng chuỗi chia sẻ chỉ được sử dụng để lưu trữ nội dung tệp vào đĩa. Tiêu chuẩn ISO không chỉ định cách các ô phải được tạo khi ứng dụng được mở. Nếu các ô được điền với bản sao của giá trị chuỗi được trích xuất từ ​​bảng chuỗi được chia sẻ, thì có thể tránh hội thảo.
Gopinath

1
Tôi hiểu rồi. Vâng, điểm quan tâm chính của tôi ở đây là cách nó được xử lý trong bộ nhớ, bên ngoài khía cạnh đến / từ lưu trữ. Bạn có cái nhìn sâu sắc nào về phần đó không?
David542

Trong sắp xếp excel, người dùng phải chỉ định thứ tự sắp xếp là danh sách các cột (Ví dụ: Sắp xếp theo Cột A, Sau đó theo B, Sau đó theo C, Sau đó theo D). Giả sử rằng cột A chứa các chuỗi trùng lặp. Trong khi sắp xếp, tất cả các hàng có cùng giá trị cho cột A sẽ được sắp xếp theo các giá trị của 'Cột B'. Nếu các ô của B cũng chứa các giá trị trùng lặp, thì việc sắp xếp sẽ được thực hiện trên Cột C ... cho đến khi cột có các giá trị duy nhất được tìm thấy. Nếu không có cột nào có giá trị duy nhất, thì các hàng sẽ bị bỏ qua.
Gopinath
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.