จัดเรียงอัลกอริทึมสำหรับ Excel / SharedStrings


10

ใน Excel พวกเขา 'บีบอัด' สตริงการแมปเป็นตัวเลข (แม้ว่าฉันไม่แน่ใจว่าคำว่าการบีบอัดถูกต้องในกรณีนี้) นี่คือตัวอย่างที่แสดงด้านล่าง:

ป้อนคำอธิบายรูปภาพที่นี่

ในขณะที่สิ่งนี้ช่วยลดขนาดไฟล์และรอยเท้าหน่วยความจำโดยรวมแล้ว Excel จะเรียงลำดับอย่างไรในเขตข้อมูลสตริง ทุกสตริงเดียวจะต้องผ่านการค้นหาการแมป: และถ้าเป็นเช่นนั้นจะไม่เพิ่มค่าใช้จ่าย / ชะลอการทำเรียงลำดับในเขตข้อมูลสตริง (ถ้ามีค่า 1M, การค้นหาคีย์ 1M จะไม่ จิ๊บจ๊อย) คำถามสองข้อเกี่ยวกับเรื่องนี้:

  1. มีการใช้สตริงที่ใช้ร่วมกันภายในแอปพลิเคชัน Excel หรือเมื่อบันทึกข้อมูลเท่านั้น
  2. อะไรจะเป็นตัวอย่างอัลกอริธึมที่จะเรียงลำดับบนสนาม ภาษาใดก็ได้ (c, c #, c ++, python)

ฉันจะสนใจคำตอบที่มีความรู้เช่นนี้เช่นกัน ฉันสามารถเดาได้ว่ามีบางอย่างเกี่ยวกับการแคชหน่วยความจำ แต่อาจผิดได้ง่าย
PeterT

ฉันคิดว่าข้อเท็จจริงที่ว่าการทำแผนที่นี้มีอยู่ในการแสดง XML ทางกายภาพของเอกสารมีความเป็นอิสระในการที่ Excel จะแสดงข้อมูลภายในที่รันไทม์ ฉันเชื่อว่ามันมีประสิทธิภาพในการคำนวณมากกว่าการแสดงคอลัมน์ของข้อมูลในลักษณะดิบ (แม้ว่าอาจจะทำได้หลายวิธี)
alxrcs

@alxrcs มีเอกสารหรือหนังสือใดบ้างที่เข้าสู่ internals ของ Excel ซึ่งคล้ายกับสิ่งนี้สำหรับ SQLServer amazon.com/Pro-Server-Internals-Dmitri-Korotkevitch/dp/ ......หรือว่าเป็นกล่องดำด้านนอกทีม ms?
David542

ไม่แน่ใจขอโทษ คุณสามารถค้นหาข้อมูลจำเพาะบางอย่างทางออนไลน์สำหรับรูปแบบไฟล์ได้ แต่ฉันไม่คิดว่ารายละเอียดของ Excel runtime internals นั้นหาง่าย
alxrcs

อย่างไรก็ตามจากคำถามที่สองของคุณฉันสงสัยว่าคุณสนใจทฤษฎีมากกว่าในรายละเอียดของ Excel ใช่ไหม?
alxrcs

คำตอบ:


0

ฉันไม่สามารถค้นหาวิธีที่ Excel เก็บเซลล์ไว้อย่างแน่นอนด้วยSharedStringTableองค์ประกอบในหน่วยความจำขณะใช้งานจริง แต่การจัดเก็บพวกเขาเป็นดัชนีของรายการSharedStringTableต้องใช้ความสนใจพิเศษเพียงครั้งเดียวในการเข้าถึงพวกเขาโดยสมมติว่าองค์ประกอบนั้นถูกเก็บเป็นอาร์เรย์ ดังนั้นฉันเดาว่านี่เป็นวิธีที่ทำ นั่นคือวิธีที่ง่ายที่สุดและวิธีเดียวที่จะทำให้เร็วขึ้นคือการมีการแสดงแบบรันไทม์ของSharedStringTableองค์ประกอบที่เรียงลำดับแล้ว ในกรณีเช่นนี้การเรียงลำดับโดยดัชนีนั้นเทียบเท่ากับการเรียงลำดับตามค่า อย่างไรก็ตามวิธีการดังกล่าวทำให้การดำเนินการแทรกมีค่าใช้จ่ายสูงเมื่อสตริงใหม่ถูกแทรกลงในกลางตารางดัชนีทั้งหมดที่มีขนาดใหญ่กว่าที่ควรจะเพิ่มขึ้นและจำนวนของเซลล์ดังกล่าวในเอกสารอาจมีขนาดใหญ่มากจนถึงทั้งหมด SharedStringTableเซลล์หมายถึง

หากเซลล์มีดัชนีเหมือนกับในไฟล์นี่คือวิธีที่จะเรียงลำดับเซลล์ที่มีcolumnValueเวกเตอร์แสดงตามสตริงที่ชี้ไปที่เก็บไว้ในsharedStringsเวกเตอร์ (ใน C ++ เนื่องจากคุณบอกว่าไม่มีความแตกต่าง) ในราคา 2 ความพิเศษพิเศษต่อการเปรียบเทียบ:

// 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

ตารางสตริงที่แชร์คือและมาตรฐาน Open XML ตามที่กำหนดโดยมาตรฐาน ISO - ISO / IEC 29500-1: 2016 (E)

คำจำกัดความที่เป็นทางการของสตริงที่แชร์ (อ้างจากเอกสาร ISO)

ตารางสตริงที่ใช้ร่วมกัน

ค่าสตริงอาจถูกจัดเก็บโดยตรงภายในองค์ประกอบของเซลล์สเปรดชีต อย่างไรก็ตามการจัดเก็บค่าเดียวกันภายในองค์ประกอบหลายเซลล์อาจส่งผลให้ชิ้นส่วนของแผ่นงานมีขนาดใหญ่มากซึ่งอาจส่งผลให้ประสิทธิภาพลดลง ตารางสตริงที่ใช้ร่วมกันคือรายการดัชนีที่มีการจัดทำดัชนีของค่าสตริงซึ่งแบ่งใช้ทั่วทั้งเวิร์กบุ๊กซึ่งช่วยให้การนำไปใช้เพื่อจัดเก็บค่าเพียงครั้งเดียว

สามารถดาวน์โหลดมาตรฐาน ISO มาตรฐานของสตริงที่แชร์ได้

https://standards.iso.org/ittf/PubliclyAvailableStandards/c071691_ISO_IEC_29500-1_2016.zip

ตอบคำถามในหัวข้อนี้

คำถามที่ 1: มีการ ใช้สตริงที่ใช้ร่วมกันภายในแอปพลิเคชัน Excel หรือเมื่อบันทึกข้อมูลเท่านั้น

คำตอบ: Excel จะใช้สตริงที่ใช้ร่วมกันในขณะที่บันทึกเอกสาร IE เท่านั้นเพื่อจุดประสงค์ในการจัดเก็บสเปรดชีตเป็นไฟล์ในที่เก็บข้อมูล

อย่างไรก็ตามเมื่อไฟล์ถูกเปิดเพื่อแสดงผลเซลล์จะถูกเติมด้วยค่าสตริงจริงที่ดึงมาจากตารางสตริงที่แชร์

-

คำถามที่ 2:ตัวอย่างอัลกอริธึมที่จะเรียงลำดับบนฟิลด์นั้นคืออะไร? ภาษาใดก็ได้ (c, c #, c ++, python)

คำตอบ: สำหรับแอปพลิเคชันเช่น Excel ฉันคิดว่ารูปแบบพิเศษที่เป็นเอกสิทธิ์ของการ จัดเรียงด่วนเป็นอัลกอริทึมที่น่าจะใช้ในการเรียงลำดับตามค่าสตริง

Excel มีขีด จำกัด 1,048,576 แถว สำหรับขนาดนี้การจัดเรียงอย่างรวดเร็วเป็นผู้ชนะแน่นอน การเรียงลำดับแบบด่วนสามารถสร้างผลลัพธ์ที่มีประสิทธิภาพมากสำหรับชุดข้อมูลของขนาดนี้

นี่คือลิงค์สำหรับการนำไปใช้ของ Quick Sort ใน C ++ สำหรับการเรียงสตริง:

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


2
การจัดเรียงอย่างรวดเร็วจะอยู่ในสตริงของตัวเองคุณจะต้องยกเลิกการอ้างถึงตัวชี้หรือทำการค้นหาแผนที่เป็นล้านครั้ง ฉันคิดว่าคำตอบนี้เป็นเพียงการพูดว่า "ใช่มันใช้ร่วมกัน Strings นี่คือวิธีการจัดเรียงโดยไม่ต้องสตริงที่ใช้ร่วมกัน"
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.