ทบทวนอัลกอริทึม เหตุใด heapsort ถึงอัลกอริทึม insort


15

ฉันไม่เห็นสาเหตุที่ heapsort ถูกพิจารณาเป็นอัลกอริธึม เรียงลำดับแบบ inplace

ฉันหมายถึงโครงสร้างข้อมูลพิเศษที่มีองค์ประกอบของอาร์เรย์ที่เรียงลำดับเช่น heap ใช้เพื่อช่วยในการแยกค่า min และกระบวนการเรียงลำดับ

ดังนั้นฉันอาจเข้าใจผิดนิยามของสถานที่ที่นี่หรือไม่

แต่การเรียงลำดับการแทรกนั้นชัดเจนว่ามันเป็นอัลกอริธึมแบบ inplace นั่นคือไม่จำเป็นต้องมีหน่วยความจำเพิ่มเติมสำหรับองค์ประกอบ

แล้วทำไมมันถึงเข้ามาแทนที่

คำตอบ:


12

ฉันหมายถึงโครงสร้างข้อมูลพิเศษที่มีองค์ประกอบของอาร์เรย์ที่เรียงลำดับเช่น heap ใช้เพื่อช่วยในการแยกค่า min และกระบวนการเรียงลำดับ

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

โอเคในทางเทคนิคอาจเป็นได้ว่าฮีปพอร์ตมักจะอธิบายว่าใช้ฮีปแยกต่างหาก


3
ที่เดียวที่ฉันคาดว่าจะเห็น "heapsort" พร้อม heaport แยกต่างหาก (เป็นรหัส) อยู่ในภาษาที่ใช้งานได้เช่น Haskell ด้วยเหตุผลเดียวกันกับที่การทำงานปกติ "Quicksort" นั้นไม่ได้อยู่ในตำแหน่งเช่นกัน รายการของพวกเขามีจำนวนมากและการเรียงลำดับแบบแทนที่รัฐจะเปลี่ยนสถานะของอาเรย์ / อะไรก็ตามที่มีข้อมูล Scare-quotes เพราะฉันไม่ยอมรับจริง ๆ ว่า quicksort แบบ out-of-place นั้นเป็น quicksort เลยหรือ heaport แบบ out-of-place นั้นเป็น heapsort เลย - อย่างน้อยก็ไม่ชัดเจนโดยไม่บอกว่ามันไม่ใช่ in- สถานที่.
Steve314

1
@ Steve314 ฉันคิดว่าฉันได้เห็นสื่อการสอนบางอย่างซึ่งพูดอะไรบางอย่างเกี่ยวกับผลกระทบของ "วางไว้ในกองแล้วดึงองค์ประกอบออกทีละครั้งและวางไว้ในอาร์เรย์" แต่เมื่อตรวจสอบCLRแล้วฉันสามารถรายงานได้ว่าพวกเขาแสดงเวอร์ชันแบบแทนที่
Peter Taylor

2
@PeterTaylor: ใช่หนังสือที่ฉันรีวิว (Skiena) นำเสนอ heapsort โดยการสร้าง heaport เพิ่มเติม
user10326

4

คุณอาจขาดความเข้าใจพื้นฐานที่อาร์เรย์สามารถใช้เพื่อระบุเค้าโครงของต้นไม้

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

Parent(i) = floor(i/2)
Left child(i) = 2i
Right child(i) = 2i + 1

ดู:

http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/Sorting/heapSort.htm

เนื่องจากฮีปสามารถเก็บและจัดระเบียบทั้งหมดในอาเรย์ได้ดังนั้นฮีปพอร์ตสามารถเรียกใช้ในสถานที่โดยการย้ายองค์ประกอบไปรอบ ๆ ภายในอาเรย์อินพุต แน่นอนฮีปนั้นถูกสร้างและจัดการโดยใช้อาร์เรย์อินพุตดั้งเดิม


: ฉันรู้เกี่ยวกับเรื่องนี้ปัญหาดูเหมือนว่าหนังสือที่ฉันกำลังอ่านนำเสนอ heapsort โดยใช้ heaport แยกฉันไม่เข้าใจหรือคิดว่างานนำเสนอนี้เพื่อให้ง่ายต่อการเข้าใจอัลกอริทึม (อาจไม่แน่ใจว่าทำไมมันถึงเป็น นำเสนอเช่นนั้น)
user10326

ฉันขอแนะนำให้คุณซื้อหนังสือ "Introduction to Algorithms" โดย Cormen และคณะ ชัดเจนตอบคำถามที่เกี่ยวข้องกับอัลกอริทึมทั้งหมด หากคุณจริงจังกับอาชีพในฐานะนักวิทยาศาสตร์คอมพิวเตอร์หรือวิศวกรซอฟต์แวร์คุณต้องมีหนังสือเล่มนี้
stackoverflowuser2010

1

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

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


โดยทั่วไปมีอัลกอริทึม "heapify" ซึ่งใช้เพื่อจัดเรียงข้อมูลในอาร์เรย์อีกครั้งเพื่อให้สอดคล้องกับกฎของฮีปในเวลา IIRC O (n) ดู pseudocode ในprogrammers.stackexchange.com/questions/116904/... หลังจากนั้นส่วนใหญ่เป็นเรื่องของการทำสารสกัดจากรากฮีปที่มีอยู่หลายครั้งและติดตามว่าอาร์เรย์ยังคงเป็น "ฮีป" มากน้อยเพียงใดและจะเรียงลำดับผลลัพธ์สุดท้ายเท่าใด
Steve314

0

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

Wikipedia - อัลกอริทึมแบบแทนที่


แล้วทำไมการรวมกันถือว่าเป็นอัลกอริธึมที่ไม่เข้าแทนที่?
user10326

3
นี่ไม่ใช่คำตอบที่มีประโยชน์ มันไม่มีส่วนเกี่ยวข้องกับ heapsort และไม่ตอบคำถาม
stackoverflowuser2010

แน่นอนว่ามันมีบางอย่างที่เกี่ยวข้องกับ heapsort Heapsort เป็นอัลกอริธึมการเรียงลำดับแบบแทนที่ตามที่ควรจะชัดเจนจากคำจำกัดความ ในความเป็นจริงมันถูกเชื่อมโยงจากหน้าฮีปพอร์ต
Rein Henrichs

0

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

วิธีที่ดีที่สุดในการแสดงให้เห็นถึงความแตกต่างระหว่างอัลกอริธึมในสถานที่และอัลกอริธึมนอกสถานที่น่าจะดูที่รหัสการกลับตัวของสตริง C / C ++ ต่อไปนี้ซึ่งทำหน้าที่แทน (จาก K&R):

void reverse(char s[])
{
      int c, i, j;

      for (i = 0, j = strlen(s)-1; i < j; i++, j--) {
         c = s[i];
         s[i] = s[j];
         s[j] = c;
      }
}

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


1
mergesort ถูกสาปรำคาญ - มันง่ายที่จะผิดโน้มน้าวตัวเองว่าคุณมีกลยุทธ์ในสถานที่ โดยปกติจะใช้งานได้กับอาร์เรย์ขนาดเล็กเท่านั้น แต่ผมคิดว่าผมดาวน์โหลดกระดาษครั้งที่มีคนทำผลงานออกมาเป็นตัวแปรในสถานที่ของขั้นตอนวิธีการผสานการจัดเรียง ฉันจะดูว่าฉันสามารถค้นหาได้อีกครั้ง
Steve314
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.