อัลกอริทึมการเรียงลำดับกรณีพิเศษที่ดีคืออะไร


13

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

  • 1 2 3
  • 4 6 7
  • 5 8 9

ฉันสามารถปรับปรุงการเรียงลำดับที่ไร้เดียงสาเพื่อเรียงลำดับชุดข้อมูลทั้งหมดเป็นเส้นตรง (วัดจากการเปรียบเทียบ) หรือไม่

แล้วชุดข้อมูลชุดใด ชุดข้อมูล จำกัด โดยพลการพร้อมชุดย่อยของการเปรียบเทียบทราบหรือไม่?


1
คุณสามารถถามคำถามที่แม่นยำกว่านี้ได้ไหม? ย่อหน้าแรกของคุณสามารถอ่านได้เพื่อบ่งบอกว่าข้อมูลของคุณเรียงลำดับแล้ว! อะไรคืออินพุตของคุณและสิ่งที่คุณต้องการออก?
Jacques Carette

1
ใช่ภาษานั้นค่อนข้างสับสน ฉันใช้เวลาสักครู่ในการตระหนักว่าชุดข้อมูลประกอบด้วยตัวเลข n ที่จะเรียงลำดับ แต่ตัวเลขเหล่านี้ถูกจัดเรียงในตาราง sqrt (n) x sqrt (n) ตารางซึ่งแต่ละแถวและแต่ละคอลัมน์เรียงลำดับแล้ว นั่นคือสิ่งที่คุณหมายถึงอะไร

ใช่นั่นคือสิ่งที่ฉันหมายถึง ฉันจะแก้ไขเพื่อความชัดเจน
Zachary Vance

คำตอบ:


19

เป็นเรื่องง่ายที่จะพิสูจน์ขอบเขตล่างΩ (n 2 log n) ในปัญหานี้ (ในรูปแบบการเรียงลำดับการเปรียบเทียบ): หากองค์ประกอบที่ตำแหน่ง (i, j) อยู่ในระยะ 1/2 ของ i + j เสมอดังนั้นกริด เส้นทแยงมุมเป็นอิสระจากกันและเรียงลำดับภายในแต่ละเส้นทแยงมุมตารางโดยพลการ ดังนั้นภายใต้ข้อ จำกัด นี้จำนวนรวมของการสั่งซื้อที่เป็นไปได้คือผลิตภัณฑ์ (เหนือเส้นทแยงมุมทั้งหมดของกริด) ของแฟคทอเรียลของความยาวของเส้นทแยงมุมซึ่งเป็นเลขชี้กำลังใน n 2 log n

ซึ่งก็คือการบอกว่าอัลกอริธึมการเรียงลำดับการเปรียบเทียบแบบมาตรฐานนั้นเหมาะที่สุดสำหรับการจัดเรียงแบบกริดตามที่คุณอธิบาย


คำตอบอื่นให้อัลกอริทึมชัดเจนกับความซับซ้อนนี้ดังนั้นฉันจะพิจารณาปัญหานี้แก้ไขสำหรับกริด 2 มิติและโดยไม่ต้องตรวจสอบจริงอาจเป็นกริดมิติโดยพลการ
Zachary Vance

4

ถ้าฉันเข้าใจปัญหาได้อย่างถูกต้อง (และฉันอาจไม่รู้สึกฟรีที่จะบอกฉันว่าฉันทำไม่ได้) คุณต้องการแปลงตาราง 2D เป็นอาร์เรย์เรียงลำดับ 1D ในขณะที่แต่ละแถวและคอลัมน์เรียงลำดับแล้วในตาราง 2D

องค์ประกอบแรกในรายการในกรณีนี้จะต้องเป็นมุมบนซ้าย ((0,0) ตามคำนิยามของปัญหา) หลังจากนี้จะต้องเป็นองค์ประกอบ (1,0) หรือ (0,1) ตามที่คนอื่น ๆ ทั้งหมดจะมีขนาดใหญ่กว่าเหล่านี้ตามคำนิยาม

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

คุณสามารถรักษาผู้สมัครที่เป็นไปได้ตามลำดับขณะที่คุณพบพวกเขา (ไม่เกินสองคนจะถูกทำให้พร้อมใช้งานในการทำซ้ำครั้งเดียว) และในการทำซ้ำแต่ละครั้งให้ตรวจสอบค่าใหม่ที่มีให้ (ถ้ามี) หากพวกเขาต่ำกว่าต่ำสุดของผู้สมัครก่อนหน้าเพิ่มพวกเขาในรายการทันทีและทำซ้ำมิฉะนั้นเพิ่มผู้สมัครที่ต่ำสุดก่อนหน้านี้และเปรียบเทียบกับต่ำสุดถัดไป ฯลฯ

น่าเสียดายที่ฉันไม่ได้อ้างว่าสามารถให้ความซับซ้อนที่แน่นอนกับสิ่งนี้ได้หรือฉันไม่อ้างว่ามันมีประสิทธิภาพมากที่สุดเท่าที่จะเป็นไปได้ แต่ดูเหมือนว่าจะดีกว่าวิธีการที่ไร้เดียงสาและฉันหวังว่าฉันจะอธิบายให้ดีพอ

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


ในระยะสั้นคุณสามารถทำ sqrt (N) -way merge ได้เหมือนการรวมกิจการหรือไม่ นั่นเป็นวิธีการทำงานที่ดีที่สุดของฉัน แต่กลายเป็น O (N log N) - ฉันไม่มีค่าคงที่แน่นอน แต่มี 0.5 สำหรับบันทึก (sqrt (N)) อย่างน้อย
Zachary Vance
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.