การค้นหาสี่เหลี่ยมผืนผ้าใหญ่ที่สุด: อธิบายปัญหาสี่เหลี่ยมผืนผ้าสูงสุด

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

คำอธิบายของปัญหา

ลองจินตนาการถึงกริดที่แทนที่หน้าจอ โดยที่:

  • พื้นที่ที่เต็มไปนั้นใช้ตัวอักษร '#' แสดง
  • พื้นที่ว่างแสดงโดยจุด '.'

จากการแทนที่ดังกล่าว ภารกิจคือการระบุสี่เหลี่ยมผืนผ้าที่ใหญ่ที่สุดซึ่งประกอบขึ้นจาก '.' ทั้งหมดในพื้นที่เต็มข้างต้น ตัวอย่างของกริดอาจมีลักษณะเป็นดังนี้:

....................
..............######
##..................
.................###
.................###
#####...............
#####............... 
#####...............

ตามที่คุณเห็น เป้าหมายคือการคำนวณพื้นที่ของพื้นที่ว่างที่ต่อเนื่องกันมากที่สุดในพื้นที่ที่เต็มไปด้วยข้อมูล

การเข้าใจวิธีแก้ปัญหา

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

1. การแทนค่าของแถวเป็นฮิสโตแกรม

สำหรับแต่ละแถวในกริด เราสามารถคำนวณอาเรย์ความสูงที่แสดงถึงความสูงของสี่เหลี่ยมว่างที่ต่อเนื่องกันซึ่งสิ้นสุดที่แถวดังกล่าว โดยหลักการคือ:

  • หากองค์ประกอบในกริดคือ '.' ให้เพิ่มความสูงจากแถวด้านบน
  • หากมันเป็น '#' ให้รีเซ็ตความสูงกลับเป็นศูนย์

2. การคำนวณพื้นที่สี่เหลี่ยมผืนผ้าสำหรับแต่ละแถว

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

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

3. ภาพรวมของการดำเนินการ

เพื่อดำเนินการอัลกอริธึมอย่างมีประสิทธิภาพ โปรดทำตามขั้นตอนเหล่านี้:

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

ตัวอย่างโค้ด

นี่คือตัวอย่างโค้ด Python ที่เรียบง่ายเพื่อแสดงกระบวนการนี้:

def maximalRectangle(matrix):
    if not matrix:
        return 0

    height = [0] * len(matrix[0])
    max_area = 0

    for row in matrix:
        for i in range(len(row)):
            height[i] = height[i] + 1 if row[i] == '.' else 0
        max_area = max(max_area, largestRectangleArea(height))
    return max_area

def largestRectangleArea(heights):
    stack = []
    max_area = 0
    heights.append(0)  # Sentinel

    for i, h in enumerate(heights):
        while stack and heights[stack[-1]] > h:
            height = heights[stack.pop()]
            width = i if not stack else i - stack[-1] - 1
            max_area = max(max_area, height * width)
        stack.append(i)
    return max_area

บทสรุป

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

สำหรับการอ่านเพิ่มเติมและข้อมูลเชิงลึก โปรดพิจารณาบทความที่ละเอียดจาก Dr. Dobb’s Journal ที่กล่าวถึงโดย @lassevk ซึ่งสามารถดูได้ที่ นี่ ด้วยความรู้เกี่ยวกับอัลกอริธึมนี้ คุณสามารถแก้ไขปัญหาที่คล้ายกันที่เกิดขึ้นในโครงการของคุณได้อย่างมั่นใจ

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